topt.feedback = ParseVariableBool(value);
} else {
- psql_error("\\pset: allowed sqlerror_handle are continue, exit\n");
- return false;
+ popt->topt.feedback = !popt->topt.feedback;
}
if (!quiet) {
- if (sqlErrHandle == SQLERROR_HANDLE_CONTINUE) {
- printf(_("Whenever Error behavior is continue.\n"));
+ if (popt->topt.feedback) {
+ puts(_("Showing rows count feedback."));
} else {
- printf(_("Whenever Error behavior is exit.\n"));
+ puts(_("Rows count feedback is off."));
}
}
return true;
}
-static bool setBorder(const char* value, printQueryOpt* popt, bool quiet)
-{
- if (NULL != value)
- popt->topt.border = atoi(value);
-
- if (!quiet)
- printf(_("Border style is %d.\n"), popt->topt.border);
-
- return true;
-}
-
bool do_pset(const char* param, const char* value, printQueryOpt* popt, bool quiet)
{
size_t vallen = 0;
@@ -2289,9 +2277,9 @@ bool do_pset(const char* param, const char* value, printQueryOpt* popt, bool qui
}
}
- // set Sql Error Handle
- else if (strcmp(param, "sqlerror_handle") == 0) {
- if (!setSqlErrorHandle(value, vallen, quiet)) {
+ /* set feedback rows */
+ else if (strcmp(param, "feedback") == 0) {
+ if(!setFeedBack(value, popt, quiet)) {
return false;
}
}
@@ -2317,9 +2305,11 @@ bool do_pset(const char* param, const char* value, printQueryOpt* popt, bool qui
/* set border style/width */
else if (strcmp(param, "border") == 0) {
- if(!setBorder(value, popt, quiet)) {
- return false;
- }
+ if (NULL != value)
+ popt->topt.border = atoi(value);
+
+ if (!quiet)
+ printf(_("Border style is %d.\n"), popt->topt.border);
}
/* set expanded/vertical mode */
@@ -2729,6 +2719,7 @@ static void minimal_error_message(PGresult* res)
destroyPQExpBuffer(msg);
}
+#ifndef ENABLE_LITE_MODE
/* Show notice message when the password expired time will come. */
static void show_password_notify(PGconn* conn)
{
@@ -2793,8 +2784,11 @@ static void show_password_notify(PGconn* conn)
PQclear(res1);
PQclear(res2);
+ free((void *)date1);
+ free((void *)date2);
return;
}
+#endif
extern void client_server_version_check(PGconn* conn)
{
diff --git a/src/bin/psql/command.h b/src/bin/psql/command.h
index 479c1603a..8c4e168a7 100644
--- a/src/bin/psql/command.h
+++ b/src/bin/psql/command.h
@@ -21,13 +21,6 @@ typedef enum _backslashResult {
* resulted in an error */
} backslashResult;
-typedef enum SqlErrorHandle {
- SQLERROR_HANDLE_CONTINUE = 0,
- SQLERROR_HANDLE_EXIT
-} SqlErrorHandle;
-
-extern SqlErrorHandle sqlErrHandle;
-
extern backslashResult HandleSlashCmds(PsqlScanState scan_state, PQExpBuffer query_buf);
extern int process_file(char* filename, bool single_txn, bool use_relative_path);
diff --git a/src/bin/psql/common.cpp b/src/bin/psql/common.cpp
index 798093380..88a01d751 100644
--- a/src/bin/psql/common.cpp
+++ b/src/bin/psql/common.cpp
@@ -2268,10 +2268,8 @@ static bool do_one_parallel(char* query, int fd)
if (decode_pwd != NULL) {
rc = memset_s(decode_pwd, strlen(decode_pwd), 0, strlen(decode_pwd));
securec_check_c(rc, "\0", "\0");
- if (decode_pwd != NULL) {
- OPENSSL_free(decode_pwd);
- decode_pwd = NULL;
- }
+ OPENSSL_free(decode_pwd);
+ decode_pwd = NULL;
// Revert the old value for next retry connection.
pset.connInfo.values[3] = old_conninfo_values;
diff --git a/src/bin/psql/copy.cpp b/src/bin/psql/copy.cpp
index d21398331..881660e6d 100644
--- a/src/bin/psql/copy.cpp
+++ b/src/bin/psql/copy.cpp
@@ -226,7 +226,7 @@ static bool ParseParallelOption(struct copy_options* result, char** errToken)
xstrcat(&result->after_tofrom, token);
token = strtokx(nullptr, whitespace, ",()", NULL, 0, false, false, pset.encoding);
- if (pg_strcasecmp(token, "true") == 0) {
+ if (pg_strcasecmp(token, "true") == 0 || pg_strcasecmp(token, "on") == 0) {
result->hasHeader = true;
xstrcat(&result->after_tofrom, " false");
} else {
diff --git a/src/bin/psql/describe.cpp b/src/bin/psql/describe.cpp
index 6a0045412..929735c0d 100644
--- a/src/bin/psql/describe.cpp
+++ b/src/bin/psql/describe.cpp
@@ -804,8 +804,8 @@ bool permissionsList(const char* pattern)
"c.relname",
NULL,
"n.nspname !~ '^pg_'"
- " AND c.relname not like 'matviewmap_%%'"
- " AND c.relname not like 'mlog_%%'"
+ " AND c.relname not like 'matviewmap\\_%%'"
+ " AND c.relname not like 'mlog\\_%%'"
" AND pg_catalog.pg_table_is_visible(c.oid)");
appendPQExpBuffer(&buf, "ORDER BY 1, 2;");
@@ -1323,6 +1323,36 @@ static bool describeOneTableDetails(const char* schemaname, const char* relation
initPQExpBuffer(&tmp_part_buf);
initPQExpBuffer(&fullEncryptBuffer);
+#ifndef ENABLE_MULTIPLE_NODES
+ /*
+ * In describeOneTableDetails(), PQfnumber() is matched according to the lowercase column name.
+ * However, when uppercase_attribute_name is on, the column names in the result set will be converted to uppercase.
+ * So we need to turn off it temporarily, and turn on it at the end.
+ */
+ bool uppercaseIsOn = false;
+ printfPQExpBuffer(&buf, "show uppercase_attribute_name;");
+ res = PSQLexec(buf.data, false);
+ if (NULL == res) {
+ goto error_return;
+ }
+
+ uppercaseIsOn = strcmp(PQgetvalue(res, 0, 0), "on") == 0;
+
+ PQclear(res);
+ res = NULL;
+
+ if (unlikely(uppercaseIsOn)) {
+ printfPQExpBuffer(&buf, "set uppercase_attribute_name=off;");
+ res = PSQLexec(buf.data, false);
+ if (NULL == res) {
+ goto error_return;
+ }
+
+ PQclear(res);
+ res = NULL;
+ }
+#endif
+
/* Get general table info */
if (pset.sversion >= 90100) {
printfPQExpBuffer(&buf,
@@ -2915,6 +2945,16 @@ static bool describeOneTableDetails(const char* schemaname, const char* relation
error_return:
+#ifndef ENABLE_MULTIPLE_NODES
+ /*
+ * If uppercase_attribute_name was originally on, restore it.
+ */
+ if (unlikely(uppercaseIsOn)) {
+ printfPQExpBuffer(&buf, "set uppercase_attribute_name=on;");
+ res = PSQLexec(buf.data, false);
+ }
+#endif
+
/* clean up */
if (printTableInitialized) {
printTableCleanup(&cont);
@@ -3424,8 +3464,8 @@ bool listTables(const char* tabtypes, const char* pattern, bool verbose, bool sh
*/
appendPQExpBuffer(&buf, " AND n.nspname !~ '^pg_toast'\n");
- appendPQExpBuffer(&buf, " AND c.relname not like 'matviewmap_%%'\n");
- appendPQExpBuffer(&buf, " AND c.relname not like 'mlog_%%'\n");
+ appendPQExpBuffer(&buf, " AND c.relname not like 'matviewmap\\_%%'\n");
+ appendPQExpBuffer(&buf, " AND c.relname not like 'mlog\\_%%'\n");
(void)processSQLNamePattern(
pset.db, &buf, pattern, true, false, "n.nspname", "c.relname", NULL, "pg_catalog.pg_table_is_visible(c.oid)");
diff --git a/src/bin/psql/help.cpp b/src/bin/psql/help.cpp
index 619a67c65..375d4cde0 100644
--- a/src/bin/psql/help.cpp
+++ b/src/bin/psql/help.cpp
@@ -277,6 +277,7 @@ void slashUsage(unsigned short int pager)
fprintf(output, _(" \\di[S+] [PATTERN] list indexes\n"));
fprintf(output, _(" \\dl list large objects, same as \\lo_list\n"));
fprintf(output, _(" \\dL[S+] [PATTERN] list procedural languages\n"));
+ fprintf(output, _(" \\dm[S+] [PATTERN] list materialized views\n"));
fprintf(output, _(" \\dn[S+] [PATTERN] list schemas\n"));
fprintf(output, _(" \\do[S] [PATTERN] list operators\n"));
fprintf(output, _(" \\dO[S+] [PATTERN] list collations\n"));
@@ -304,8 +305,8 @@ void slashUsage(unsigned short int pager)
fprintf(output,
_(" \\pset NAME [VALUE] set table output option\n"
" (NAME := {format|border|expanded|fieldsep|fieldsep_zero|footer|null|\n"
- " numericlocale|recordsep|recordsep_zero|tuples_only|title|tableattr|pager"
- "|sqlerror_handle})\n"));
+ " numericlocale|recordsep|recordsep_zero|tuples_only|title|tableattr|pager|\n"
+ " feedback})\n"));
fprintf(output, _(" \\t [on|off] show only rows (currently %s)\n"), ON(pset.popt.topt.tuples_only));
fprintf(output, _(" \\T [STRING] set HTML tag attributes, or unset if none\n"));
fprintf(output,
diff --git a/src/bin/psql/input.cpp b/src/bin/psql/input.cpp
index 5e4f5eded..8ed2f1d56 100644
--- a/src/bin/psql/input.cpp
+++ b/src/bin/psql/input.cpp
@@ -301,14 +301,9 @@ void setHistSize(const char* targetName, const char* targetValue, bool setToDefa
void initializeInput(int flags)
{
#ifdef USE_READLINE
-
-#ifndef ENABLE_MULTIPLE_NODES
flags &= useReadline;
-#endif
if (flags & 1) {
- useReadline = true;
-
/* these two things must be done in this order: */
initialize_readline();
rl_variable_bind ("enable-meta-key", "off");
diff --git a/src/bin/psql/mainloop.cpp b/src/bin/psql/mainloop.cpp
index 527ae9772..172167085 100644
--- a/src/bin/psql/mainloop.cpp
+++ b/src/bin/psql/mainloop.cpp
@@ -154,7 +154,9 @@ int MainLoop(FILE* source, char* querystring)
if (pset.cur_cmd_interactive) {
const char* val = GetVariable(pset.vars, "HISTSIZE");
- setHistSize("HISTSIZE", val, val == NULL);
+ if (val != NULL) {
+ setHistSize("HISTSIZE", val, false);
+ }
}
/* Create working state */
@@ -364,15 +366,10 @@ int MainLoop(FILE* source, char* querystring)
}
#endif
success = SendQuery(query_buf->data);
- bool is_handle_error = !success && (sqlErrHandle == SQLERROR_HANDLE_EXIT);
- if (is_handle_error) {
- exit(EXIT_FAILURE);
- }
// Query fail, if need retry, invoke QueryRetryController().
//
- bool is_retry_on = !success && pset.retry_on;
- if (is_retry_on) {
+ if (!success && pset.retry_on) {
success = QueryRetryController(query_buf->data);
}
} else {
diff --git a/src/bin/psql/print.cpp b/src/bin/psql/print.cpp
index 44a5f3a6d..d17471e86 100644
--- a/src/bin/psql/print.cpp
+++ b/src/bin/psql/print.cpp
@@ -335,7 +335,7 @@ static void print_unaligned_text(const printTableContent* cont, FILE* fout)
if (cont->opt->stop_table) {
printTableFooter* footers = footers_with_default(cont);
- if (!opt_tuples_only && footers != NULL && !cancel_pressed) {
+ if (!opt_tuples_only && footers != NULL && !cancel_pressed && cont->opt->feedback) {
printTableFooter* f = NULL;
for (f = footers; f != NULL; f = f->next) {
@@ -408,7 +408,7 @@ static void print_unaligned_vertical(const printTableContent* cont, FILE* fout)
if (cont->opt->stop_table) {
/* print footers */
- if (!opt_tuples_only && cont->footers != NULL && !cancel_pressed) {
+ if (!opt_tuples_only && cont->footers != NULL && !cancel_pressed && cont->opt->feedback) {
printTableFooter* f = NULL;
print_separator(cont->opt->recordSep, fout);
@@ -968,7 +968,7 @@ static void print_aligned_text(const printTableContent* cont, FILE* fout)
_print_horizontal_line(col_count, width_wrap, opt_border, PRINT_RULE_BOTTOM, format, fout);
/* print footers */
- if ((footers != NULL) && !opt_tuples_only && !cancel_pressed) {
+ if ((footers != NULL) && !opt_tuples_only && !cancel_pressed && cont->opt->feedback) {
printTableFooter* f = NULL;
for (f = footers; f != NULL; f = f->next)
@@ -1229,7 +1229,7 @@ static void print_aligned_vertical(const printTableContent* cont, FILE* fout)
print_aligned_vertical_line(cont, 0, hwidth, dwidth, PRINT_RULE_BOTTOM, fout);
/* print footers */
- if (!opt_tuples_only && cont->footers != NULL && !cancel_pressed) {
+ if (!opt_tuples_only && cont->footers != NULL && !cancel_pressed && cont->opt->feedback) {
printTableFooter* f = NULL;
if (opt_border < 2)
@@ -1362,7 +1362,7 @@ static void print_html_text(const printTableContent* cont, FILE* fout)
fputs("
\n", fout);
/* print footers */
- if (!opt_tuples_only && footers != NULL && !cancel_pressed) {
+ if (!opt_tuples_only && footers != NULL && !cancel_pressed && cont->opt->feedback) {
printTableFooter* f = NULL;
fputs("", fout);
@@ -1434,7 +1434,7 @@ static void print_html_vertical(const printTableContent* cont, FILE* fout)
fputs("\n", fout);
/* print footers */
- if (!opt_tuples_only && cont->footers != NULL && !cancel_pressed) {
+ if (!opt_tuples_only && cont->footers != NULL && !cancel_pressed && cont->opt->feedback) {
printTableFooter* f = NULL;
fputs("
", fout);
@@ -1565,7 +1565,7 @@ static void print_latex_text(const printTableContent* cont, FILE* fout)
fputs("\\end{tabular}\n\n\\noindent ", fout);
/* print footers */
- if ((footers != NULL) && !opt_tuples_only && !cancel_pressed) {
+ if ((footers != NULL) && !opt_tuples_only && !cancel_pressed && cont->opt->feedback) {
printTableFooter* f = NULL;
for (f = footers; f != NULL; f = f->next) {
@@ -1643,7 +1643,7 @@ static void print_latex_vertical(const printTableContent* cont, FILE* fout)
fputs("\\end{tabular}\n\n\\noindent ", fout);
/* print footers */
- if ((cont->footers != NULL) && !opt_tuples_only && !cancel_pressed) {
+ if ((cont->footers != NULL) && !opt_tuples_only && !cancel_pressed && cont->opt->feedback) {
printTableFooter* f = NULL;
for (f = cont->footers; f != NULL; f = f->next) {
@@ -1742,7 +1742,7 @@ static void print_troff_ms_text(const printTableContent* cont, FILE* fout)
fputs(".TE\n.DS L\n", fout);
/* print footers */
- if ((footers != NULL) && !opt_tuples_only && !cancel_pressed) {
+ if ((footers != NULL) && !opt_tuples_only && !cancel_pressed && cont->opt->feedback) {
printTableFooter* f = NULL;
for (f = footers; f != NULL; f = f->next) {
@@ -1837,7 +1837,7 @@ static void print_troff_ms_vertical(const printTableContent* cont, FILE* fout)
fputs(".TE\n.DS L\n", fout);
/* print footers */
- if ((cont->footers != NULL) && !opt_tuples_only && !cancel_pressed) {
+ if ((cont->footers != NULL) && !opt_tuples_only && !cancel_pressed && cont->opt->feedback) {
printTableFooter* f = NULL;
for (f = cont->footers; f != NULL; f = f->next) {
diff --git a/src/bin/psql/print.h b/src/bin/psql/print.h
index 89f301ded..74fc9c070 100644
--- a/src/bin/psql/print.h
+++ b/src/bin/psql/print.h
@@ -88,6 +88,7 @@ typedef struct printTableOpt {
int encoding; /* character encoding */
int env_columns; /* $COLUMNS on psql start, 0 is unset */
int columns; /* target width for wrapped format */
+ bool feedback; /* don't output row counts, etc. */
} printTableOpt;
/*
diff --git a/src/bin/psql/psqlscan.l b/src/bin/psql/psqlscan.l
index 0fd34d31d..82af110e9 100644
--- a/src/bin/psql/psqlscan.l
+++ b/src/bin/psql/psqlscan.l
@@ -194,6 +194,7 @@ static void init_gram_state(PsqlScanState state);
static void analyze_state(const char* text,PsqlScanState state);
static int upperstrcmp(const char *str1,const char *str2);
static GramIdentify keywordRead(const char* text);
+static bool IsTranscationTokens(char* yytext, char* token);
#define YY_DECL int yylex(PsqlScanState lex_param)
@@ -637,13 +638,13 @@ other .
if (lex_param->begin_state == BEGIN_UNDEFINED)
{
/* For a transaction statement, all possible tokens after BEGIN are here */
- if (strncasecmp(yytext, "transaction", strlen("transaction")) == 0 ||
- strncasecmp(yytext, "work", strlen("work")) == 0 ||
- strncasecmp(yytext, "isolation", strlen("isolation")) == 0 ||
- strncasecmp(yytext, "read", strlen("read")) == 0 ||
- strncasecmp(yytext, "deferrable", strlen("deferrable")) == 0 ||
- strncasecmp(yytext, "not", strlen("not")) == 0 ||
- strncasecmp(yytext, ";", strlen(";")) == 0)
+ if (IsTranscationTokens(yytext, "transaction") ||
+ IsTranscationTokens(yytext, "work") ||
+ IsTranscationTokens(yytext, "isolation") ||
+ IsTranscationTokens(yytext, "read") ||
+ IsTranscationTokens(yytext, "deferrable") ||
+ IsTranscationTokens(yytext, "not") ||
+ strncasecmp(yytext, ";", strlen(";")) == 0)
lex_param->begin_state = BEGIN_TRANSACTION;
else
lex_param->begin_state = BEGIN_ANOYBLOCK;
@@ -2041,6 +2042,23 @@ extract_substring(const char *txt, int len)
return result;
}
+static bool IsTranscationTokens(char* yytext, char* token)
+{
+ int token_len = strlen(token);
+ if (strncasecmp(yytext, token, token_len) == 0) {
+ if (strlen(yytext) > token_len) {
+ if ((yytext[token_len] >= '0' && yytext[token_len] <= '9') ||
+ (yytext[token_len] >= 'a' && yytext[token_len] <= 'z') ||
+ (yytext[token_len] >= 'A' && yytext[token_len] <= 'Z') ||
+ yytext[token_len] == '_') {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
/*
* escape_variable --- process :'VARIABLE' or :"VARIABLE"
*
@@ -2235,7 +2253,7 @@ analyze_state(const char* text,PsqlScanStateData* state)
state->gram_state[IDEN_AS] = true;
state->gram_state[IDEN_IS] = true;
state->gram_state[IDEN_DETERMINISTIC] = true;
- state->count_to_read = 7;
+ state->count_to_read = -1;
break;
case IDEN_DETERMINISTIC:
/* when meet a DETERMINISTIC, we can read max identify number is 6 */
diff --git a/src/bin/psql/startup.cpp b/src/bin/psql/startup.cpp
index 8482dd638..a444a3d70 100644
--- a/src/bin/psql/startup.cpp
+++ b/src/bin/psql/startup.cpp
@@ -37,6 +37,7 @@
#ifndef WIN32
#include "libpq/libpq-int.h"
#endif
+#include "nodes/pg_list.h"
/*
* Global psql options
@@ -125,6 +126,150 @@ static void set_aes_key(const char* dencrypt_key);
#define PARAMS_ARRAY_SIZE 11
#endif
+#ifdef ENABLE_LITE_MODE
+void pg_free(void* ptr)
+{
+ if (ptr != NULL) {
+ free(ptr);
+ ptr = NULL;
+ }
+}
+
+static void list_free_private(List* list, bool deep)
+{
+ ListCell* cell = NULL;
+
+ cell = list_head(list);
+ while (cell != NULL) {
+ ListCell* tmp = cell;
+
+ cell = lnext(cell);
+ if (deep) {
+ pg_free(lfirst(tmp));
+ }
+ pg_free(tmp);
+ }
+
+ if (list != NULL) {
+ pg_free(list);
+ }
+}
+
+
+void list_free(List* list)
+{
+ list_free_private(list, false);
+}
+
+static List* new_list(NodeTag type)
+{
+ List* new_list_val = NULL;
+ ListCell* new_head = NULL;
+
+ new_head = (ListCell*)pg_malloc(sizeof(*new_head));
+ new_head->next = NULL;
+ /* new_head->data is left undefined! */
+
+ new_list_val = (List*)pg_malloc(sizeof(*new_list_val));
+ new_list_val->type = type;
+ new_list_val->length = 1;
+ new_list_val->head = new_head;
+ new_list_val->tail = new_head;
+
+ return new_list_val;
+}
+
+static void new_tail_cell(List* list)
+{
+ ListCell* new_tail = NULL;
+
+ new_tail = (ListCell*)pg_malloc(sizeof(*new_tail));
+ new_tail->next = NULL;
+
+ list->tail->next = new_tail;
+ list->tail = new_tail;
+ list->length++;
+}
+
+List* lappend(List* list, void* datum)
+{
+ if (list == NIL)
+ list = new_list(T_List);
+ else
+ new_tail_cell(list);
+
+ lfirst(list->tail) = datum;
+ return list;
+}
+
+static void new_head_cell(List* list)
+{
+ ListCell* new_head = NULL;
+
+ new_head = (ListCell*)pg_malloc(sizeof(*new_head));
+ new_head->next = list->head;
+
+ list->head = new_head;
+ list->length++;
+}
+
+List* lcons(void* datum, List* list)
+{
+ if (list == NIL) {
+ list = new_list(T_List);
+ } else {
+ new_head_cell(list);
+ }
+
+ lfirst(list->head) = datum;
+ return list;
+}
+
+List* list_delete_cell(List* list, ListCell* cell, ListCell* prev)
+{
+ Assert(prev != NULL ? lnext(prev) == cell : list_head(list) == cell);
+
+ /*
+ * If we're about to delete the last node from the list, free the whole
+ * list instead and return NIL, which is the only valid representation of
+ * a zero-length list.
+ */
+ if (list->length == 1) {
+ list_free(list);
+ return NIL;
+ }
+
+ /*
+ * Otherwise, adjust the necessary list links, deallocate the particular
+ * node we have just removed, and return the list we were given.
+ */
+ list->length--;
+
+ if (prev != NULL) {
+ prev->next = cell->next;
+ } else {
+ list->head = cell->next;
+ }
+
+ if (list->tail == cell) {
+ list->tail = prev;
+ }
+
+ cell->next = NULL;
+ pg_free(cell);
+ return list;
+}
+
+List* list_delete_first(List* list)
+{
+ if (list == NIL) {
+ return NIL; /* would an error be better? */
+ }
+
+ return list_delete_cell(list, list_head(list), NULL);
+}
+#endif
+
#ifndef ENABLE_MULTIPLE_NODES
static bool IsPrimaryOfCentralizedCluster(PGconn *conn)
{
@@ -308,6 +453,7 @@ int main(int argc, char* argv[])
#endif
/* We rely on unmentioned fields of pset.popt to start out 0/false/NULL */
pset.popt.topt.format = PRINT_ALIGNED;
+ pset.popt.topt.feedback = true;
pset.popt.topt.border = 1;
pset.popt.topt.pager = 1;
pset.popt.topt.start_table = true;
@@ -756,32 +902,32 @@ static void get_password_pipeline(struct adhoc_opts* options)
}
#ifndef ENABLE_MULTIPLE_NODES
-static void TrimHost(char *src)
+static char* TrimHost(char* src)
{
- char *begin = src;
- char *end = src + strlen(src);
- if (begin == end) {
- return;
+ char* s = 0;
+ char* e = 0;
+ char* c = 0;
+
+ for (c = src; (c != NULL) && (*c != '\0'); ++c) {
+ if (isspace(*c)) {
+ if (e == NULL) {
+ e = c;
+ }
+ } else {
+ if (s == NULL) {
+ s = c;
+ }
+ e = 0;
+ }
}
- while (isspace(*begin)) {
- ++begin;
+ if (s == NULL) {
+ s = src;
}
- while (isspace(*end)) {
- --end;
+ if (e != NULL) {
+ *e = 0;
}
- if (begin > end) {
- *src = 0;
- return;
- }
- while (begin != end) {
- *src = *begin;
- src++;
- begin++;
- }
- *src = *end;
- src++;
- *src = '\0';
- return;
+
+ return s;
}
static void ParseHostArg(const char *arg, struct adhoc_opts *options)
@@ -796,8 +942,7 @@ static void ParseHostArg(const char *arg, struct adhoc_opts *options)
char *inputStr = pg_strdup(arg);
char *host = NULL;
for (char *subStr = strtok(inputStr, sep); subStr != NULL; subStr = strtok(NULL, sep)) {
- host = pg_strdup(subStr);
- TrimHost(host);
+ host = pg_strdup(TrimHost(subStr));
if (strlen(host) == 0) {
free(host);
continue;
@@ -869,6 +1014,7 @@ static void parse_psql_options(int argc, char* const argv[], struct adhoc_opts*
bool is_action_file = false;
/* Database Security: Data importing/dumping support AES128. */
char* dencrypt_key = NULL;
+ char* needmask = NULL;
errno_t rc = EOK;
#ifdef USE_READLINE
useReadline = false;
@@ -908,7 +1054,9 @@ static void parse_psql_options(int argc, char* const argv[], struct adhoc_opts*
}
break;
case 'd':
- options->dbname = optarg;
+ options->dbname = pg_strdup(optarg);
+ dbname_alloced = true;
+ needmask = optarg;
break;
case 'e':
if (!SetVariable(pset.vars, "ECHO", "queries")) {
@@ -957,6 +1105,7 @@ static void parse_psql_options(int argc, char* const argv[], struct adhoc_opts*
rc = memset_s(optarg, strlen(optarg), 0, strlen(optarg));
check_memset_s(rc);
set_aes_key(dencrypt_key);
+ free(dencrypt_key);
break;
}
case 'L':
@@ -1115,27 +1264,9 @@ static void parse_psql_options(int argc, char* const argv[], struct adhoc_opts*
*/
while (argc - optind >= 1) {
if (options->dbname == NULL) {
- char *temp = NULL;
- options->dbname = argv[optind];
- if ((temp = strstr(argv[optind], "password")) != NULL) {
- options->dbname = pg_strdup(argv[optind]);
- rc = memset_s(temp + PASSWORD_STR_LEN, strlen(argv[optind]),
- 0, strlen(temp + PASSWORD_STR_LEN));
- check_memset_s(rc);
- dbname_alloced = true;
- }
- /* mask informations in URI string. */
- if (strncmp(options->dbname, "postgresql://", strlen("postgresql://")) == 0) {
- options->dbname = pg_strdup(argv[optind]);
- char *off_argv = argv[optind] + strlen("postgresql://");
- rc = memset_s(off_argv, strlen(off_argv), '*', strlen(off_argv));
- check_memset_s(rc);
- } else if (strncmp(options->dbname, "postgres://", strlen("postgres://")) == 0) {
- options->dbname = pg_strdup(argv[optind]);
- char *off_argv = argv[optind] + strlen("postgres://");
- rc = memset_s(off_argv, strlen(off_argv), '*', strlen(off_argv));
- check_memset_s(rc);
- }
+ options->dbname = pg_strdup(argv[optind]);
+ dbname_alloced = true;
+ needmask = argv[optind];
} else if (options->username == NULL) {
options->username = argv[optind];
} else if (!pset.quiet) {
@@ -1144,6 +1275,26 @@ static void parse_psql_options(int argc, char* const argv[], struct adhoc_opts*
}
optind++;
}
+
+ if (needmask != NULL) {
+ /* mask informations in URI string. */
+ if (strncmp(options->dbname, "postgresql://", strlen("postgresql://")) == 0) {
+ char *off_argv = needmask + strlen("postgresql://");
+ rc = memset_s(off_argv, strlen(off_argv), '*', strlen(off_argv));
+ check_memset_s(rc);
+ } else if (strncmp(options->dbname, "postgres://", strlen("postgres://")) == 0) {
+ char *off_argv = needmask + strlen("postgres://");
+ rc = memset_s(off_argv, strlen(off_argv), '*', strlen(off_argv));
+ check_memset_s(rc);
+ }
+ /* mask password */
+ char *temp = NULL;
+ if ((temp = strstr(needmask, "password")) != NULL) {
+ char *off_argv = temp + PASSWORD_STR_LEN;
+ rc = memset_s(off_argv, strlen(off_argv), '*', strlen(off_argv));
+ check_memset_s(rc);
+ }
+ }
}
/*
@@ -1556,4 +1707,4 @@ static void set_aes_key(const char* dencrypt_key)
MAX_KEY_LEN);
exit(EXIT_FAILURE);
}
-}
\ No newline at end of file
+}
diff --git a/src/bin/scripts/CMakeLists.txt b/src/bin/scripts/CMakeLists.txt
index 824da3068..ed96a3f0b 100755
--- a/src/bin/scripts/CMakeLists.txt
+++ b/src/bin/scripts/CMakeLists.txt
@@ -95,8 +95,10 @@ set(TGT_scripts_INC
set(scripts_DEF_OPTIONS ${MACRO_OPTIONS})
set(scripts_COMPILE_OPTIONS ${OPTIMIZE_OPTIONS} ${OS_OPTIONS} ${PROTECT_OPTIONS} ${WARNING_OPTIONS} ${BIN_SECURE_OPTIONS} ${CHECK_OPTIONS})
set(scripts_LINK_OPTIONS ${BIN_LINK_OPTIONS})
-set(scripts_LINK_LIBS libelog.a libpgport.a -lpq -lcrypt -ldl -lm -lssl -lcrypto -lsecurec -pthread -lrt -lz -lminiunz -lgssapi_krb5_gauss -lgssrpc_gauss -lkrb5_gauss -lkrb5support_gauss -lk5crypto_gauss -lcom_err_gauss)
-
+set(scripts_LINK_LIBS libelog.a libpgport.a -lpq -lcrypt -ldl -lm -lssl -lcrypto -l${SECURE_C_CHECK} -pthread -lrt -lz -lminiunz)
+if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
+ list(APPEND scripts_LINK_LIBS -lgssapi_krb5_gauss -lgssrpc_gauss -lkrb5_gauss -lkrb5support_gauss -lk5crypto_gauss -lcom_err_gauss)
+endif()
add_bintarget(createdb TGT_createdb_SRC TGT_scripts_INC "${scripts_DEF_OPTIONS}" "${scripts_COMPILE_OPTIONS}" "${scripts_LINK_OPTIONS}" "${scripts_LINK_LIBS}")
add_dependencies(createdb elog_static pgport_static pq)
target_link_directories(createdb PUBLIC
diff --git a/src/bin/scripts/Makefile b/src/bin/scripts/Makefile
index 220a526d4..34b37033d 100644
--- a/src/bin/scripts/Makefile
+++ b/src/bin/scripts/Makefile
@@ -21,7 +21,9 @@ PROGRAMS = createdb createlang createuser dropdb droplang dropuser clusterdb vac
override CPPFLAGS := -I$(top_srcdir)/src/bin/pg_dump -I$(top_srcdir)/src/bin/psql -I$(libpq_srcdir) $(CPPFLAGS)
CFLAGS += -Wl,-z,relro,-z,now
-LIBS += -lgssapi_krb5_gauss -lgssrpc_gauss -lkrb5_gauss -lkrb5support_gauss -lk5crypto_gauss -lcom_err_gauss
+ifeq ($(enable_lite_mode), no)
+ LIBS += -lgssapi_krb5_gauss -lgssrpc_gauss -lkrb5_gauss -lkrb5support_gauss -lk5crypto_gauss -lcom_err_gauss
+endif
ifneq "$(MAKECMDGOALS)" "clean"
ifneq "$(MAKECMDGOALS)" "distclean"
diff --git a/src/common/backend/Makefile b/src/common/backend/Makefile
index 8409b1305..8089d8fda 100644
--- a/src/common/backend/Makefile
+++ b/src/common/backend/Makefile
@@ -8,10 +8,6 @@ subdir = src/common/backend
top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
-ifeq ($(enable_multiple_nodes), yes)
-SUBDIRS = catalog client_logic lib libpq nodes parser port regex snowball tsearch utils
-else
SUBDIRS = catalog client_logic lib libpq nodes parser port regex snowball tsearch utils pgxc_single
-endif
include $(top_srcdir)/src/gausskernel/common.mk
diff --git a/src/common/backend/catalog/CMakeLists.txt b/src/common/backend/catalog/CMakeLists.txt
index 61e6df6e0..3a6ae4992 100755
--- a/src/common/backend/catalog/CMakeLists.txt
+++ b/src/common/backend/catalog/CMakeLists.txt
@@ -14,8 +14,9 @@ set(POSTGRES_BKI_SRCS_S
@gs_client_global_keys_args.h @pg_job.h @gs_asp.h @pg_job_proc.h @pg_extension_data_source.h @pg_statistic_ext.h
@pg_object.h @pg_synonym.h @toasting.h @indexing.h @gs_obsscaninfo.h @pg_directory.h @pg_hashbucket.h @gs_global_chain.h @gs_global_config.h
@pg_streaming_stream.h @pg_streaming_cont_query.h @pg_streaming_reaper_status.h @gs_matview.h @gs_matview_dependency.h @pgxc_slice.h
-@gs_opt_model.h @pg_recyclebin.h @pg_snapshot.h @gs_model.h @gs_package.h @gs_job_argument.h @gs_job_attribute.h
+@gs_opt_model.h @pg_recyclebin.h @pg_snapshot.h @gs_model.h @gs_package.h @gs_job_argument.h @gs_job_attribute.h @pg_uid.h @gs_db_privilege.h
@pg_replication_origin.h @pg_publication.h @pg_publication_rel.h @pg_subscription.h"
+
)
string(REPLACE "@" "${PROJECT_SRC_DIR}/include/catalog/" POSTGRES_BKI_SRCS ${POSTGRES_BKI_SRCS_S})
diff --git a/src/common/backend/catalog/Makefile b/src/common/backend/catalog/Makefile
index c1147e0ae..71eb2548d 100644
--- a/src/common/backend/catalog/Makefile
+++ b/src/common/backend/catalog/Makefile
@@ -23,8 +23,8 @@ OBJS = catalog.o dependency.o heap.o index.o indexing.o namespace.o aclchk.o \
pg_operator.o gs_package.o pg_proc.o pg_range.o pg_db_role_setting.o pg_shdepend.o pg_synonym.o\
pg_type.o pgxc_class.o storage.o storage_gtt.o toasting.o pg_job.o pg_partition.o\
pg_hashbucket.o cstore_ctlg.o dfsstore_ctlg.o pg_builtin_proc.o streaming_stream.o\
- gs_matview.o pgxc_slice.o pg_job_proc.o gs_job_argument.o gs_job_attribute.o\
- pg_publication.o pg_subscription.o
+ gs_matview.o pgxc_slice.o pg_job_proc.o gs_job_argument.o gs_job_attribute.o pg_uid.o gs_global_config.o\
+ gs_db_privilege.o pg_publication.o pg_subscription.o
BKIFILES = postgres.bki postgres.description postgres.shdescription
@@ -59,9 +59,9 @@ POSTGRES_BKI_SRCS = $(addprefix $(top_srcdir)/src/include/catalog/,\
toasting.h indexing.h gs_obsscaninfo.h pg_directory.h pg_hashbucket.h gs_global_chain.h gs_global_config.h\
pg_streaming_stream.h pg_streaming_cont_query.h pg_streaming_reaper_status.h gs_matview.h\
gs_matview_dependency.h pgxc_slice.h gs_opt_model.h gs_model.h\
- pg_recyclebin.h pg_snapshot.h gs_job_argument.h gs_job_attribute.h\
+ pg_recyclebin.h pg_snapshot.h gs_job_argument.h gs_job_attribute.h pg_uid.h gs_db_privilege.h\
pg_replication_origin.h pg_publication.h pg_publication_rel.h pg_subscription.h\
- )
+ )
# location of Catalog.pm
catalogdir = $(top_srcdir)/src/common/backend/catalog
diff --git a/src/common/backend/catalog/aclchk.cpp b/src/common/backend/catalog/aclchk.cpp
index 27bcbca6a..07d448e12 100644
--- a/src/common/backend/catalog/aclchk.cpp
+++ b/src/common/backend/catalog/aclchk.cpp
@@ -20,6 +20,7 @@
#include "access/genam.h"
#include "access/heapam.h"
+#include "access/reloptions.h"
#include "access/sysattr.h"
#include "access/transam.h"
#include "access/xact.h"
@@ -58,6 +59,7 @@
#include "catalog/pg_extension_data_source.h"
#include "catalog/gs_global_chain.h"
#include "catalog/gs_global_config.h"
+#include "catalog/gs_db_privilege.h"
#include "commands/dbcommands.h"
#include "commands/proclang.h"
#include "commands/sec_rls_cmds.h"
@@ -184,6 +186,7 @@ const struct AclObjKind {
{ACL_KIND_SEQUENCE, ACL_ALL_RIGHTS_SEQUENCE, ACL_ALL_DDL_RIGHTS_SEQUENCE},
{ACL_KIND_DATABASE, ACL_ALL_RIGHTS_DATABASE, ACL_ALL_DDL_RIGHTS_DATABASE},
{ACL_KIND_PROC, ACL_ALL_RIGHTS_FUNCTION, ACL_ALL_DDL_RIGHTS_FUNCTION},
+ {ACL_KIND_PACKAGE, ACL_ALL_RIGHTS_PACKAGE, ACL_ALL_DDL_RIGHTS_PACKAGE},
{ACL_KIND_LANGUAGE, ACL_ALL_RIGHTS_LANGUAGE, ACL_ALL_DDL_RIGHTS_LANGUAGE},
{ACL_KIND_LARGEOBJECT, ACL_ALL_RIGHTS_LARGEOBJECT, ACL_ALL_DDL_RIGHTS_LARGEOBJECT},
{ACL_KIND_NAMESPACE, ACL_ALL_RIGHTS_NAMESPACE, ACL_ALL_DDL_RIGHTS_NAMESPACE},
@@ -247,7 +250,7 @@ static List* getRelationsInNamespace(Oid namespaceId, char relkind);
static void expand_col_privileges(
List* colnames, Oid table_oid, AclMode this_privileges, AclMode* col_privileges, int num_col_privileges);
static void expand_all_col_privileges(
- Oid table_oid, Form_pg_class classForm, AclMode this_privileges, AclMode* col_privileges, int num_col_privileges, bool relhasbucket);
+ Oid table_oid, Form_pg_class classForm, AclMode this_privileges, AclMode* col_privileges, int num_col_privileges, bool relhasbucket, bool relhasuids);
static AclMode string_to_privilege(const char* privname);
static const char* privilege_to_string(AclMode privilege);
static void restrict_and_check_grant(AclMode* this_privileges, bool is_grant,
@@ -1218,6 +1221,10 @@ void ExecAlterDefaultPrivilegesStmt(AlterDefaultPrivilegesStmt* stmt)
all_privileges = ACL_ALL_RIGHTS_PACKAGE;
all_ddl_privileges = ACL_ALL_DDL_RIGHTS_PACKAGE;
errormsg = gettext_noop("invalid privilege type %s for package");
+ ereport(ERROR, (errmodule(MOD_SEC), errcode(ERRCODE_UNRECOGNIZED_NODE_TYPE),
+ errmsg("alter default privileges is not support package yet."), errdetail("N/A"),
+ errcause("alter default privileges is not support package yet."),
+ erraction("N/A")));
break;
case ACL_OBJECT_TYPE:
all_privileges = ACL_ALL_RIGHTS_TYPE;
@@ -1796,7 +1803,7 @@ static void expand_col_privileges(
* FirstLowInvalidHeapAttributeNumber, up to relation's last attribute.
*/
static void expand_all_col_privileges(
- Oid table_oid, Form_pg_class classForm, AclMode this_privileges, AclMode* col_privileges, int num_col_privileges, bool relhasbucket)
+ Oid table_oid, Form_pg_class classForm, AclMode this_privileges, AclMode* col_privileges, int num_col_privileges, bool relhasbucket, bool relhasuids)
{
AttrNumber curr_att;
@@ -1807,7 +1814,9 @@ static void expand_all_col_privileges(
if (curr_att == InvalidAttrNumber)
continue;
-
+ if (curr_att == UidAttributeNumber && !relhasuids) {
+ continue;
+ }
/* Skip OID column if it doesn't exist */
if (curr_att == ObjectIdAttributeNumber && !classForm->relhasoids)
continue;
@@ -2157,6 +2166,7 @@ static void ExecGrant_Relation(InternalGrant* istmt)
if (!istmt->is_grant && ((privileges & ACL_ALL_RIGHTS_COLUMN) != 0 ||
(REMOVE_DDL_FLAG(ddl_privileges) & ACL_ALL_DDL_RIGHTS_COLUMN) != 0)) {
bool hasbucket = false;
+ bool relhasuids = false;
bool isNull = false;
Datum datum;
@@ -2165,10 +2175,16 @@ static void ExecGrant_Relation(InternalGrant* istmt)
Assert(OidIsValid(DatumGetObjectId(datum)));
hasbucket = true;
}
+ if (pg_class_tuple->relkind == RELKIND_RELATION) {
+ bytea* options = extractRelOptions(tuple, GetDefaultPgClassDesc(), InvalidOid);
+ relhasuids = StdRdOptionsHasUids(options, pg_class_tuple->relkind);
+ pfree_ext(options);
+ }
+ // get if relhasuids
expand_all_col_privileges(relOid, pg_class_tuple, privileges & ACL_ALL_RIGHTS_COLUMN,
- col_privileges, num_col_privileges, hasbucket);
+ col_privileges, num_col_privileges, hasbucket, relhasuids);
expand_all_col_privileges(relOid, pg_class_tuple, ddl_privileges & ACL_ALL_DDL_RIGHTS_COLUMN,
- col_ddl_privileges, num_col_privileges, hasbucket);
+ col_ddl_privileges, num_col_privileges, hasbucket, relhasuids);
have_col_privileges = true;
}
@@ -3163,7 +3179,7 @@ static void ExecGrant_Package(InternalGrant* istmt)
istmt->ddl_privileges,
pkgId,
grantorId,
- ACL_KIND_PROC,
+ ACL_KIND_PACKAGE,
NameStr(gs_package_tuple->pkgname),
0,
NULL);
@@ -3417,10 +3433,12 @@ static void ExecGrant_Namespace(InternalGrant* istmt)
noldmembers = aclmembers(old_acl, &oldmembers);
}
- /* Determine ID to do the grant as, and available grant options */
- /* Need special treatment for special schema dbe_perf and schema snapshot*/
+ /*
+ * Determine ID to do the grant as, and available grant options.
+ * Need special treatment for schema dbe_perf, snapshot and pg_catalog.
+ */
select_best_grantor(GetUserId(), istmt->privileges, istmt->ddl_privileges, old_acl, ownerId,
- &grantorId, &avail_goptions, &avail_ddl_goptions, IsMonitorSpace(nspid));
+ &grantorId, &avail_goptions, &avail_ddl_goptions, IsMonitorSpace(nspid), IsSystemNamespace(nspid));
/*
* Restrict the privileges to what we can actually grant, and emit the
@@ -4845,6 +4863,8 @@ static AclMode pg_aclmask(
return pg_database_aclmask(table_oid, roleid, mask, how);
case ACL_KIND_PROC:
return pg_proc_aclmask(table_oid, roleid, mask, how);
+ case ACL_KIND_PACKAGE:
+ return pg_package_aclmask(table_oid, roleid, mask, how);
case ACL_KIND_LANGUAGE:
return pg_language_aclmask(table_oid, roleid, mask, how);
case ACL_KIND_LARGEOBJECT:
@@ -4961,7 +4981,7 @@ AclMode pg_attribute_aclmask(Oid table_oid, AttrNumber attnum, Oid roleid, AclMo
acl = DatumGetAclP(aclDatum);
if (IsMonitorSpace(namespaceId)) {
- result = aclmask_dbe_perf(acl, roleid, ownerId, mask, how);
+ result = aclmask_without_sysadmin(acl, roleid, ownerId, mask, how);
} else {
result = aclmask(acl, roleid, ownerId, mask, how);
}
@@ -4974,6 +4994,72 @@ AclMode pg_attribute_aclmask(Oid table_oid, AttrNumber attnum, Oid roleid, AclMo
return result;
}
+static AclMode check_dml_privilege(Form_pg_class classForm, AclMode mask, Oid roleid, AclMode result)
+{
+ if (is_role_independent(classForm->relowner)) {
+ return result;
+ }
+ switch (classForm->relkind) {
+ case RELKIND_INDEX:
+ case RELKIND_GLOBAL_INDEX:
+ case RELKIND_SEQUENCE:
+ case RELKIND_LARGE_SEQUENCE:
+ case RELKIND_COMPOSITE_TYPE:
+ break;
+ /* table */
+ default:
+ if ((mask & ACL_SELECT) && !(result & ACL_SELECT)) {
+ if (HasSpecAnyPriv(roleid, SELECT_ANY_TABLE, false)) {
+ result |= ACL_SELECT;
+ }
+ }
+
+ if ((mask & ACL_INSERT) && !(result & ACL_INSERT)) {
+ if (HasSpecAnyPriv(roleid, INSERT_ANY_TABLE, false)) {
+ result |= ACL_INSERT;
+ }
+ }
+ if ((mask & ACL_UPDATE) && !(result & ACL_UPDATE)) {
+ if (HasSpecAnyPriv(roleid, UPDATE_ANY_TABLE, false)) {
+ result |= ACL_UPDATE;
+ }
+ }
+ if ((mask & ACL_DELETE) && !(result & ACL_DELETE)) {
+ if (HasSpecAnyPriv(roleid, DELETE_ANY_TABLE, false)) {
+ result |= ACL_DELETE;
+ }
+ }
+ break;
+ }
+ return result;
+}
+
+static AclMode check_ddl_privilege(char relkind, AclMode mask, Oid roleid, AclMode result)
+{
+ mask = REMOVE_DDL_FLAG(mask);
+ switch (relkind) {
+ case RELKIND_COMPOSITE_TYPE:
+ case RELKIND_SEQUENCE:
+ case RELKIND_LARGE_SEQUENCE:
+ case RELKIND_INDEX:
+ case RELKIND_GLOBAL_INDEX:
+ break;
+ /* table */
+ default:
+ if ((mask & ACL_DROP) && !(result & ACL_DROP)) {
+ if (HasSpecAnyPriv(roleid, DROP_ANY_TABLE, false)) {
+ result |= ACL_DROP;
+ }
+ }
+ if ((mask & ACL_ALTER) && !(result & ACL_ALTER)) {
+ if (HasSpecAnyPriv(roleid, ALTER_ANY_TABLE, false)) {
+ result |= ACL_ALTER;
+ }
+ }
+ break;
+ }
+ return result;
+}
/*
* Exported routine for examining a user's privileges for a table
*/
@@ -5132,7 +5218,7 @@ AclMode pg_class_aclmask(Oid table_oid, Oid roleid, AclMode mask, AclMaskHow how
mask = ADD_DDL_FLAG(mask);
}
if (IsMonitorSpace(namespaceId)) {
- result = aclmask_dbe_perf(acl, roleid, ownerId, mask, how);
+ result = aclmask_without_sysadmin(acl, roleid, ownerId, mask, how);
} else {
result = aclmask(acl, roleid, ownerId, mask, how);
}
@@ -5140,8 +5226,16 @@ AclMode pg_class_aclmask(Oid table_oid, Oid roleid, AclMode mask, AclMaskHow how
/* if we have a detoasted copy, free it */
FREE_DETOASTED_ACL(acl, aclDatum);
+ if ((how == ACLMASK_ANY && result != 0) || IsSysSchema(namespaceId)) {
+ ReleaseSysCache(tuple);
+ return result;
+ }
+ if (is_ddl_privileges) {
+ result = check_ddl_privilege(classForm->relkind, mask, roleid, result);
+ } else {
+ result = check_dml_privilege(classForm, mask, roleid, result);
+ }
ReleaseSysCache(tuple);
-
return result;
}
@@ -5321,11 +5415,14 @@ AclMode pg_proc_aclmask(Oid proc_oid, Oid roleid, AclMode mask, AclMaskHow how,
}
if (IsMonitorSpace(namespaceId)) {
- result = aclmask_dbe_perf(acl, roleid, ownerId, mask, how);
+ result = aclmask_without_sysadmin(acl, roleid, ownerId, mask, how);
} else {
result = aclmask(acl, roleid, ownerId, mask, how);
}
-
+ if ((mask & ACL_EXECUTE) && !(result & ACL_EXECUTE) && !IsSysSchema(namespaceId) &&
+ HasSpecAnyPriv(roleid, EXECUTE_ANY_FUNCTION, false)) {
+ result |= ACL_EXECUTE;
+ }
/* if we have a detoasted copy, free it */
FREE_DETOASTED_ACL(acl, aclDatum);
if (HeapTupleIsValid(pkgTuple)) {
@@ -5377,6 +5474,11 @@ AclMode pg_package_aclmask(Oid packageOid, Oid roleid, AclMode mask, AclMaskHow
acl = DatumGetAclP(aclDatum);
}
result = aclmask(acl, roleid, ownerId, mask, how);
+ Oid namespaceId = ((Form_gs_package) GETSTRUCT(tuple))->pkgnamespace;
+ if ((mask & ACL_EXECUTE) && !(result & ACL_EXECUTE) && !IsSysSchema(namespaceId) &&
+ HasSpecAnyPriv(roleid, EXECUTE_ANY_PACKAGE, false)) {
+ result |= ACL_EXECUTE;
+ }
/* if we have a detoasted copy, free it */
FREE_DETOASTED_ACL(acl, aclDatum);
if (HeapTupleIsValid(pkgTuple)) {
@@ -5614,7 +5716,6 @@ AclMode pg_largeobject_aclmask_snapshot(Oid lobj_oid, Oid roleid, AclMode mask,
/*
* Exported routine for examining a user's privileges for blockchain namespace
*/
-
static AclMode gs_blockchain_aclmask(Oid roleid, AclMode mask)
{
/* Only super user or audit admin have access right to blockchain nsp */
@@ -5625,6 +5726,35 @@ static AclMode gs_blockchain_aclmask(Oid roleid, AclMode mask)
}
}
+static AclMode check_usage_privilege(Oid nsp_oid, AclMode mask, Oid roleid, AclMode result)
+{
+ if (!(mask & ACL_USAGE) || (result & ACL_USAGE)) {
+ return result;
+ }
+ if (!IsSysSchema(nsp_oid) && HasOneOfAnyPriv(roleid)) {
+ result |= ACL_USAGE;
+ }
+ return result;
+}
+
+/*
+ * The initial user and operator admin in operation mode
+ * can bypass permission check for schema pg_catalog.
+*/
+static bool is_pg_catalog_bypass_user(Oid roleid)
+{
+ return roleid == INITIAL_USER_ID || (isOperatoradmin(roleid) && u_sess->attr.attr_security.operation_mode);
+}
+
+/*
+ * Sysadmin and operator admin in operation mode
+ * can bypass permission check for all schemas except for schema dbe_perf, snapshot and pg_catalog.
+*/
+static bool is_namespace_bypass_user(Oid roleid)
+{
+ return superuser_arg(roleid) || (isOperatoradmin(roleid) && u_sess->attr.attr_security.operation_mode);
+}
+
/*
* Exported routine for examining a user's privileges for a namespace
*/
@@ -5644,17 +5774,19 @@ AclMode pg_namespace_aclmask(Oid nsp_oid, Oid roleid, AclMode mask, AclMaskHow h
/*
* The initial user bypass all permission checking.
- * Sysadmin bypass all permission checking except for schema dbe_perf and schema snapshot.
+ * Sysadmin bypass all permission checking except for schema dbe_perf, snapshot and pg_catalog.
* Monitoradmin can always bypass permission checking for schema dbe_perf and schema snapshot.
- */
+ */
if (IsMonitorSpace(nsp_oid)) {
if (isMonitoradmin(roleid) || roleid == INITIAL_USER_ID) {
return REMOVE_DDL_FLAG(mask);
}
- } else {
- if (superuser_arg(roleid) || (isOperatoradmin(roleid) && u_sess->attr.attr_security.operation_mode)) {
+ } else if (IsSystemNamespace(nsp_oid)) {
+ if (is_pg_catalog_bypass_user(roleid)) {
return REMOVE_DDL_FLAG(mask);
}
+ } else if (is_namespace_bypass_user(roleid)) {
+ return REMOVE_DDL_FLAG(mask);
}
/*
@@ -5709,12 +5841,17 @@ AclMode pg_namespace_aclmask(Oid nsp_oid, Oid roleid, AclMode mask, AclMaskHow h
check_nodegroup_privilege(roleid, ownerId, mask);
}
- if (IsMonitorSpace(nsp_oid)) {
- result = aclmask_dbe_perf(acl, roleid, ownerId, mask, how);
+ if (IsMonitorSpace(nsp_oid) || IsSystemNamespace(nsp_oid)) {
+ result = aclmask_without_sysadmin(acl, roleid, ownerId, mask, how);
} else {
result = aclmask(acl, roleid, ownerId, mask, how);
}
-
+ /*
+ * Check if ACL_USAGE is being checked and, if so, and not set already as
+ * part of the result, then check if the user has at least one of ANY privlege,
+ * which allow usage access to all schemas except system schema.
+ */
+ result = check_usage_privilege(nsp_oid, mask, roleid, result);
/* if we have a detoasted copy, free it */
FREE_DETOASTED_ACL(acl, aclDatum);
@@ -7048,12 +7185,14 @@ bool pg_publication_ownercheck(Oid pub_oid, Oid roleid)
Oid ownerId;
/* Superusers bypass all permission checking. */
- if (superuser_arg(roleid))
+ if (superuser_arg(roleid)) {
return true;
+ }
tuple = SearchSysCache1(PUBLICATIONOID, ObjectIdGetDatum(pub_oid));
- if (!HeapTupleIsValid(tuple))
+ if (!HeapTupleIsValid(tuple)) {
ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("publication with OID %u does not exist", pub_oid)));
+ }
ownerId = ((Form_pg_publication)GETSTRUCT(tuple))->pubowner;
diff --git a/src/common/backend/catalog/builtin_funcs.ini b/src/common/backend/catalog/builtin_funcs.ini
index 53cd8e846..eb12a93e5 100755
--- a/src/common/backend/catalog/builtin_funcs.ini
+++ b/src/common/backend/catalog/builtin_funcs.ini
@@ -241,7 +241,7 @@
),
AddFuncGroup(
"array_exists", 1,
- AddBuiltinFunc(_0(6009), _1("array_exists"), _2(2), _3(true), _4(false), _5(array_exists), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2277, 23), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_exists"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(6009), _1("array_exists"), _2(2), _3(false), _4(false), _5(array_exists), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2277, 23), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_exists"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"array_extend", 1,
@@ -268,6 +268,10 @@
"array_in", 1,
AddBuiltinFunc(_0(750), _1("array_in"), _2(3), _3(true), _4(false), _5(array_in), _6(2277), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(3, 2275, 26, 23), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_in"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("I/O"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "array_indexby_delete", 1,
+ AddBuiltinFunc(_0(7896), _1("array_indexby_delete"), _2(1), _3(true), _4(false), _5(array_indexby_delete), _6(2277), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 2277), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_indexby_delete"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"array_indexby_length", 1,
AddBuiltinFunc(_0(7895), _1("array_indexby_length"), _2(2), _3(false), _4(false), _5(array_indexby_length), _6(23), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2277, 23), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_indexby_length"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("array index by length"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -278,7 +282,7 @@
),
AddFuncGroup(
"array_integer_exists", 1,
- AddBuiltinFunc(_0(7888), _1("array_integer_exists"), _2(2), _3(true), _4(false), _5(array_integer_exists), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2277, 23), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_integer_exists"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(7888), _1("array_integer_exists"), _2(2), _3(false), _4(false), _5(array_integer_exists), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2277, 23), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_integer_exists"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"array_integer_first", 1,
@@ -354,11 +358,11 @@
),
AddFuncGroup(
"array_remove", 1,
- AddBuiltinFunc(_0(6555), _1("array_remove"), _2(2), _3(false), _4(false), _5(array_remove), _6(2277), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2277, 2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_remove"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'))
+ AddBuiltinFunc(_0(6555), _1("array_remove"), _2(2), _3(false), _4(false), _5(array_remove), _6(2277), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2277, 2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_remove"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"array_replace", 1,
- AddBuiltinFunc(_0(6556), _1("array_replace"), _2(3), _3(false), _4(false), _5(array_replace), _6(2277), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(3, 2277, 2283,2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_replace"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'))
+ AddBuiltinFunc(_0(6556), _1("array_replace"), _2(3), _3(false), _4(false), _5(array_replace), _6(2277), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(3, 2277, 2283,2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_replace"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"array_send", 1,
@@ -404,7 +408,7 @@
),
AddFuncGroup(
"array_varchar_exists", 1,
- AddBuiltinFunc(_0(7882), _1("array_varchar_exists"), _2(2), _3(true), _4(false), _5(array_varchar_exists), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2277, 1043), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_varchar_exists"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(7882), _1("array_varchar_exists"), _2(2), _3(false), _4(false), _5(array_varchar_exists), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2277, 1043), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("array_varchar_exists"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"array_varchar_first", 1,
@@ -1885,7 +1889,7 @@
),
AddFuncGroup(
"comm_check_connection_status", 1,
- AddBuiltinFunc(_0(1982), _1("comm_check_connection_status"), _2(0), _3(true), _4(true), _5(comm_check_connection_status), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(5, 25, 25, 25, 23, 16), _22(5, 'o', 'o', 'o', 'o', 'o'), _23(5, "node_name", "remote_name", "remote_host", "remote_port", "is_connected"), _24(NULL), _25("comm_check_connection_status"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(1982), _1("comm_check_connection_status"), _2(0), _3(true), _4(true), _5(comm_check_connection_status), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(6, 25, 25, 25, 23, 16, 16), _22(6, 'o', 'o', 'o', 'o', 'o', 'o'), _23(6, "node_name", "remote_name", "remote_host", "remote_port", "is_connected", "no_error_occur"), _24(NULL), _25("comm_check_connection_status"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"complex_array_in", 1,
@@ -2272,6 +2276,10 @@
"db4ai_predict_by_text", 1,
AddBuiltinFunc(_0(DB4AI_PREDICT_BY_TEXT_OID), _1("db4ai_predict_by_text"), _2(2), _3(false), _4(false), _5(db4ai_predict_by_text), _6(TEXTOID), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(ANYOID), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, TEXTOID, ANYOID), _21(2, TEXTOID, ANYOID), _22(2, 'i', 'v'), _23(NULL), _24(NULL), _25("db4ai_predict_by_text"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "db4ai_predict_by_float8_array", 1,
+ AddBuiltinFunc(_0(DB4AI_PREDICT_BY_FLOAT8ARRAY_OID), _1("db4ai_predict_by_float8_array"), _2(2), _3(false), _4(false), _5(db4ai_predict_by_float8_array), _6(FLOAT8ARRAYOID), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(ANYOID), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, TEXTOID, ANYOID), _21(2, TEXTOID, ANYOID), _22(2, 'i', 'v'), _23(NULL), _24(NULL), _25("db4ai_predict_by_float8_array"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false))
+ ),
AddFuncGroup(
"dcbrt", 1,
AddBuiltinFunc(_0(231), _1("dcbrt"), _2(1), _3(true), _4(false), _5(dcbrt), _6(701), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 701), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("dcbrt"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -2558,17 +2566,17 @@
"fenced_udf_process", 1,
AddBuiltinFunc(_0(4207), _1("fenced_udf_process"), _2(1), _3(true), _4(false), _5(fenced_udf_process), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 23), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("fenced_udf_process"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "finish", 1,
+ AddBuiltinFunc(_0(1518), _1("finish"), _2(0), _3(true), _4(true), _5(debug_client_finish), _6(2249), _7(PG_PLDEBUG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(4, 26, 25, 23, 25), _22(4, 'o', 'o', 'o', 'o'), _23(4, "funcoid", "funcname", "lineno", "query"), _24(NULL), _25("debug_client_finish"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"first", 1,
- AddBuiltinFunc(_0(6560), _1("first"), _2(1), _3(false), _4(false), _5(aggregate_dummy), _6(2283), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(true), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("aggregate_dummy"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'))
+ AddBuiltinFunc(_0(6560), _1("first"), _2(1), _3(false), _4(false), _5(aggregate_dummy), _6(2283), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(true), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("aggregate_dummy"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"first_transition", 1,
- AddBuiltinFunc(_0(6558), _1("first_transition"), _2(2), _3(true), _4(false), _5(first_transition), _6(2283), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2283, 2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("first_transition"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'))
- ),
- AddFuncGroup(
- "finish", 1,
- AddBuiltinFunc(_0(1518), _1("finish"), _2(0), _3(true), _4(true), _5(debug_client_finish), _6(2249), _7(PG_PLDEBUG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(4, 26, 25, 23, 25), _22(4, 'o', 'o', 'o', 'o'), _23(4, "funcoid", "funcname", "lineno", "query"), _24(NULL), _25("debug_client_finish"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(6558), _1("first_transition"), _2(2), _3(true), _4(false), _5(first_transition), _6(2283), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2283, 2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("first_transition"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"first_value", 1,
@@ -3437,6 +3445,22 @@
"global_stat_get_hotkeys_info", 1,
AddBuiltinFunc(_0(3903), _1("global_stat_get_hotkeys_info"), _2(0), _3(true), _4(true), _5(global_stat_get_hotkeys_info), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(6, 25, 25, 25, 25, 20, 20), _22(6, 'o', 'o', 'o', 'o', 'o', 'o'), _23(6, "database_name", "schema_name", "table_name", "key_value", "hash_value", "count"), _24(NULL), _25("global_stat_get_hotkeys_info"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "gs_gsc_clean", 1,
+ AddBuiltinFunc(_0(9120), _1("gs_gsc_clean"), _2(1), _3(false), _4(false), _5(gs_gsc_clean), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(1), _20(1, 20), _21(NULL), _22(NULL), _23(1, "database_id"), _24("({CONST :consttype 20 :consttypmod -1 :constcollid 0 :constlen 8 :constbyval true :constisnull true :ismaxvalue false :location 74 :constvalue <> :cursor_data :row_count 0 :cur_dno -1 :is_open false :found false :not_found false :null_open false :null_fetch false})"), _25("gs_gsc_clean"), _26(NULL), _27(NULL), _28(NULL), _29(1, 0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(1, 20), _41(NULL))
+ ),
+ AddFuncGroup(
+ "gs_gsc_dbstat_info", 1,
+ AddBuiltinFunc(_0(9121), _1("gs_gsc_dbstat_info"), _2(1), _3(false), _4(true), _5(gs_gsc_dbstat_info), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(1), _20(1, 20), _21(24, 20, 20, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20), _22(24, 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(24, "database_id", "database_id", "database_name", "tup_searches", "tup_hits", "tup_miss", "tup_count", "tup_dead", "tup_memory", "rel_searches", "rel_hits", "rel_miss", "rel_count", "rel_dead", "rel_memory", "part_searches", "part_hits", "part_miss", "part_count", "part_dead", "part_memory", "total_memory", "swapout_count", "refcount"), _24("({CONST :consttype 20 :consttypmod -1 :constcollid 0 :constlen 8 :constbyval true :constisnull true :ismaxvalue false :location 74 :constvalue <> :cursor_data :row_count 0 :cur_dno -1 :is_open false :found false :not_found false :null_open false :null_fetch false})"), _25("gs_gsc_dbstat_info"), _26(NULL), _27(NULL), _28(NULL), _29(1, 0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(24, 20, 20, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20), _41(NULL))
+ ),
+ AddFuncGroup(
+ "gs_gsc_catalog_detail", 1,
+ AddBuiltinFunc(_0(9122), _1("gs_gsc_catalog_detail"), _2(2), _3(false), _4(true), _5(gs_gsc_catalog_detail), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(2), _20(2, 20, 20), _21(13, 20, 20, 20, 25, 20, 25, 20, 25, 25, 20, 20, 20, 20), _22(13, 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(13, "database_id", "rel_id", "database_id", "database_name", "rel_id", "rel_name", "cache_id", "self", "ctid", "infomask", "infomask2", "hash_value", "refcount"), _24("({CONST :consttype 20 :consttypmod -1 :constcollid 0 :constlen 8 :constbyval true :constisnull true :ismaxvalue false :location 74 :constvalue <> :cursor_data :row_count 0 :cur_dno -1 :is_open false :found false :not_found false :null_open false :null_fetch false} {CONST :consttype 20 :consttypmod -1 :constcollid 0 :constlen 8 :constbyval true :constisnull true :ismaxvalue false :location 102 :constvalue <> :cursor_data :row_count 0 :cur_dno -1 :is_open false :found false :not_found false :null_open false :null_fetch false})"), _25("gs_gsc_catalog_detail"), _26(NULL), _27(NULL), _28(NULL), _29(2, 0, 1), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(13, 20, 20, 20, 25, 20, 25, 20, 25, 25, 20, 20, 20, 20), _41(NULL))
+ ),
+ AddFuncGroup(
+ "gs_gsc_table_detail", 1,
+ AddBuiltinFunc(_0(9123), _1("gs_gsc_table_detail"), _2(2), _3(false), _4(true), _5(gs_gsc_table_detail), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(2), _20(2, 20, 20), _21(23, 20, 20, 26, 25, 26, 25, 26, 26, 26, 26, 26, 26, 26, 16, 16, 18, 21, 16, 16, 18, 16, 25, 25), _22(23, 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(23, "database_oid", "rel_oid", "database_oid", "database_name", "reloid", "relname", "relnamespace", "reltype", "reloftype", "relowner", "relam", "relfilenode", "reltablespace", "relhasindex", "relisshared", "relkind", "relnatts", "relhasoids", "relhaspkey", "parttype", "tdhasuids", "attnames", "extinfo"), _24("({CONST :consttype 20 :consttypmod -1 :constcollid 0 :constlen 8 :constbyval true :constisnull true :ismaxvalue false :location 74 :constvalue <> :cursor_data :row_count 0 :cur_dno -1 :is_open false :found false :not_found false :null_open false :null_fetch false} {CONST :consttype 20 :consttypmod -1 :constcollid 0 :constlen 8 :constbyval true :constisnull true :ismaxvalue false :location 102 :constvalue <> :cursor_data :row_count 0 :cur_dno -1 :is_open false :found false :not_found false :null_open false :null_fetch false})"), _25("gs_gsc_table_detail"), _26(NULL), _27(NULL), _28(NULL), _29(2, 0, 1), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(23, 20, 20, 26, 25, 26, 25, 26, 26, 26, 26, 26, 26, 26, 16, 16, 18, 21, 16, 16, 18, 16, 25, 25), _41(NULL))
+ ),
AddFuncGroup(
"gs_all_control_group_info", 1,
AddBuiltinFunc(_0(4502), _1("gs_all_control_group_info"), _2(0), _3(true), _4(true), _5(gs_all_control_group_info), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(0), _21(10, 25, 25, 20, 20, 25, 25, 20, 20, 20, 25), _22(10, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(10, "name", "type", "gid", "classgid", "class", "workload", "shares", "limits", "wdlevel", "cpucores"), _24(NULL), _25("gs_all_control_group_info"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -3489,6 +3513,10 @@
"gs_fault_inject", 1,
AddBuiltinFunc(_0(4000), _1("gs_fault_inject"), _2(6), _3(true), _4(false), _5(gs_fault_inject), _6(20), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(6, 20, 25, 25, 25, 25, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_fault_inject"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "gs_get_active_archiving_standby", 1,
+ AddBuiltinFunc(_0(4579), _1("gs_get_active_archiving_standby"), _2(0), _3(true), _4(true), _5(gs_get_active_archiving_standby), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(3, 25, 25, 23), _22(3, 'o', 'o', 'o'), _23(3, "standby_name", "archive_location", "archived_file_num"), _24(NULL), _25("gs_get_active_archiving_standby"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"gs_get_global_barrier_status", 1,
AddBuiltinFunc(_0(9032), _1("gs_get_global_barrier_status"), _2(0), _3(true), _4(false), _5(gs_get_global_barrier_status), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(0), _21(2, 25, 25), _22(2, 'o', 'o'), _23(2, "global_barrier_id", "global_achive_barrier_id"), _24(NULL), _25("gs_get_global_barrier_status"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -3517,6 +3545,14 @@
"gs_get_obs_file_context", 1,
AddBuiltinFunc(_0(5128), _1("gs_get_obs_file_context"), _2(2), _3(true), _4(false), _5(gs_get_obs_file_context), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(2, 2275, 2275), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_get_obs_file_context"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL))
),
+ AddFuncGroup(
+ "gs_get_parallel_decode_status", 1,
+ AddBuiltinFunc(_0(9377), _1("gs_get_parallel_decode_status"), _2(0), _3(false), _4(true), _5(gs_get_parallel_decode_status), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(4, 25, 23, 25, 25), _22(4, 'o', 'o', 'o', 'o'), _23(4, "slot_name", "parallel_decode_num", "read_change_queue_length", "decode_change_queue_length"), _24(NULL), _25("gs_get_parallel_decode_status"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_get_standby_cluster_barrier_status", 1,
+ AddBuiltinFunc(_0(9039), _1("gs_get_standby_cluster_barrier_status"), _2(0), _3(true), _4(false), _5(gs_get_standby_cluster_barrier_status), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(0), _21(4, 25, 25, 25, 25), _22(4, 'o', 'o', 'o', 'o'), _23(4, "barrier_id", "barrier_lsn", "recovery_id", "target_id"), _24(NULL), _25("gs_get_standby_cluster_barrier_status"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"gs_hadr_do_switchover", 1,
AddBuiltinFunc(_0(9136), _1("gs_hadr_do_switchover"), _2(0), _3(true), _4(false), _5(gs_hadr_do_switchover), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(0), _21(1, 16), _22(1, 'o'), _23(1, "service_truncation_result"), _24(NULL), _25("gs_hadr_do_switchover"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -3531,15 +3567,23 @@
),
AddFuncGroup(
"gs_hadr_local_rto_and_rpo_stat", 1,
- AddBuiltinFunc(_0(5077), _1("gs_hadr_local_rto_and_rpo_stat"), _2(0), _3(false), _4(true), _5(gs_hadr_local_rto_and_rpo_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(11,25,25,25,23,25,23,20,20,20,20,20), _22(11,'o','o','o','o','o','o','o','o','o','o','o'), _23(11,"hadr_sender_node_name", "hadr_receiver_node_name", "source_ip", "source_port", "dest_ip", "dest_port", "current_rto", "target_rto", "current_rpo", "target_rpo", "current_sleep_time"), _24(NULL), _25("gs_hadr_local_rto_and_rpo_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(5077), _1("gs_hadr_local_rto_and_rpo_stat"), _2(0), _3(false), _4(true), _5(gs_hadr_local_rto_and_rpo_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(12,25,25,25,23,25,23,20,20,20,20,20,20), _22(12,'o','o','o','o','o','o','o','o','o','o','o','o'), _23(12,"hadr_sender_node_name", "hadr_receiver_node_name", "source_ip", "source_port", "dest_ip", "dest_port", "current_rto", "target_rto", "current_rpo", "target_rpo", "rto_sleep_time", "rpo_sleep_time"), _24(NULL), _25("gs_hadr_local_rto_and_rpo_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"gs_hadr_remote_rto_and_rpo_stat", 1,
- AddBuiltinFunc(_0(5078), _1("gs_hadr_remote_rto_and_rpo_stat"), _2(0), _3(false), _4(true), _5(gs_hadr_remote_rto_and_rpo_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(11,25,25,25,23,25,23,20,20,20,20,20), _22(11,'o','o','o','o','o','o','o','o','o','o','o'), _23(11,"hadr_sender_node_name", "hadr_receiver_node_name", "source_ip", "source_port", "dest_ip", "dest_port", "current_rto", "target_rto", "current_rpo", "target_rpo", "current_sleep_time"), _24(NULL), _25("gs_hadr_remote_rto_and_rpo_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(5078), _1("gs_hadr_remote_rto_and_rpo_stat"), _2(0), _3(false), _4(true), _5(gs_hadr_remote_rto_and_rpo_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(12,25,25,25,23,25,23,20,20,20,20,20,20), _22(12,'o','o','o','o','o','o','o','o','o','o','o','o'), _23(12,"hadr_sender_node_name", "hadr_receiver_node_name", "source_ip", "source_port", "dest_ip", "dest_port", "current_rto", "target_rto", "current_rpo", "target_rpo", "rto_sleep_time", "rpo_sleep_time"), _24(NULL), _25("gs_hadr_remote_rto_and_rpo_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"gs_index_advise", 1,
- AddBuiltinFunc(_0(4888), _1("gs_index_advise"), _2(1), _3(false), _4(true), _5(gs_index_advise), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 2275), _21(3, 25, 25, 25), _22(3, 'o', 'o', 'o'), _23(3, "schema", "table", "column"), _24(NULL), _25("gs_index_advise"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(4888), _1("gs_index_advise"), _2(1), _3(false), _4(true), _5(gs_index_advise), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 2275), _21(5, 2275, 25, 25, 25, 25), _22(5, 'i', 'o', 'o', 'o', 'o'), _23(5, "sql_string", "schema", "table", "column", "indextype"), _24(NULL), _25("gs_index_advise"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_index_verify", 1,
+ AddBuiltinFunc(_0(9150), _1("gs_index_verify"), _2(2), _3(false), _4(true), _5(gs_index_verify), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 26, 26), _21(5, 26, 26, 25, 26, 25), _22(5, 'i', 'i', 'o' , 'o', 'o'), _23(5, "oid", "blkno", "ptype", "blkno", "status"), _24(NULL), _25("gs_index_verify"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("Verify ubtree index"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_index_recycle_queue", 1,
+ AddBuiltinFunc(_0(9151), _1("gs_index_recycle_queue"), _2(3), _3(false), _4(true), _5(gs_index_recycle_queue), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(3, 26, 26, 26), _21(9, 26, 26, 26, 26, 26, 25, 26, 26, 26), _22(9, 'i', 'i','i', 'o', 'o', 'o', 'o', 'o', 'o'), _23(9, "oid", "type", "blkno", "rblkno", "item_offset", "xid", "dblkno", "prev", "next"), _24(NULL), _25("gs_index_recycle_queue"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("Query recyle queue of ubtree"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"gs_io_wait_status", 1,
@@ -3549,6 +3593,10 @@
"gs_is_recycle_object", 1,
AddBuiltinFunc(_0(4895), _1("gs_is_recycle_object"), _2(3), _3(false), _4(false), _5(gs_is_recycle_object), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(3, 23, 23, 19), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_is_recycle_object"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "gs_parse_page_bypath", 1,
+ AddBuiltinFunc(_0(2620), _1("gs_parse_page_bypath"), _2(4), _3(true), _4(false), _5(gs_parse_page_bypath), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(4, 25, 20, 25, 16), _21(5, 25, 20, 25, 16, 25), _22(5, 'i', 'i', 'i', 'i', 'o'), _23(5, "path", "blocknum", "relation_type", "read_memory", "output_filepath"), _24(NULL), _25("gs_parse_page_bypath"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("parse data page to output file based on given filepath"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"gs_password_deadline", 1,
AddBuiltinFunc(_0(3469), _1("gs_password_deadline"), _2(0), _3(true), _4(false), _5(gs_password_deadline), _6(1186), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(0), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_password_deadline"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -3557,15 +3605,30 @@
"gs_password_notifytime", 1,
AddBuiltinFunc(_0(3470), _1("gs_password_notifytime"), _2(0), _3(true), _4(false), _5(gs_password_notifytime), _6(23), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(0), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_password_notifytime"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
- AddFuncGroup(
- "gs_read_block_from_remote", 2,
- AddBuiltinFunc(_0(4767), _1("gs_read_block_from_remote"), _2(9), _3(true), _4(false), _5(gs_read_block_from_remote), _6(17), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(9, 23, 23, 23, 21, 23, 28, 23, 28, 16), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_read_block_from_remote"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false)),
- AddBuiltinFunc(_0(4768), _1("gs_read_block_from_remote"), _2(10), _3(true), _4(false), _5(gs_read_block_from_remote_compress), _6(17), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(10, 23, 23, 23, 21, 21, 23, 28, 23, 28, 16), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_read_block_from_remote_compress"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false))
- ),
AddFuncGroup(
"gs_paxos_stat_replication", 1,
AddBuiltinFunc(_0(4650), _1("gs_paxos_stat_replication"), _2(0), _3(false), _4(true), _5(gs_paxos_stat_replication), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(10), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(16, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25), _22(16, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(16, "local_role", "peer_role", "local_dcf_role", "peer_dcf_role", "peer_state", "sender_write_location", "sender_commit_location", "sender_flush_location", "sender_replay_location", "receiver_write_location", "receiver_commit_location", "receiver_flush_location", "receiver_replay_location", "sync_percent", "dcf_run_mode", "channel"), _24(NULL), _25("gs_paxos_stat_replication"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "gs_pitr_archive_slot_force_advance", 1,
+ AddBuiltinFunc(_0(4580), _1("gs_pitr_archive_slot_force_advance"), _2(0), _3(false), _4(false), _5(gs_pitr_archive_slot_force_advance), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 2275), _21(2, 2275, 25), _22(2, 'i', 'o'), _23(2, "stop_barrier_timestamp", "archive_restart_lsn"), _24(NULL), _25("gs_pitr_archive_slot_force_advance"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_pitr_clean_history_global_barriers", 1,
+ AddBuiltinFunc(_0(4581), _1("gs_pitr_clean_history_global_barriers"), _2(0), _3(false), _4(false), _5(gs_pitr_clean_history_global_barriers), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 2275), _21(2, 2275, 25), _22(2, 'i', 'o'), _23(2, "stop_barrier_timestamp", "oldest_barrier_record"), _24(NULL), _25("gs_pitr_clean_history_global_barriers"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_pitr_get_warning_for_xlog_force_recycle", 1,
+ AddBuiltinFunc(_0(4582), _1("gs_pitr_get_warning_for_xlog_force_recycle"), _2(0), _3(false), _4(false), _5(gs_pitr_get_warning_for_xlog_force_recycle), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(0), _21(1, 16), _22(1, 'o'), _23(1, "xlog_force_recycled"), _24(NULL), _25("gs_pitr_get_warning_for_xlog_force_recycle"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_query_standby_cluster_barrier_id_exist", 1,
+ AddBuiltinFunc(_0(9038), _1("gs_query_standby_cluster_barrier_id_exist"), _2(1), _3(true), _4(false), _5(gs_query_standby_cluster_barrier_id_exist), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(1, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_query_standby_cluster_barrier_id_exist"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_read_block_from_remote", 1,
+ AddBuiltinFunc(_0(4767), _1("gs_read_block_from_remote"), _2(10), _3(true), _4(false), _5(gs_read_block_from_remote), _6(17), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(10, 26, 26, 26, 21, 23, 28, 23, 28, 16, 23), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_read_block_from_remote"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"gs_respool_exception_info", 1,
AddBuiltinFunc(_0(4501), _1("gs_respool_exception_info"), _2(1), _3(true), _4(true), _5(gs_respool_exception_info), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(1, 2275), _21(6, 25, 25, 25, 25, 25, 20), _22(6, 'o', 'o', 'o', 'o', 'o', 'o'), _23(6, "name", "class", "workload", "rule", "type", "value"), _24(NULL), _25("gs_respool_exception_info"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -3598,6 +3661,10 @@
"gs_set_obs_file_context",1,
AddBuiltinFunc(_0(5129), _1("gs_set_obs_file_context"), _2(3), _3(true), _4(false), _5(gs_set_obs_file_context), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(3, 2275, 2275, 2275), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_set_obs_file_context"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL))
),
+ AddFuncGroup(
+ "gs_set_standby_cluster_target_barrier_id", 1,
+ AddBuiltinFunc(_0(9037), _1("gs_set_standby_cluster_target_barrier_id"), _2(1), _3(true), _4(false), _5(gs_set_standby_cluster_target_barrier_id), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_set_standby_cluster_target_barrier_id"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"gs_space_shrink", 1,
AddBuiltinFunc(_0(7002), _1("gs_space_shrink"), _2(4), _3(true), _4(false), _5(gs_space_shrink), _6(20), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(10000), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(4, INT4OID, INT4OID, INT4OID, INT4OID), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_space_shrink"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -3610,6 +3677,14 @@
"global_space_shrink", 1,
AddBuiltinFunc(_0(7008), _1("global_space_shrink"), _2(4), _3(true), _4(false), _5(global_space_shrink), _6(20), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(10000), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, TEXTOID, TEXTOID), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("global_space_shrink"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "gs_get_session_memctx_detail", 1,
+ AddBuiltinFunc(_0(5254), _1("gs_get_session_memctx_detail"), _2(1), _3(false), _4(true), _5(gs_get_session_memctx_detail), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 25), _21(4, 25, 25, 20, 20), _22(4, 'i', 'o', 'o', 'o'), _23(4, "context_name", "file", "line", "size"), _24(NULL), _25("gs_get_session_memctx_detail"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_get_shared_memctx_detail", 1,
+ AddBuiltinFunc(_0(5255), _1("gs_get_shared_memctx_detail"), _2(1), _3(false), _4(true), _5(gs_get_shared_memctx_detail), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 25), _21(4, 25, 25, 20, 20), _22(4, 'i', 'o', 'o', 'o'), _23(4, "context_name", "file", "line", "size"), _24(NULL), _25("gs_get_shared_memctx_detail"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"gs_stat_activity_timeout", 1,
AddBuiltinFunc(_0(4520), _1("gs_stat_activity_timeout"), _2(1), _3(false), _4(true), _5(gs_stat_activity_timeout), _6(2249), _7(PG_DBEPERF_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 23), _21(10, 23, 19, 20, 20, 26, 25, 25, 1184, 1184, 20), _22(10, 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(10, "timeout_threshold", "database", "pid", "sessionid", "usesysid", "application_name", "query", "xact_start", "query_start", "query_id"), _24(NULL), _25("gs_stat_activity_timeout"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -3646,6 +3721,10 @@
"gs_switch_relfilenode", 1,
AddBuiltinFunc(_0(4049), _1("gs_switch_relfilenode"), _2(2), _3(true), _4(false), _5(pg_switch_relfilenode_name), _6(20), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(3, 2205, 2205, 23), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("pg_switch_relfilenode_name"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "gs_get_thread_memctx_detail", 1,
+ AddBuiltinFunc(_0(5256), _1("gs_get_thread_memctx_detail"), _2(2), _3(false), _4(true), _5(gs_get_thread_memctx_detail), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 20, 25), _21(5, 20, 25, 25, 20, 20), _22(5, 'i', 'i', 'o', 'o', 'o'), _23(5, "threadid", "context_name", "file", "line", "size"), _24(NULL), _25("gs_get_thread_memctx_detail"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"gs_total_nodegroup_memory_detail", 1,
AddBuiltinFunc(_0(2847), _1("gs_total_nodegroup_memory_detail"), _2(0), _3(true), _4(true), _5(gs_total_nodegroup_memory_detail), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(0), _21(3, 25, 25, 23), _22(3, 'o', 'o', 'o'), _23(3, "ngname", "memorytype", "memorymbytes"), _24(NULL), _25("gs_total_nodegroup_memory_detail"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -3656,11 +3735,19 @@
),
AddFuncGroup(
"gs_undo_meta", 1,
- AddBuiltinFunc(_0(4430), _1("gs_undo_meta"), _2(3), _3(false), _4(true), _5(gs_undo_meta), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(3, 23, 23, 23), _21(7, 26, 26, 25, 25, 25, 25, 25), _22(7, 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(7, "zoneId", "persistType", "insert", "discard", "end", "used", "lsn"), _24(NULL), _25("gs_undo_meta"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(4430), _1("gs_undo_meta"), _2(3), _3(false), _4(true), _5(gs_undo_meta), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(3, 23, 23, 23), _21(11, 23, 23, 23, 26, 26, 25, 25, 25, 25, 25, 26), _22(11, 'i', 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(11, "type", "zoneId", "location", "zoneId", "persistType", "insert", "discard", "end", "used", "lsn", "pid"), _24(NULL), _25("gs_undo_meta"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_stat_undo", 1,
+ AddBuiltinFunc(_0(4434), _1("gs_stat_undo"), _2(0), _3(false), _4(true), _5(gs_stat_undo), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(10, 23, 25, 23, 23, 26, 26, 26, 26, 23, 23), _22(10, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(10, "curr_used_zone_count", "top_used_zones", "curr_used_undo_size", "undo_threshold", "oldest_xid_in_undo", "oldest_xmin", "total_undo_chain_len", "max_undo_chain_len", "create_undo_file_count", "discard_undo_file_count"), _24(NULL), _25("gs_stat_undo"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"gs_undo_translot", 1,
- AddBuiltinFunc(_0(4431), _1("gs_undo_translot"), _2(2), _3(false), _4(true), _5(gs_undo_translot), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 23, 23), _21(5, 26, 25, 25, 25, 25), _22(5, 'o', 'o', 'o', 'o', 'o'), _23(5, "groupId", "xactId", "startUndoPtr", "endUndoPtr","lsn"), _24(NULL), _25("gs_undo_translot"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(4431), _1("gs_undo_translot"), _2(2), _3(false), _4(true), _5(gs_undo_translot), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 23, 23), _21(8, 23, 23, 26, 25, 25, 25, 25, 26), _22(8, 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o'), _23(8, "location", "zoneId", "groupId", "xactId", "startUndoPtr", "endUndoPtr","lsn", "slot_states"), _24(NULL), _25("gs_undo_translot"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_undo_record", 1,
+ AddBuiltinFunc(_0(4439), _1("gs_undo_record"), _2(1), _3(false), _4(true), _5(gs_undo_record), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 23), _21(12, 23, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25), _22(12, 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(12, "undoptr", "undoptr", "xid", "cid", "reloid", "relfilenode", "utype", "blkprev", "blockno", " uoffset", "prevurp", "payloadlen"), _24(NULL), _25("gs_undo_record"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false))
),
AddFuncGroup(
"gs_upload_obs_file", 1,
@@ -3726,6 +3813,34 @@
"gs_write_term_log", 1,
AddBuiltinFunc(_0(9376), _1("gs_write_term_log"), _2(1), _3(true), _4(false), _5(gs_write_term_log), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(1, 16), _22(1, 'o'), _23(1, "setTermDone"), _24(NULL), _25("gs_write_term_log"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL))
),
+ AddFuncGroup(
+ "gs_stat_wal_entrytable", 1,
+ AddBuiltinFunc(_0(2861), _1("gs_stat_wal_entrytable"), _2(1), _3(false), _4(true), _5(gs_stat_wal_entrytable), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 20), _21(5, 20, 28, 28, 23, 31), _22(5, 'i', 'o', 'o', 'o', 'o'), _23(5, "idx", "idx", "endlsn", "lrc", "status"), _24(NULL), _25("gs_stat_wal_entrytable"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_walwriter_flush_position", 1,
+ AddBuiltinFunc(_0(2862), _1("gs_walwriter_flush_position"), _2(1), _3(false), _4(true), _5(gs_walwriter_flush_position), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(12, 23, 23, 23, 28, 31, 28, 28, 28, 28, 28, 28, 1184), _22(12, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(12, "last_flush_status_entry", "last_scanned_lrc", "curr_lrc", "curr_byte_pos", "prev_byte_size", "flush_result", "send_result", "shm_rqst_write_pos", "shm_rqst_flush_pos", "shm_result_write_pos", "shm_result_flush_pos", "curr_time"), _24(NULL), _25("gs_walwriter_flush_position"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_walwriter_flush_stat", 1,
+ AddBuiltinFunc(_0(2863), _1("gs_walwriter_flush_stat"), _2(1), _3(false), _4(true), _5(gs_walwriter_flush_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 23), _21(17, 23, 28, 28, 28, 28, 31, 31, 31, 31, 28, 28, 31, 31, 28, 28, 1184, 1184), _22(17, 'i','o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(17, "operation", "write_times", "sync_times", "total_xlog_sync_bytes", "total_actual_xlog_sync_bytes", "avg_write_bytes", "avg_actual_write_bytes", "avg_sync_bytes", "avg_actual_sync_bytes", "total_write_time", "total_sync_time", "avg_write_time", "avg_sync_time", "curr_init_xlog_segno", "curr_open_xlog_segno", "last_reset_time", "curr_time"), _24(NULL), _25("gs_walwriter_flush_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_xlogdump_lsn", 1,
+ AddBuiltinFunc(_0(2619), _1("gs_xlogdump_lsn"), _2(2), _3(true), _4(false), _5(gs_xlogdump_lsn), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 25, 25), _21(3, 25, 25, 25), _22(3, 'i', 'i', 'o'), _23(3, "start_lsn", "end_lsn", "output_filepath"), _24(NULL), _25("gs_xlogdump_lsn"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("dump xlog records to output file based on the given start_lsn and end_lsn"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_xlogdump_xid", 1,
+ AddBuiltinFunc(_0(2617), _1("gs_xlogdump_xid"), _2(1), _3(true), _4(false), _5(gs_xlogdump_xid), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 28), _21(2, 28, 25), _22(2, 'i', 'o'), _23(2, "c_xid", "output_filepath"), _24(NULL), _25("gs_xlogdump_xid"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("dump xlog records to output file based on the given xid"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_xlogdump_tablepath", 1,
+ AddBuiltinFunc(_0(2616), _1("gs_xlogdump_tablepath"), _2(3), _3(true), _4(false), _5(gs_xlogdump_tablepath), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(3, 25, 20, 25), _21(4, 25, 20, 25, 25), _22(4, 'i', 'i', 'i', 'o'), _23(4, "path", "blocknum", "relation_type", "output_filepath"), _24(NULL), _25("gs_xlogdump_tablepath"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("dump xlog records to output file based on given filepath"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_xlogdump_parsepage_tablepath", 1,
+ AddBuiltinFunc(_0(2618), _1("gs_xlogdump_parsepage_tablepath"), _2(4), _3(true), _4(false), _5(gs_xlogdump_parsepage_tablepath), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(4, 25, 20, 25, 16), _21(5, 25, 20, 25, 16, 25), _22(5, 'i', 'i', 'i', 'i', 'o'), _23(5, "path", "blocknum", "relation_type", "read_memory", "output_filepath"), _24(NULL), _25("gs_xlogdump_parsepage_tablepath"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("parse data page to output file based on given filepath"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"gtsquery_compress", 1,
AddBuiltinFunc(_0(3695), _1("gtsquery_compress"), _2(1), _3(true), _4(false), _5(gtsquery_compress), _6(2281), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 2281), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gtsquery_compress"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("GiST tsquery support"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -3799,6 +3914,10 @@
AddBuiltinFunc(_0(3028), _1("has_any_column_privilege"), _2(2), _3(true), _4(false), _5(has_any_column_privilege_name), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(10), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 25, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("has_any_column_privilege_name"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("current user privilege on any column by rel name"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)),
AddBuiltinFunc(_0(3029), _1("has_any_column_privilege"), _2(2), _3(true), _4(false), _5(has_any_column_privilege_id), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(10), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 26, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("has_any_column_privilege_id"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("current user privilege on any column by rel oid"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "has_any_privilege", 1,
+ AddBuiltinFunc(_0(5571), _1("has_any_privilege"), _2(2), _3(true), _4(false), _5(has_any_privilege), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(2, 19, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("has_any_privilege"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33("current user privilege on database level"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"has_cek_privilege", 6,
AddBuiltinFunc(_0(9130), _1("has_cek_privilege"), _2(3), _3(true), _4(false), _5(has_cek_privilege_name_name), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(3, 19, 25, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("has_cek_privilege_name_name"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)),
@@ -6041,9 +6160,17 @@
"language_handler_out", 1,
AddBuiltinFunc(_0(2303), _1("language_handler_out"), _2(1), _3(true), _4(false), _5(language_handler_out), _6(2275), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 2280), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("language_handler_out"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("I/O"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "large_seq_rollback_ntree", 1,
+ AddBuiltinFunc(_0(6016), _1("large_seq_rollback_ntree"), _2(1), _3(true), _4(false), _5(large_sequence_rollback_node_tree), _6(194), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 194), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("large_sequence_rollback_node_tree"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "large_seq_upgrade_ntree", 1,
+ AddBuiltinFunc(_0(6017), _1("large_seq_upgrade_ntree"), _2(1), _3(true), _4(false), _5(large_sequence_upgrade_node_tree), _6(194), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 194), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("large_sequence_upgrade_node_tree"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"last", 1,
- AddBuiltinFunc(_0(6561), _1("last"), _2(1), _3(false), _4(false), _5(aggregate_dummy), _6(2283), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(true), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("aggregate_dummy"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'))
+ AddBuiltinFunc(_0(6561), _1("last"), _2(1), _3(false), _4(false), _5(aggregate_dummy), _6(2283), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(true), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("aggregate_dummy"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"last_day", 1,
@@ -6051,7 +6178,7 @@
),
AddFuncGroup(
"last_transition", 1,
- AddBuiltinFunc(_0(6559), _1("last_transition"), _2(2), _3(true), _4(false), _5(last_transition), _6(2283), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2283, 2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("last_transition"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'))
+ AddBuiltinFunc(_0(6559), _1("last_transition"), _2(2), _3(true), _4(false), _5(last_transition), _6(2283), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 2283, 2283), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("last_transition"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"last_value", 1,
@@ -6283,7 +6410,7 @@
),
AddFuncGroup(
"local_double_write_stat", 1,
- AddBuiltinFunc(_0(4384), _1("local_double_write_stat"), _2(0), _3(false), _4(true), _5(local_double_write_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(11, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20), _22(11, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(11, "node_name", "curr_dwn", "curr_start_page", "file_trunc_num", "file_reset_num", "total_writes", "low_threshold_writes", "high_threshold_writes", "total_pages", "low_threshold_pages", "high_threshold_pages"), _24(NULL), _25("local_double_write_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(4384), _1("local_double_write_stat"), _2(0), _3(false), _4(true), _5(local_double_write_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(12, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20), _22(12, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(12, "node_name", "curr_dwn", "curr_start_page", "file_trunc_num", "file_reset_num", "total_writes", "low_threshold_writes", "high_threshold_writes", "total_pages", "low_threshold_pages", "high_threshold_pages", "file_id"), _24(NULL), _25("local_double_write_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"local_pagewriter_stat", 1,
@@ -6297,6 +6424,10 @@
"local_redo_stat", 1,
AddBuiltinFunc(_0(4388), _1("local_redo_stat"), _2(0), _3(false), _4(true), _5(local_redo_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(23, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 25), _22(23, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(23, "node_name", "redo_start_ptr", "redo_start_time", "redo_done_time", "curr_time", "min_recovery_point", "read_ptr", "last_replayed_read_ptr", "recovery_done_ptr", "read_xlog_io_counter", "read_xlog_io_total_dur", "read_data_io_counter", "read_data_io_total_dur", "write_data_io_counter", "write_data_io_total_dur", "process_pending_counter", "process_pending_total_dur", "apply_counter", "apply_total_dur", "speed", "local_max_ptr", "primary_flush_ptr", "worker_info"), _24(NULL), _25("local_redo_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "local_redo_time_count", 1,
+ AddBuiltinFunc(_0(4391), _1("local_redo_time_count"), _2(0), _3(false), _4(true), _5(local_redo_time_count), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(19, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20), _22(19, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(19, "thread_name", "step1_total", "step1_count", "step2_total", "step2_count", "step3_total", "step3_count", "step4_total", "step4_count", "step5_total", "step5_count", "step6_total", "step6_count", "step7_total", "step7_count", "step8_total", "step8_count", "step9_total", "step9_count"), _24(NULL), _25("local_redo_time_count"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"local_rto_stat", 1,
AddBuiltinFunc(_0(3299), _1("local_rto_stat"), _2(0), _3(false), _4(true), _5(local_rto_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(2,25,25), _22(2, 'o', 'o'), _23(2, "node_name", "rto_info"), _24(NULL), _25("local_rto_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -6305,6 +6436,10 @@
"local_single_flush_dw_stat", 1,
AddBuiltinFunc(_0(4375), _1("local_single_flush_dw_stat"), _2(0), _3(false), _4(true), _5(local_single_flush_dw_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(6, 25, 25, 25, 25, 25, 25), _22(6, 'o', 'o', 'o', 'o', 'o', 'o'), _23(6, "node_name", "curr_dwn", "curr_start_page", "total_writes", "file_trunc_num", "file_reset_num"), _24(NULL), _25("local_single_flush_dw_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "local_xlog_redo_statics", 1,
+ AddBuiltinFunc(_0(4390), _1("local_xlog_redo_statics"), _2(0), _3(false), _4(true), _5(local_xlog_redo_statics), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(5, 25, 23, 23, 20, 20), _22(5, 'o', 'o', 'o', 'o', 'o'), _23(5, "xlog_type", "rmid", "info", "num", "extra"), _24(NULL), _25("local_xlog_redo_statics"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"locktag_decode", 1,
AddBuiltinFunc(_0(5730), _1("locktag_decode"), _2(1), _3(true), _4(false), _5(locktag_decode), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(1, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("locktag_decode"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -6799,7 +6934,7 @@
),
AddFuncGroup(
"nlssort", 1,
- AddBuiltinFunc(_0(1849), _1("nlssort"), _2(2), _3(false), _4(false), _5(nlssort), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 25, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("nlssort"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(1849), _1("nlssort"), _2(2), _3(false), _4(false), _5(nlssort), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(2, 25, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("nlssort"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(true), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"node_oid_name", 1,
@@ -7569,7 +7704,7 @@
),
AddFuncGroup(
"pg_create_physical_replication_slot_extern", 1,
- AddBuiltinFunc(_0(3790), _1("pg_create_physical_replication_slot_extern"), _2(3), _3(false), _4(false), _5(pg_create_physical_replication_slot_extern), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(3, 19, 16, 25), _21(5, 19, 16, 25, 25, 25), _22(5, 'i', 'i', 'i', 'o', 'o'), _23(5, "slotname", "dummy_standby", "extra_content", "slotname", "xlog_position"), _24(NULL), _25("pg_create_physical_replication_slot_extern"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(3790), _1("pg_create_physical_replication_slot_extern"), _2(4), _3(false), _4(false), _5(pg_create_physical_replication_slot_extern), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(4, 19, 16, 25, 16), _21(6, 19, 16, 25, 16, 25, 25), _22(6, 'i', 'i', 'i', 'i', 'o', 'o'), _23(6, "slotname", "dummy_standby", "extra_content", "need_recycle_xlog", "slotname", "xlog_position"), _24(NULL), _25("pg_create_physical_replication_slot_extern"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"pg_create_restore_point", 1,
@@ -7839,6 +7974,10 @@
"pg_logical_slot_get_changes", 1,
AddBuiltinFunc(_0(4216), _1("pg_logical_slot_get_changes"), _2(4), _3(false), _4(true), _5(pg_logical_slot_get_changes), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1000), _11(1000), _12(25), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(1), _20(4, 19, 25, 23, 1009), _21(7, 19, 25, 23, 1009, 25, 28, 25), _22(7, 'i', 'i', 'i', 'v', 'o', 'o', 'o'), _23(7, "slotname", "upto_lsn", "upto_nchanges", "options", "location", "xid", "data"), _24("({CONST :consttype 1009 :consttypmod -1 :constcollid 100 :constlen -1 :constbyval false :constisnull false :ismaxvalue false :location 74230 :constvalue 16 [ 64 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 ] :cursor_data :row_count 0 :cur_dno 0 :is_open false :found false :not_found false :null_open false :null_fetch false})"), _25("pg_logical_slot_get_changes"), _26(NULL), _27(NULL), _28(NULL), _29(1, 3), _30(false), _31(false), _32(false), _33("get changes from replication slot"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "pg_logical_get_area_changes", 1,
+ AddBuiltinFunc(_0(4978), _1("pg_logical_get_area_changes"), _2(6), _3(false), _4(true), _5(pg_logical_get_area_changes), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1000), _11(1000), _12(25), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(1), _20(6, 25, 25, 23, 19, 25, 1009), _21(9, 25, 25, 23, 19, 25, 1009, 25, 28, 25), _22(9, 'i', 'i', 'i', 'i', 'i', 'v', 'o', 'o', 'o'), _23(9, "start_lsn", "upto_lsn", "upto_nchanges", "plugin", "xlog_path", "options", "location", "xid", "data"), _24("({CONST :consttype 1009 :consttypmod -1 :constcollid 100 :constlen -1 :constbyval false :constisnull false :ismaxvalue false :location 74230 :constvalue 16 [ 64 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 ] :cursor_data :row_count 0 :cur_dno 0 :is_open false :found false :not_found false :null_open false :null_fetch false})"), _25("pg_logical_get_area_changes"), _26(NULL), _27(NULL), _28(NULL), _29(1, 3), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL))
+ ),
AddFuncGroup(
"pg_logical_slot_peek_binary_changes", 1,
AddBuiltinFunc(_0(4219), _1("pg_logical_slot_peek_binary_changes"), _2(4), _3(false), _4(true), _5(pg_logical_slot_peek_binary_changes), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1000), _11(1000), _12(25), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(1), _20(4, 19, 25, 23, 1009), _21(7, 19, 25, 23, 1009, 25, 28, 17), _22(7, 'i', 'i', 'i', 'v', 'o', 'o', 'o'), _23(7, "slotname", "upto_lsn", "upto_nchanges", "options", "location", "xid", "data"), _24("({CONST :consttype 1009 :consttypmod -1 :constcollid 100 :constlen -1 :constbyval false :constisnull false :ismaxvalue false :location 75218 :constvalue 16 [ 64 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 ] :cursor_data :row_count 0 :cur_dno 0 :is_open false :found false :not_found false :null_open false :null_fetch false})"), _25("pg_logical_slot_peek_binary_changes"), _26(NULL), _27(NULL), _28(NULL), _29(1, 3), _30(false), _31(false), _32(false), _33("peek at binary changes from replication slot"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -7943,10 +8082,6 @@
AddBuiltinFunc(_0(3827), _1("pg_read_binary_file"), _2(4), _3(true), _4(false), _5(pg_read_binary_file), _6(17), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(4, 25, 20, 20, 16), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("pg_read_binary_file"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("read bytea from a file"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)),
AddBuiltinFunc(_0(3828), _1("pg_read_binary_file"), _2(1), _3(true), _4(false), _5(pg_read_binary_file_all), _6(17), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(1, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("pg_read_binary_file_all"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("read bytea from a file"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
- AddFuncGroup(
- "pg_read_binary_file_blocks", 1,
- AddBuiltinFunc(_0(8413), _1("pg_read_binary_file_blocks"), _2(3), _3(true), _4(true), _5(pg_read_binary_file_blocks), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(100), _11(20), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(3, 25, 20, 20), _21(7, 25, 20, 20, 25, 23, 23, 17), _22(7, 'i', 'i', 'i', 'o', 'o', 'o', 'o'), _23(7, "input", "blocknum", "blockcount", "path", "blocknum", "len", "data"), _24(NULL), _25("pg_read_binary_file_blocks"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'))
- ),
AddFuncGroup(
"pg_read_file", 2,
AddBuiltinFunc(_0(2624), _1("pg_read_file"), _2(3), _3(true), _4(false), _5(pg_read_file), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(3, 25, 20, 20), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("pg_read_file"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("read text from a file - old version for adminpack 1.0"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0)),
@@ -8093,7 +8228,7 @@
),
AddFuncGroup(
"pg_stat_get_activity", 1,
- AddBuiltinFunc(_0(2022), _1("pg_stat_get_activity"), _2(1), _3(false), _4(true), _5(pg_stat_get_activity), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 20), _21(20, 20, 26, 20, 20, 26, 25, 25, 25, 16, 1184, 1184, 1184, 1184, 869, 25, 23, 25, 20, 19, 25), _22(20, 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(20, "pid", "datid", "pid", "sessionid", "usesysid", "application_name", "state", "query", "waiting", "xact_start", "query_start", "backend_start", "state_change", "client_addr", "client_hostname", "client_port", "enqueue", "query_id", "srespool", "global_sessionid"), _24(NULL), _25("pg_stat_get_activity"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("statistics: information about currently active backends"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(2022), _1("pg_stat_get_activity"), _2(1), _3(false), _4(true), _5(pg_stat_get_activity), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 20), _21(22, 20, 26, 20, 20, 26, 25, 25, 25, 16, 1184, 1184, 1184, 1184, 869, 25, 23, 25, 20, 19, 25, 20, 25), _22(22, 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(22, "pid", "datid", "pid", "sessionid", "usesysid", "application_name", "state", "query", "waiting", "xact_start", "query_start", "backend_start", "state_change", "client_addr", "client_hostname", "client_port", "enqueue", "query_id", "srespool", "global_sessionid", "unique_sql_id", "trace_id"), _24(NULL), _25("pg_stat_get_activity"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("statistics: information about currently active backends"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"pg_stat_get_activity_for_temptable", 1,
@@ -8105,7 +8240,7 @@
),
AddFuncGroup(
"pg_stat_get_activity_with_conninfo", 1,
- AddBuiltinFunc(_0(4212), _1("pg_stat_get_activity_with_conninfo"), _2(1), _3(false), _4(true), _5(pg_stat_get_activity_with_conninfo), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 20), _21(21, 20, 26, 20, 20, 26, 25, 25, 25, 16, 1184, 1184, 1184, 1184, 869, 25, 23, 25, 20, 25, 19, 25), _22(21, 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(21, "pid", "datid", "pid", "sessionid", "usesysid", "application_name", "state", "query", "waiting", "xact_start", "query_start", "backend_start", "state_change", "client_addr", "client_hostname", "client_port", "enqueue", "query_id", "connection_info", "srespool", "global_sessionid"), _24(NULL), _25("pg_stat_get_activity_with_conninfo"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(4212), _1("pg_stat_get_activity_with_conninfo"), _2(1), _3(false), _4(true), _5(pg_stat_get_activity_with_conninfo), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 20), _21(23, 20, 26, 20, 20, 26, 25, 25, 25, 16, 1184, 1184, 1184, 1184, 869, 25, 23, 25, 20, 25, 19, 25, 20, 25), _22(23, 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(23, "pid", "datid", "pid", "sessionid", "usesysid", "application_name", "state", "query", "waiting", "xact_start", "query_start", "backend_start", "state_change", "client_addr", "client_hostname", "client_port", "enqueue", "query_id", "connection_info", "srespool", "global_sessionid", "unique_sql_id", "trace_id"), _24(NULL), _25("pg_stat_get_activity_with_conninfo"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"pg_stat_get_analyze_count", 1,
@@ -8640,10 +8775,6 @@
"pg_stat_segment_extent_usage", 1,
AddBuiltinFunc(_0(7001), _1("pg_stat_segment_extent_usage"), _2(4), _3(true), _4(true), _5(pg_stat_segment_extent_usage), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1000), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(4, INT4OID, INT4OID, INT4OID, INT4OID), _21(5, OIDOID, OIDOID, TEXTOID, OIDOID, OIDOID), _22(5, 'o', 'o', 'o', 'o', 'o'), _23(5, "start_block", "extent_size", "usage_type", "ower_location", "special_data"), _24(NULL), _25("pg_stat_segment_extent_usage"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
- AddFuncGroup(
- "pg_stat_segment_space_info", 1,
- AddBuiltinFunc(_0(7000), _1("pg_stat_segment_space_info"), _2(2), _3(true), _4(true), _5(pg_stat_segment_space_info), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(100), _11(4), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(2, INT4OID, INT4OID), _21(8, TEXTOID, OIDOID, INT4OID, OIDOID, OIDOID, OIDOID, FLOAT4OID, OIDOID), _22(8, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(8, "node_name", "extent_size", "forknum", "total_blocks", "meta_data_blocks", "used_data_blocks", "utilization", "high_water_mark"), _24(NULL), _25("pg_stat_segment_space_info"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
- ),
AddFuncGroup(
"local_segment_space_info", 1,
AddBuiltinFunc(_0(7005), _1("local_segment_space_info"), _2(2), _3(true), _4(true), _5(local_segment_space_info), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(100), _11(4), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(2, TEXTOID, TEXTOID), _21(8, TEXTOID, OIDOID, INT4OID, OIDOID, OIDOID, OIDOID, FLOAT4OID, OIDOID), _22(8, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(8, "node_name", "extent_size", "forknum", "total_blocks", "meta_data_blocks", "used_data_blocks", "utilization", "high_water_mark"), _24(NULL), _25("local_segment_space_info"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -8803,6 +8934,22 @@
"pg_xlogfile_name_offset", 1,
AddBuiltinFunc(_0(2850), _1("pg_xlogfile_name_offset"), _2(1), _3(true), _4(false), _5(pg_xlogfile_name_offset), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 25), _21(3, 25, 25, 23), _22(3, 'i', 'o', 'o'), _23(3, "wal_location", "file_name", "file_offset"), _24(NULL), _25("pg_xlogfile_name_offset"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "pgxc_disaster_read_set", 1,
+ AddBuiltinFunc(_0(3268), _1("pgxc_disaster_read_set"), _2(1), _3(true), _4(false), _5(pgxc_disaster_read_set), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(1, 25), _21(2,25,16), _22(2, 'i', 'o'), _23(2, "","set_ok"), _24(NULL), _25("pgxc_disaster_read_set"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "pgxc_disaster_read_init", 1,
+ AddBuiltinFunc(_0(3269), _1("pgxc_disaster_read_init"), _2(0), _3(true), _4(false), _5(pgxc_disaster_read_init), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(0), _21(1,16), _22(1, 'o'), _23(1, "init_ok"), _24(NULL), _25("pgxc_disaster_read_init"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "pgxc_disaster_read_clear", 1,
+ AddBuiltinFunc(_0(3271), _1("pgxc_disaster_read_clear"), _2(0), _3(true), _4(false), _5(pgxc_disaster_read_clear), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(0), _21(1,16), _22(1, 'o'), _23(1, "clear_ok"), _24(NULL), _25("pgxc_disaster_read_clear"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "pgxc_disaster_read_status", 1,
+ AddBuiltinFunc(_0(3273), _1("pgxc_disaster_read_status"), _2(0), _3(true), _4(true), _5(pgxc_disaster_read_status), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(100), _11(100), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(0), _21(8, 26, 25, 25, 23, 25, 23, 20, 20), _22(8, 'o', 'o', 'o', 'o', 'o', 'o', 'o','o'), _23(8, "node_oid", "node_type", "host", "port", "host1", "port1", "xlogmaxcsn", "consistency_point_csn"), _24(NULL), _25("pgxc_disaster_read_status"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
AddFuncGroup(
"pgxc_get_csn", 1,
AddBuiltinFunc(_0(3960), _1("pgxc_get_csn"), _2(1), _3(true), _4(true), _5(pgxc_get_csn), _6(20), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(1, 28), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("pgxc_get_csn"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -9740,9 +9887,9 @@
"remote_ckpt_stat", 1,
AddBuiltinFunc(_0(4372), _1("remote_ckpt_stat"), _2(0), _3(false), _4(true), _5(remote_ckpt_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(7, 25, 25, 20, 20, 20, 20, 20), _22(7, 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(7, "node_name", "ckpt_redo_point", "ckpt_clog_flush_num", "ckpt_csnlog_flush_num", "ckpt_multixact_flush_num", "ckpt_predicate_flush_num", "ckpt_twophase_flush_num"), _24(NULL), _25("remote_ckpt_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
- AddFuncGroup(
+ AddFuncGroup(
"remote_double_write_stat", 1,
- AddBuiltinFunc(_0(4385), _1("remote_double_write_stat"), _2(0), _3(false), _4(true), _5(remote_double_write_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(11, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20), _22(11, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(11, "node_name", "curr_dwn", "curr_start_page", "file_trunc_num", "file_reset_num", "total_writes", "low_threshold_writes", "high_threshold_writes", "total_pages", "low_threshold_pages", "high_threshold_pages"), _24(NULL), _25("remote_double_write_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ AddBuiltinFunc(_0(4385), _1("remote_double_write_stat"), _2(0), _3(false), _4(true), _5(remote_double_write_stat), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(12, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20), _22(12, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(12, "node_name", "curr_dwn", "curr_start_page", "file_trunc_num", "file_reset_num", "total_writes", "low_threshold_writes", "high_threshold_writes", "total_pages", "low_threshold_pages", "high_threshold_pages", "file_id"), _24(NULL), _25("remote_double_write_stat"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
AddFuncGroup(
"remote_pagewriter_stat", 1,
@@ -11844,6 +11991,12 @@
"version", 1,
AddBuiltinFunc(_0(89), _1("version"), _2(0), _3(true), _4(false), _5(pgsql_version), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("pgsql_version"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+
+ AddFuncGroup(
+ "gs_explain_model", 1,
+ AddBuiltinFunc(_0(DB4AI_EXPLAIN_MODEL_OID), _1("gs_explain_model"), _2(1), _3(true), _4(false), _5(db4ai_explain_model), _6(25), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 25), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("db4ai_explain_model"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("explain machine learning model"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+
AddFuncGroup(
"void_in", 1,
AddBuiltinFunc(_0(2298), _1("void_in"), _2(1), _3(true), _4(false), _5(void_in), _6(2278), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(1, 2275), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("void_in"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33("I/O"), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
@@ -12011,3 +12164,39 @@
"zhprs_start", 1,
AddBuiltinFunc(_0(3792), _1("zhprs_start"), _2(3), _3(true), _4(false), _5(zhprs_start), _6(2281), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('i'), _19(0), _20(3, 2281, 23, 26), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("zhprs_start"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
),
+ AddFuncGroup(
+ "local_bad_block_info", 1,
+ AddBuiltinFunc(_0(4567), _1("local_bad_block_info"), _2(0), _3(false), _4(true), _5(local_bad_block_info), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(10, 25, 26, 26, 26, 23, 23, 23, 25, 1184, 1184), _22(10, 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'), _23(10, "node_name", "spc_node", "db_node", "rel_node", "bucket_node", "fork_num", "block_num", "file_path", "check_time", "repair_time"), _24(NULL), _25("local_bad_block_info"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "local_clear_bad_block_info", 1,
+ AddBuiltinFunc(_0(4568), _1("local_clear_bad_block_info"), _2(0), _3(false), _4(true), _5(local_clear_bad_block_info), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(0), _21(1, 16), _22(1, 'o'), _23(1, "result"), _24(NULL), _25("local_clear_bad_block_info"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_verify_and_tryrepair_page", 1,
+ AddBuiltinFunc(_0(4569), _1("gs_verify_and_tryrepair_page"), _2(4), _3(true), _4(true), _5(gs_verify_and_tryrepair_page), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(4, 25, 23, 16, 16), _21(10, 25, 26, 16, 16, 25, 25, 26, 25, 25, 16), _22(10, 'i', 'i', 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o'), _23(10, "path", "blocknum", "verify_mem", "is_segment", "node_name", "path", "blocknum", "disk_page_res", "mem_page_res", "is_repair"), _24(NULL), _25("gs_verify_and_tryrepair_page"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_repair_page", 1,
+ AddBuiltinFunc(_0(4570), _1("gs_repair_page"), _2(4), _3(true), _4(true), _5(gs_repair_page), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(4, 25, 26, 16, 23), _21(5, 25, 26, 16, 23, 16), _22(5, 'i', 'i', 'i', 'i', 'o'), _23(5, "path", "blocknum", "is_segment", "timeout", "result"), _24(NULL), _25("gs_repair_page"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_verify_data_file", 1,
+ AddBuiltinFunc(_0(4571), _1("gs_verify_data_file"), _2(1), _3(true), _4(true), _5(gs_verify_data_file), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(1), _20(1, 16), _21(5, 16, 25, 26, 25, 25), _22(5, 'i', 'o', 'o', 'o', 'o'), _23(5, "verify_segment", "node_name", "rel_oid", "rel_name", "miss_file_path"), _24("({CONST :consttype 16 :consttypmod -1 :constcollid 0 :constlen 1 :constbyval true :constisnull false :ismaxvalue false :location 79 :constvalue 1 [ 0 0 0 0 0 0 0 0 ] :cursor_data :row_count 0 :cur_dno -1 :is_open false :found false :not_found false :null_open false :null_fetch false})"), _25("gs_verify_data_file"), _26(NULL), _27(NULL), _28(NULL), _29(1, 0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_read_file_from_remote", 1,
+ AddBuiltinFunc(_0(4768), _1("gs_read_file_from_remote"), _2(8), _3(true), _4(false), _5(gs_read_file_from_remote), _6(2249), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(8, 26, 26, 26, 23, 23, 23, 28, 23), _21(10, 26, 26, 26, 23, 23, 23, 28, 23, 17, 28), _22(10,'i','i','i','i','i','i','i','i','o','o'), _23(NULL), _24(NULL), _25("gs_read_file_from_remote"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_read_file_size_from_remote", 1,
+ AddBuiltinFunc(_0(4769), _1("gs_read_file_size_from_remote"), _2(7), _3(true), _4(false), _5(gs_read_file_size_from_remote), _6(20), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(7, 26, 26, 26, 23, 23, 28, 23), _21(8, 26, 26, 26, 23, 23, 28, 23, 20), _22(8,'i','i','i','i','i','i','i','o'), _23(NULL), _24(NULL), _25("gs_read_file_size_from_remote"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_read_segment_block_from_remote", 1,
+ AddBuiltinFunc(_0(4770), _1("gs_read_segment_block_from_remote"), _2(11), _3(true), _4(false), _5(gs_read_segment_block_from_remote), _6(17), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(0), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('v'), _19(0), _20(11, 26, 26, 26, 21, 23, 28, 23, 28, 26, 26, 23), _21(NULL), _22(NULL), _23(NULL), _24(NULL), _25("gs_read_segment_block_from_remote"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(NULL), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
+ AddFuncGroup(
+ "gs_repair_file", 1,
+ AddBuiltinFunc(_0(4771), _1("gs_repair_file"), _2(3), _3(true), _4(true), _5(gs_repair_file), _6(16), _7(PG_CATALOG_NAMESPACE), _8(BOOTSTRAP_SUPERUSERID), _9(INTERNALlanguageId), _10(1), _11(1000), _12(0), _13(0), _14(false), _15(false), _16(false), _17(false), _18('s'), _19(0), _20(3, 26, 25, 23), _21(3, 26, 25, 23), _22(3, 'i', 'i', 'i'), _23(3, "tableoid", "path", "timeout"), _24(NULL), _25("gs_repair_file"), _26(NULL), _27(NULL), _28(NULL), _29(0), _30(false), _31(false), _32(false), _33(NULL), _34('f'), _35(NULL), _36(0), _37(false), _38(NULL), _39(NULL), _40(0))
+ ),
diff --git a/src/common/backend/catalog/catalog.cpp b/src/common/backend/catalog/catalog.cpp
index 28524fa0f..d5c9099c0 100644
--- a/src/common/backend/catalog/catalog.cpp
+++ b/src/common/backend/catalog/catalog.cpp
@@ -534,7 +534,10 @@ RelFileNodeForkNum relpath_to_filenode(char* path)
/* check tablespace version directory */
token = strtok_r(NULL, "/", &tmptoken);
- Assert(token != NULL);
+ if (NULL == token) {
+ pfree(parsepath);
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid relation file path %s.", path)));
+ }
char tblspcversiondir[MAXPGPATH];
int errorno = snprintf_s(tblspcversiondir,
@@ -644,6 +647,14 @@ bool IsSystemClass(Form_pg_class reltuple)
return IsSystemNamespace(relnamespace) || IsToastNamespace(relnamespace) || IsPackageSchemaOid(relnamespace);
}
+bool IsSysSchema(Oid namespaceId)
+{
+ if (namespaceId == PG_PUBLIC_NAMESPACE) {
+ return false;
+ }
+ return namespaceId < FirstNormalObjectId;
+}
+
/*
* IsCatalogRelation
* True iff the relation is a system catalog, or the toast table for
@@ -1018,7 +1029,7 @@ Oid GetNewRelFileNode(Oid reltablespace, Relation pg_class, char relpersistence)
/* This logic should match RelationInitPhysicalAddr */
rnode.node.spcNode = ConvertToRelfilenodeTblspcOid(reltablespace);
- rnode.node.dbNode = (rnode.node.spcNode == GLOBALTABLESPACE_OID) ? InvalidOid : u_sess->proc_cxt.MyDatabaseId;
+ rnode.node.dbNode = (rnode.node.spcNode == GLOBALTABLESPACE_OID) ? InvalidOid : GetMyDatabaseId();
rnode.node.bucketNode = InvalidBktId;
/*
diff --git a/src/common/backend/catalog/cstore_ctlg.cpp b/src/common/backend/catalog/cstore_ctlg.cpp
index ff4d1c548..4d9d97c2f 100644
--- a/src/common/backend/catalog/cstore_ctlg.cpp
+++ b/src/common/backend/catalog/cstore_ctlg.cpp
@@ -1,8 +1,8 @@
/*
- * Portions Copyright (c) 2021, openGauss Contributors
* Portions Copyright (c) 2020 Huawei Technologies Co.,Ltd.
* Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
+ * Portions Copyright (c) 2021, openGauss Contributors
*
* openGauss is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
diff --git a/src/common/backend/catalog/dependency.cpp b/src/common/backend/catalog/dependency.cpp
index 79446cac1..4a73e2de5 100644
--- a/src/common/backend/catalog/dependency.cpp
+++ b/src/common/backend/catalog/dependency.cpp
@@ -7,6 +7,7 @@
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
+ * Portions Copyright (c) 2021, openGauss Contributors
*
* IDENTIFICATION
* src/common/backend/catalog/dependency.cpp
@@ -20,6 +21,7 @@
#include "access/sysattr.h"
#include "access/xact.h"
#include "catalog/dependency.h"
+#include "catalog/gs_db_privilege.h"
#include "catalog/gs_encrypted_proc.h"
#include "catalog/gs_matview.h"
#include "catalog/gs_model.h"
@@ -148,6 +150,7 @@ static const Oid object_classes[MAX_OCLASS] = {
UserMappingRelationId, /* OCLASS_USER_MAPPING */
PgSynonymRelationId, /* OCLASS_SYNONYM */
DefaultAclRelationId, /* OCLASS_DEFACL */
+ DbPrivilegeId, /* OCLASS_DB_PRIVILEGE */
ExtensionRelationId, /* OCLASS_EXTENSION */
PgDirectoryRelationId, /* OCLASS_DIRECTORY */
PgJobRelationId, /* OCLASS_PG_JOB */
@@ -1399,6 +1402,11 @@ static void doDeletion(const ObjectAddress* object, int flags)
case OCLASS_DEFACL:
RemoveDefaultACLById(object->objectId);
break;
+
+ case OCLASS_DB_PRIVILEGE:
+ DropDbPrivByOid(object->objectId);
+ break;
+
#ifdef PGXC
case OCLASS_PGXC_CLASS:
RemovePgxcClass(object->objectId, IS_PGXC_DATANODE);
@@ -2436,6 +2444,9 @@ ObjectClass getObjectClass(const ObjectAddress* object)
case DefaultAclRelationId:
return OCLASS_DEFACL;
+ case DbPrivilegeId:
+ return OCLASS_DB_PRIVILEGE;
+
case ExtensionRelationId:
return OCLASS_EXTENSION;
case PgxcGroupRelationId:
@@ -3043,6 +3054,29 @@ char* getObjectDescription(const ObjectAddress* object)
break;
}
+ case OCLASS_DB_PRIVILEGE: {
+ Relation dbPrivRel = heap_open(DbPrivilegeId, AccessShareLock);
+ if (!RelationIsValid(dbPrivRel)) {
+ ereport(ERROR, (errmodule(MOD_SEC), errcode(ERRCODE_SYSTEM_ERROR),
+ errmsg("Could not open the relation gs_db_privilege."),
+ errcause("System error."), erraction("Contact engineer to support.")));
+ }
+
+ HeapTuple dbPrivTuple = SearchSysCache1(DBPRIVOID, ObjectIdGetDatum(object->objectId));
+ if (!HeapTupleIsValid(dbPrivTuple)) {
+ heap_close(dbPrivRel, AccessShareLock);
+ break;
+ }
+
+ bool isNull = false;
+ Datum datum = heap_getattr(
+ dbPrivTuple, Anum_gs_db_privilege_privilege_type, RelationGetDescr(dbPrivRel), &isNull);
+ appendStringInfo(&buffer, _("\"%s\""), text_to_cstring(DatumGetTextP(datum)));
+
+ ReleaseSysCache(dbPrivTuple);
+ heap_close(dbPrivRel, AccessShareLock);
+ break;
+ }
case OCLASS_EXTENSION: {
char* extname = NULL;
@@ -3132,10 +3166,16 @@ char* getObjectDescription(const ObjectAddress* object)
HeapTuple tup;
char *pubname;
Form_pg_publication_rel prform;
+ ScanKeyData scanKey[1];
+ ScanKeyInit(&scanKey[0], ObjectIdAttributeNumber, BTEqualStrategyNumber, F_OIDEQ,
+ ObjectIdGetDatum(object->objectId));
+ Relation rel = heap_open(PublicationRelRelationId, AccessShareLock);
+ SysScanDesc scanDesc = systable_beginscan(rel, PublicationRelObjectIndexId, true, NULL, 1, scanKey);
- tup = SearchSysCache1(PUBLICATIONREL, ObjectIdGetDatum(object->objectId));
+ tup = systable_getnext(scanDesc);
if (!HeapTupleIsValid(tup)) {
- elog(ERROR, "cache lookup failed for publication table %u", object->objectId);
+ ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("could not find tuple for publication %u", object->objectId)));
}
prform = (Form_pg_publication_rel)GETSTRUCT(tup);
@@ -3143,7 +3183,8 @@ char* getObjectDescription(const ObjectAddress* object)
appendStringInfo(&buffer, _("publication table %s in publication %s"), get_rel_name(prform->prrelid),
pubname);
- ReleaseSysCache(tup);
+ systable_endscan(scanDesc);
+ heap_close(rel, AccessShareLock);
break;
}
diff --git a/src/common/backend/catalog/gs_db_privilege.cpp b/src/common/backend/catalog/gs_db_privilege.cpp
new file mode 100644
index 000000000..cd5f5ec8f
--- /dev/null
+++ b/src/common/backend/catalog/gs_db_privilege.cpp
@@ -0,0 +1,398 @@
+/*
+ * Copyright (c) 2021 Huawei Technologies Co.,Ltd.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * -------------------------------------------------------------------------
+ *
+ * gs_db_privilege.cpp
+ * routines to support manipulation of the gs_db_privilege relation
+ *
+ * IDENTIFICATION
+ * src/common/backend/catalog/gs_db_privilege.cpp
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#include "access/heapam.h"
+#include "access/tableam.h"
+#include "catalog/gs_db_privilege.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_auth_members.h"
+#include "catalog/indexing.h"
+#include "miscadmin.h"
+#include "postgres.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/rel.h"
+#include "utils/lsyscache.h"
+
+/*
+ * In internal format grantees have been turned into Oids.
+ */
+typedef struct {
+ bool is_grant; /* true = GRANT, false = REVOKE */
+ bool admin_opt; /* with admin option */
+ List* privileges; /* list of DbPriv nodes */
+ List* grantees; /* list of grantees Oids */
+} InternalGrantDb;
+
+static void ExecuteGrantDbPriv(InternalGrantDb* stmt, Oid granteeId, DbPriv* priv, Relation dbPrivRel);
+static void ExecuteRevokeDbPriv(InternalGrantDb* stmt, Oid granteeId, DbPriv* priv, Relation dbPrivRel);
+
+/*
+ * Called to execute the utility commands GRANT and REVOKE ANY privileges
+ */
+void ExecuteGrantDbStmt(GrantDbStmt* stmt)
+{
+ InternalGrantDb istmt;
+ ListCell* granteeCell = NULL;
+ ListCell* privCell = NULL;
+
+ /* Turn the GrantDbStmt into the InternalGrantDb form. */
+ istmt.is_grant = stmt->is_grant;
+ istmt.privileges = stmt->privileges;
+ istmt.grantees = NIL; /* filled below */
+ istmt.admin_opt = stmt->admin_opt;
+
+ /*
+ * Grant ANY privileges to public operation and
+ * revoke ANY privileges from public operation are forbidden.
+ */
+ foreach (granteeCell, stmt->grantees) {
+ PrivGrantee* grantee = (PrivGrantee*)lfirst(granteeCell);
+ if (grantee->rolname == NULL) {
+ ereport(ERROR, (errmodule(MOD_SEC), errcode(ERRCODE_INVALID_GRANT_OPERATION),
+ errmsg("Invalid grant or revoke operation."),
+ errdetail("Forbid to grant ANY privileges to PUBLIC or revoke ANY privileges from PUBLIC."),
+ errcause("Forbid to grant ANY privileges to PUBLIC or revoke ANY privileges from PUBLIC."),
+ erraction("Don't grant ANY privileges to PUBLIC or revoke ANY privileges from PUBLIC.")));
+ } else {
+ istmt.grantees= lappend_oid(istmt.grantees, get_role_oid(grantee->rolname, false));
+ }
+ }
+
+ Relation dbPrivRel = heap_open(DbPrivilegeId, RowExclusiveLock);
+ if (!RelationIsValid(dbPrivRel)) {
+ ereport(ERROR, (errmodule(MOD_SEC), errcode(ERRCODE_SYSTEM_ERROR),
+ errmsg("Could not open the relation gs_db_privilege."),
+ errcause("System error."), erraction("Contact engineer to support.")));
+ }
+
+ foreach (granteeCell, istmt.grantees) {
+ Oid granteeId = lfirst_oid(granteeCell);
+
+ foreach (privCell, stmt->privileges) {
+ DbPriv* priv = (DbPriv*)lfirst(privCell);
+
+ if (stmt->is_grant) {
+ /* if stmt->is_grant = true, it means GRANT option */
+ ExecuteGrantDbPriv(&istmt, granteeId, priv, dbPrivRel);
+ } else {
+ /* if stmt->is_grant = false, it means REVOKE option */
+ ExecuteRevokeDbPriv(&istmt, granteeId, priv, dbPrivRel);
+ }
+ }
+ }
+
+ /* Close gs_db_privilege. */
+ heap_close(dbPrivRel, RowExclusiveLock);
+}
+
+/*
+ * Internal entry point for granting ANY privileges.
+ */
+void ExecuteGrantDbPriv(InternalGrantDb* stmt, Oid granteeId, DbPriv* priv, Relation dbPrivRel)
+{
+ /* Permission check. */
+ if (!HasSpecAnyPriv(GetUserId(), priv->db_priv_name, true)) {
+ ereport(ERROR, (errmodule(MOD_SEC), errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("Permission denied."), errdetail("Permission denied to grant %s.", priv->db_priv_name),
+ errcause("Insufficient privileges."), erraction("Change to the user with sufficient privileges.")));
+ }
+
+ HeapTuple dbPrivTuple = SearchSysCache2(
+ DBPRIVROLEPRIV, ObjectIdGetDatum(granteeId), CStringGetTextDatum(priv->db_priv_name));
+ TupleDesc dbPrivDsc = RelationGetDescr(dbPrivRel);
+
+ /* Build a tuple to insert or update */
+ Datum newRecord[Natts_gs_db_privilege] = {0};
+ bool newRecordNulls[Natts_gs_db_privilege] = {false};
+ bool newRecordRepl[Natts_gs_db_privilege] = {false};
+
+ newRecord[Anum_gs_db_privilege_roleid - 1] = ObjectIdGetDatum(granteeId);
+ newRecord[Anum_gs_db_privilege_privilege_type - 1] = CStringGetTextDatum(priv->db_priv_name);
+ newRecord[Anum_gs_db_privilege_admin_option - 1] = BoolGetDatum(stmt->admin_opt);
+
+ bool isNull = false;
+ HeapTuple tuple = NULL;
+ if (HeapTupleIsValid(dbPrivTuple)) {
+ /* If entry for this user' privilge already exists, just skip unless we are adding admin option. */
+ Datum datum = heap_getattr(dbPrivTuple, Anum_gs_db_privilege_admin_option, dbPrivDsc, &isNull);
+ if (!stmt->admin_opt || DatumGetBool(datum)) {
+ ReleaseSysCache(dbPrivTuple);
+ return;
+ }
+
+ /* Update the record in the gs_db_privilege table */
+ newRecordRepl[Anum_gs_db_privilege_admin_option - 1] = true;
+ tuple = (HeapTuple)tableam_tops_modify_tuple(dbPrivTuple, dbPrivDsc, newRecord, newRecordNulls, newRecordRepl);
+ simple_heap_update(dbPrivRel, &tuple->t_self, tuple);
+ CatalogUpdateIndexes(dbPrivRel, tuple);
+ ReleaseSysCache(dbPrivTuple);
+ } else {
+ /* Insert new record to the gs_db_privilege relation */
+ tuple = heap_form_tuple(dbPrivDsc, newRecord, newRecordNulls);
+ Oid newRowId = simple_heap_insert(dbPrivRel, tuple);
+ CatalogUpdateIndexes(dbPrivRel, tuple);
+
+ /* Add shared dependency on users in pg_shdepend */
+ ObjectAddress object;
+ object.classId = DbPrivilegeId;
+ object.objectId = newRowId;
+ object.objectSubId = 0;
+
+ ObjectAddress referenced;
+ referenced.classId = AuthIdRelationId;
+ referenced.objectId = granteeId;
+ referenced.objectSubId = 0;
+
+ recordSharedDependencyOn(&object, &referenced, SHARED_DEPENDENCY_DBPRIV);
+ }
+}
+
+/*
+ * Internal entry point for revoking ANY privileges.
+ */
+void ExecuteRevokeDbPriv(InternalGrantDb* stmt, Oid granteeId, DbPriv* priv, Relation dbPrivRel)
+{
+ /* Permission check. */
+ if (!HasSpecAnyPriv(GetUserId(), priv->db_priv_name, true)) {
+ ereport(ERROR, (errmodule(MOD_SEC), errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("Permission denied."), errdetail("Permission denied to revoke %s.", priv->db_priv_name),
+ errcause("Insufficient privileges."), erraction("Change to the user with sufficient privileges.")));
+ }
+
+ HeapTuple dbPrivTuple = SearchSysCache2(
+ DBPRIVROLEPRIV, ObjectIdGetDatum(granteeId), CStringGetTextDatum(priv->db_priv_name));
+ TupleDesc dbPrivDsc = RelationGetDescr(dbPrivRel);
+
+ /* Check if entry for this user' privilge exists, if not, just skip. */
+ if (!HeapTupleIsValid(dbPrivTuple)) {
+ return;
+ }
+
+ HeapTuple tuple = NULL;
+ if (!stmt->admin_opt) {
+ /* Remove the shared dependency */
+ deleteSharedDependencyRecordsFor(DbPrivilegeId, HeapTupleGetOid(dbPrivTuple), 0);
+ /* Remove the entry altogether */
+ simple_heap_delete(dbPrivRel, &dbPrivTuple->t_self);
+ } else {
+ /* Just turn off the admin option */
+ Datum newRecord[Natts_gs_db_privilege] = {0};
+ bool newRecordNulls[Natts_gs_db_privilege] = {false};
+ bool newRecordRepl[Natts_gs_db_privilege] = {false};
+
+ newRecord[Anum_gs_db_privilege_admin_option - 1] = BoolGetDatum(false);
+ newRecordRepl[Anum_gs_db_privilege_admin_option - 1] = true;
+
+ tuple = (HeapTuple)tableam_tops_modify_tuple(dbPrivTuple, dbPrivDsc, newRecord, newRecordNulls, newRecordRepl);
+ simple_heap_update(dbPrivRel, &tuple->t_self, tuple);
+ CatalogUpdateIndexes(dbPrivRel, tuple);
+ }
+ ReleaseSysCache(dbPrivTuple);
+}
+
+/*
+ * The role may have the specific privlege explicitly
+ * or may be a member of roles that have the privlege.
+ *
+ * roleId: the role to be checked
+ * priv: the ANY privilege to be checked
+ * isAdminOption: if true, return if the role has privilge to GRANT/REVOKE the ANY privilege
+ * if false, just return if the role has the ANY privilege
+ */
+bool HasSpecAnyPriv(Oid roleId, const char* priv, bool isAdminOption)
+{
+ if (superuser_arg(roleId)) {
+ return true;
+ }
+
+ HeapTuple dbPrivTuple = NULL;
+ List* roles_list = NIL;
+ ListCell* cell = NULL;
+
+ /*
+ * We have to do a careful search to see
+ * if roleId has the privileges of any suitable role.
+ */
+ roles_list = roles_has_privs_of(roleId);
+ foreach (cell, roles_list) {
+ Oid otherid = lfirst_oid(cell);
+ dbPrivTuple = SearchSysCache2(DBPRIVROLEPRIV, ObjectIdGetDatum(otherid), CStringGetTextDatum(priv));
+ if (!HeapTupleIsValid(dbPrivTuple)) {
+ continue;
+ }
+
+ if (!isAdminOption) {
+ ReleaseSysCache(dbPrivTuple);
+ return true;
+ }
+
+ bool isNull = false;
+ Datum datum = SysCacheGetAttr(DBPRIVROLEPRIV, dbPrivTuple, Anum_gs_db_privilege_admin_option, &isNull);
+ if (DatumGetBool(datum)) {
+ ReleaseSysCache(dbPrivTuple);
+ return true;
+ }
+ ReleaseSysCache(dbPrivTuple);
+ }
+ return false;
+}
+
+/*
+ * The role may have at least one of ANY privlege explicitly
+ * or may be a member of roles that have at least one of ANY privlege.
+ *
+ * roleId: the role to be checked
+ */
+bool HasOneOfAnyPriv(Oid roleId)
+{
+ bool result = false;
+ HeapTuple dbPrivTuple = NULL;
+ ListCell* cell = NULL;
+
+ if (superuser_arg(roleId)) {
+ return true;
+ }
+
+ /*
+ * We have to do a careful search to see
+ * if roleId has the privileges of any suitable role.
+ */
+ List* roles_list = roles_has_privs_of(roleId);
+ foreach (cell, roles_list) {
+ Oid otherid = lfirst_oid(cell);
+ dbPrivTuple = SearchSysCache1(DBPRIVROLE, ObjectIdGetDatum(otherid));
+ if (HeapTupleIsValid(dbPrivTuple)) {
+ result = true;
+ ReleaseSysCache(dbPrivTuple);
+ break;
+ }
+ }
+ return result;
+}
+
+typedef struct {
+ const char* name;
+ const char* priv;
+ bool adminOption;
+} DbPrivMap;
+
+static const DbPrivMap dbPrivMap[] = {{"CREATE ANY TABLE", "create any table", false},
+ {"CREATE ANY TABLE WITH ADMIN OPTION", "create any table", true},
+ {"ALTER ANY TABLE", "alter any table", false}, {"ALTER ANY TABLE WITH ADMIN OPTION", "alter any table", true},
+ {"DROP ANY TABLE", "drop any table", false}, {"DROP ANY TABLE WITH ADMIN OPTION", "drop any table", true},
+ {"SELECT ANY TABLE", "select any table", false}, {"SELECT ANY TABLE WITH ADMIN OPTION", "select any table", true},
+ {"INSERT ANY TABLE", "insert any table", false}, {"INSERT ANY TABLE WITH ADMIN OPTION", "insert any table", true},
+ {"UPDATE ANY TABLE", "update any table", false}, {"UPDATE ANY TABLE WITH ADMIN OPTION", "update any table", true},
+ {"DELETE ANY TABLE", "delete any table", false}, {"DELETE ANY TABLE WITH ADMIN OPTION", "delete any table", true},
+ {"CREATE ANY SEQUENCE", "create any sequence", false},
+ {"CREATE ANY SEQUENCE WITH ADMIN OPTION", "create any sequence", true},
+ {"CREATE ANY INDEX", "create any index", false},
+ {"CREATE ANY INDEX WITH ADMIN OPTION", "create any index", true},
+ {"CREATE ANY FUNCTION", "create any function", false},
+ {"CREATE ANY FUNCTION WITH ADMIN OPTION", "create any function", true},
+ {"EXECUTE ANY FUNCTION", "execute any function", false},
+ {"EXECUTE ANY FUNCTION WITH ADMIN OPTION", "execute any function", true},
+ {"CREATE ANY PACKAGE", "create any package", false},
+ {"CREATE ANY PACKAGE WITH ADMIN OPTION", "create any package", true},
+ {"EXECUTE ANY PACKAGE", "execute any package", false},
+ {"EXECUTE ANY PACKAGE WITH ADMIN OPTION", "execute any package", true},
+ {"CREATE ANY TYPE", "create any type", false}, {"CREATE ANY TYPE WITH ADMIN OPTION", "create any type", true},
+ {NULL, NULL, false}};
+
+/*
+ * has_any_privilege
+ *
+ * Check role's ANY privlege.
+ *
+ * userName: the user to be checked
+ * privList: the ANY privilege to be checked
+ * isAdminOption: if true, return if the user has privilge to GRANT/REVOKE the ANY privilege
+ * if false, just return if the user has the ANY privilege
+ */
+Datum has_any_privilege(PG_FUNCTION_ARGS)
+{
+ Name userName = PG_GETARG_NAME(0);
+ text* privText = PG_GETARG_TEXT_P(1);
+
+ Oid roleId = get_role_oid(NameStr(*userName), false);
+
+ char* privList = text_to_cstring(privText);
+ bool result = false;
+ char* chunk = NULL;
+ char* nextChunk = NULL;
+ for (chunk = privList; chunk; chunk = nextChunk) {
+ /* Split string at commas */
+ nextChunk = strchr(chunk, ',');
+ if (nextChunk != NULL)
+ *nextChunk++ = '\0';
+
+ /* Drop leading/trailing whitespace in this chunk */
+ while (*chunk != 0 && isspace((unsigned char)*chunk)) {
+ chunk++;
+ }
+ int chunkLen = strlen(chunk);
+ while (chunkLen > 0 && isspace((unsigned char)chunk[chunkLen - 1])) {
+ chunkLen--;
+ }
+ chunk[chunkLen] = '\0';
+
+ /* Match to the privileges list. */
+ const DbPrivMap* this_priv = NULL;
+ for (this_priv = dbPrivMap; this_priv->name; this_priv++) {
+ if (pg_strcasecmp(this_priv->name, chunk) == 0) {
+ result = result | HasSpecAnyPriv(roleId, this_priv->priv, this_priv->adminOption);
+ break;
+ }
+ }
+ if (this_priv->name == NULL) {
+ ereport(ERROR, (errmodule(MOD_SEC), errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("Unrecognized privilege type."), errdetail("Unrecognized privilege type: \"%s\".", chunk),
+ errcause("The privilege type is not supported."),
+ erraction("Check GRANT/REVOKE syntax to obtain the supported privilege types.")));
+ }
+ }
+ PG_RETURN_BOOL(result);
+}
+
+/*
+ * Delete the record in gs_db_privilege by oid
+ */
+void DropDbPrivByOid(Oid rowOid)
+{
+ Relation dbPrivRel = heap_open(DbPrivilegeId, RowExclusiveLock);
+ if (!RelationIsValid(dbPrivRel)) {
+ ereport(ERROR, (errmodule(MOD_SEC), errcode(ERRCODE_SYSTEM_ERROR),
+ errmsg("Could not open the relation gs_db_privilege."),
+ errcause("System error."), erraction("Contact engineer to support.")));
+ }
+
+ HeapTuple dbPrivTuple = SearchSysCache1(DBPRIVOID, ObjectIdGetDatum(rowOid));
+ if (HeapTupleIsValid(dbPrivTuple)) {
+ simple_heap_delete(dbPrivRel, &dbPrivTuple->t_self);
+ ReleaseSysCache(dbPrivTuple);
+ }
+
+ heap_close(dbPrivRel, RowExclusiveLock);
+}
diff --git a/src/common/backend/catalog/gs_global_config.cpp b/src/common/backend/catalog/gs_global_config.cpp
new file mode 100644
index 000000000..e15ddb80e
--- /dev/null
+++ b/src/common/backend/catalog/gs_global_config.cpp
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * -------------------------------------------------------------------------
+ *
+ * gs_global_config.cpp
+ *
+ * IDENTIFICATION
+ * src/common/backend/catalog/gs_global_config.cpp
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "nodes/parsenodes.h"
+#include "nodes/pg_list.h"
+#include "utils/relcache.h"
+#include "access/heapam.h"
+#include "nodes/parsenodes_common.h"
+#include "access/tableam.h"
+#include "access/htup.h"
+#include "utils/elog.h"
+#include "fmgr.h"
+#include "utils/builtins.h"
+#include "catalog/gs_global_config.h"
+
+void CreateGlobalConfig(DefElem* defel)
+{
+ HeapTuple htup = NULL;
+ Relation relation;
+ bool nulls[Natts_gs_global_config];
+ Datum values[Natts_gs_global_config];
+
+ relation = heap_open(GsGlobalConfigRelationId, RowExclusiveLock);
+
+ values[Anum_gs_global_config_name - 1] = DirectFunctionCall1(namein, CStringGetDatum(defel->defname));
+ nulls[Anum_gs_global_config_name - 1] = false;
+ char *config_value = defGetString(defel);
+ values[Anum_gs_global_config_value - 1] = DirectFunctionCall1(textin, CStringGetDatum(config_value));
+ nulls[Anum_gs_global_config_value - 1] = false;
+
+ htup = (HeapTuple)heap_form_tuple(relation->rd_att, values, nulls);
+ (void)simple_heap_insert(relation, htup);
+ heap_close(relation, NoLock);
+}
+
+void AlterGlobalConfig(AlterGlobalConfigStmt *stmt)
+{
+ ListCell *option = NULL;
+ HeapTuple tup = NULL;
+ HeapTuple htup = NULL;
+ TableScanDesc scan;
+ bool isNull = false;
+ bool find;
+ if (!initialuser()) {
+ ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to examine")));
+ }
+ foreach (option, stmt->options) {
+ DefElem *defel = (DefElem *)lfirst(option);
+ if (strcmp(defel->defname, "weak_password") == 0) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("Don't alter config named 'weak_password'")));
+ }
+ bool nulls[Natts_gs_global_config];
+ Datum values[Natts_gs_global_config];
+ bool repl[Natts_pg_resource_pool];
+ find = false;
+
+ Relation relation = heap_open(GsGlobalConfigRelationId, RowExclusiveLock);
+ scan = tableam_scan_begin(relation, SnapshotNow, 0, NULL);
+ while ((tup = (HeapTuple)tableam_scan_getnexttuple(scan, ForwardScanDirection)) != NULL) {
+ Datum datum = heap_getattr(tup, Anum_gs_global_config_name, RelationGetDescr(relation), &isNull);
+ if (!isNull && strcmp(defel->defname, DatumGetCString(datum)) == 0) {
+ find = true;
+ char *config_value = defGetString(defel);
+ values[Anum_gs_global_config_value - 1] = DirectFunctionCall1(textin, CStringGetDatum(config_value));
+ nulls[Anum_gs_global_config_value - 1] = false;
+ repl[Anum_gs_global_config_value - 1] = true;
+
+ repl[Anum_gs_global_config_name - 1] = false;
+ htup = heap_modify_tuple(tup, RelationGetDescr(relation), values, nulls, repl);
+ simple_heap_update(relation, &tup->t_self, htup);
+ break;
+ }
+ }
+ tableam_scan_end(scan);
+ heap_close(relation, NoLock);
+ if (!find) {
+ CreateGlobalConfig(defel);
+ }
+ }
+}
+
+void DropGlobalConfig(DropGlobalConfigStmt *stmt)
+{
+ ListCell *item = NULL;
+ HeapTuple tup = NULL;
+ TableScanDesc scan;
+ bool isNull = false;
+ bool find;
+ if (!initialuser()) {
+ ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to examine")));
+ }
+ foreach (item, stmt->options) {
+ const char *global_name = strVal(lfirst(item));
+ if (strcmp(global_name, "weak_password") == 0) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("Don't drop config named 'weak_password'")));
+ }
+ find = false;
+
+ Relation relation = heap_open(GsGlobalConfigRelationId, RowExclusiveLock);
+ scan = tableam_scan_begin(relation, SnapshotNow, 0, NULL);
+ while ((tup = (HeapTuple)tableam_scan_getnexttuple(scan, ForwardScanDirection)) != NULL) {
+ Datum datum = heap_getattr(tup, Anum_gs_global_config_name, RelationGetDescr(relation), &isNull);
+ if (!isNull && strcmp(global_name, DatumGetCString(datum)) == 0) {
+ find = true;
+ simple_heap_delete(relation, &tup->t_self);
+ break;
+ }
+ }
+ tableam_scan_end(scan);
+ heap_close(relation, NoLock);
+ if (!find) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_NAME), errmsg("Parameter %s not exists, please check it.\n", global_name)));
+ }
+ }
+}
+
diff --git a/src/common/backend/catalog/gs_job_attribute.cpp b/src/common/backend/catalog/gs_job_attribute.cpp
index 2056d98e1..a7309a5e8 100644
--- a/src/common/backend/catalog/gs_job_attribute.cpp
+++ b/src/common/backend/catalog/gs_job_attribute.cpp
@@ -37,6 +37,7 @@
#include "commands/dbcommands.h"
#include "commands/extension.h"
#include "commands/schemacmds.h"
+#include "commands/user.h"
#include "executor/spi.h"
#include "funcapi.h"
#include "mb/pg_wchar.h"
@@ -545,6 +546,27 @@ void grant_user_authorization_internal(PG_FUNCTION_ARGS)
pfree(DatumGetPointer(attribute_value[0]));
}
+static char* get_current_username()
+{
+#ifndef WIN32
+ struct passwd* pw = NULL;
+ char* pRet = NULL;
+
+ (void)syscalllockAcquire(&getpwuid_lock);
+ pw = getpwuid(geteuid());
+ if (pw == NULL) {
+ (void)syscalllockRelease(&getpwuid_lock);
+ return NULL;
+ }
+ /* Allocate new memory because later getpwuid() calls can overwrite it. */
+ pRet = pstrdup(pw->pw_name);
+ (void)syscalllockRelease(&getpwuid_lock);
+ return pRet;
+#else
+ return NULL;
+#endif
+}
+
/*
* @brief check_credential_name_valid
* Check if a user input string is a valid username.
@@ -563,6 +585,23 @@ static void check_credential_name_valid(const Datum username)
erraction("Please enter a valid str")));
}
}
+ char *inital_user = get_current_username();
+ Assert(inital_user != NULL);
+ if (inital_user == NULL) {
+ ereport(ERROR, (errmodule(MOD_JOB), errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("inital_user username is invalid."),
+ errdetail("inital_user username is invalid."),
+ errcause("inital_user is invalid"),
+ erraction("EXTERNAL_SCRIPT is not supported")));
+ }
+ if (strcmp(name_str, inital_user) == 0) {
+ ereport(ERROR, (errmodule(MOD_JOB), errcode(ERRCODE_INVALID_NAME),
+ errmsg("Credential username is invalid."),
+ errdetail("Credential username is initialuser, which can not be credential user"),
+ errcause("str is invalid"),
+ erraction("Please enter a valid str")));
+ }
+ pfree(inital_user);
pfree(name_str);
}
@@ -908,6 +947,10 @@ static char *create_inline_program(Datum job_name, Datum job_type, Datum job_act
static const short nrgs_program = 6;
FunctionCallInfoData fcinfo_program;
InitFunctionCallInfoData(fcinfo_program, NULL, nrgs_program, InvalidOid, NULL, NULL);
+ rc = memset_s(fcinfo_program.arg, nrgs_program * sizeof(Datum), 0, nrgs_program * sizeof(Datum));
+ securec_check(rc, "\0", "\0");
+ rc = memset_s(fcinfo_program.argnull, nrgs_program * sizeof(bool), 0, nrgs_program * sizeof(bool));
+ securec_check(rc, "\0", "\0");
fcinfo_program.arg[0] = CStringGetTextDatum(program_name); /* program_name */
fcinfo_program.arg[1] = job_type; /* program_type */
fcinfo_program.arg[2] = job_action; /* program_action */
@@ -1094,6 +1137,10 @@ void create_job_1_internal(PG_FUNCTION_ARGS)
static const short nrgs_job = 16;
FunctionCallInfoData fcinfo_job;
InitFunctionCallInfoData(fcinfo_job, NULL, nrgs_job, InvalidOid, NULL, NULL);
+ errno_t rc = memset_s(fcinfo_job.arg, nrgs_job * sizeof(Datum), 0, nrgs_job * sizeof(Datum));
+ securec_check(rc, "\0", "\0");
+ rc = memset_s(fcinfo_job.argnull, nrgs_job * sizeof(bool), 0, nrgs_job * sizeof(bool));
+ securec_check(rc, "\0", "\0");
fcinfo_job.arg[0] = job_name; /* job_name */
fcinfo_job.arg[1] = program_name; /* program_name */
@@ -1199,12 +1246,16 @@ void create_job_2_internal(PG_FUNCTION_ARGS)
static const short nrgs_job = 16;
FunctionCallInfoData fcinfo_job;
InitFunctionCallInfoData(fcinfo_job, NULL, nrgs_job, InvalidOid, NULL, NULL);
+ errno_t rc = memset_s(fcinfo_job.arg, nrgs_job * sizeof(Datum), 0, nrgs_job * sizeof(Datum));
+ securec_check(rc, "\0", "\0");
+ rc = memset_s(fcinfo_job.argnull, nrgs_job * sizeof(bool), 0, nrgs_job * sizeof(bool));
+ securec_check(rc, "\0", "\0");
fcinfo_job.arg[0] = PG_GETARG_DATUM(0); /* job_name */
fcinfo_job.arg[1] = program_name; /* program_name */
fcinfo_job.arg[2] = schedule_name; /* schedule_name */
fcinfo_job.arg[3] = PG_GETARG_DATUM(3); /* job_class */
- fcinfo_job.arg[4] = enabled; /* enabled */
+ fcinfo_job.arg[4] = PG_GETARG_DATUM(4); /* enabled */
fcinfo_job.arg[5] = PG_GETARG_DATUM(5); /* auto_drop */
fcinfo_job.arg[6] = PG_ARGISNULL(6) ? Datum(0) : PG_GETARG_DATUM(6); /* comments */
fcinfo_job.arg[7] = PG_GETARG_DATUM(7); /* job_style */
@@ -1246,6 +1297,10 @@ void create_job_3_internal(PG_FUNCTION_ARGS)
static const short nrgs_job = 16;
FunctionCallInfoData fcinfo_job;
InitFunctionCallInfoData(fcinfo_job, NULL, nrgs_job, InvalidOid, NULL, NULL);
+ errno_t rc = memset_s(fcinfo_job.arg, nrgs_job * sizeof(Datum), 0, nrgs_job * sizeof(Datum));
+ securec_check(rc, "\0", "\0");
+ rc = memset_s(fcinfo_job.argnull, nrgs_job * sizeof(bool), 0, nrgs_job * sizeof(bool));
+ securec_check(rc, "\0", "\0");
fcinfo_job.arg[0] = job_name; /* job_name */
fcinfo_job.arg[1] = program_name; /* program_name */
@@ -1996,4 +2051,4 @@ void disable_single_internal(PG_FUNCTION_ARGS)
bool force = PG_GETARG_BOOL(1);
Datum enable_value = BoolToText(false);
enable_single_force(object_name, enable_value, force);
-}
+}
\ No newline at end of file
diff --git a/src/common/backend/catalog/gs_matview.cpp b/src/common/backend/catalog/gs_matview.cpp
index 187c06b34..5f479e608 100644
--- a/src/common/backend/catalog/gs_matview.cpp
+++ b/src/common/backend/catalog/gs_matview.cpp
@@ -39,8 +39,6 @@
#include "utils/syscache.h"
#include "utils/inval.h"
-static Oid FindRoleid(Oid relid);
-
void create_matview_tuple(Oid matviewOid, Oid matmapid, bool isIncremental)
{
errno_t rc;
@@ -179,6 +177,10 @@ void delete_matview_tuple(Oid matviewOid)
matmapobject.objectSubId = 0;
performDeletion(&matmapobject, DROP_RESTRICT, PERFORM_DELETION_INTERNAL);
+ } else {
+ ereport(DEBUG2,
+ (errmodule(MOD_OPT), errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("Matviewmap %d relation is invalid when delete it.", (int)matmapid)));
}
}
@@ -590,7 +592,7 @@ bool CheckPermissionForBasetable(const RangeTblEntry *rte)
/*
* Get owner by relid
*/
-static Oid FindRoleid(Oid relid)
+Oid FindRoleid(Oid relid)
{
Oid roleid;
HeapTuple tuple = NULL;
diff --git a/src/common/backend/catalog/gs_package.cpp b/src/common/backend/catalog/gs_package.cpp
index 79eb66334..f336b8ea3 100644
--- a/src/common/backend/catalog/gs_package.cpp
+++ b/src/common/backend/catalog/gs_package.cpp
@@ -38,9 +38,12 @@
#include "catalog/gs_package_fn.h"
#include "catalog/pg_object.h"
#include "catalog/pg_proc.h"
+#include "catalog/pg_proc_fn.h"
#include "catalog/pg_synonym.h"
#include "commands/defrem.h"
#include "commands/sqladvisor.h"
+#include "gs_thread.h"
+#include "parser/parse_type.h"
#include "pgxc/pgxc.h"
#include "utils/acl.h"
#include "utils/builtins.h"
@@ -54,36 +57,32 @@
#include "utils/pl_global_package_runtime_cache.h"
#include "utils/pl_package.h"
-static PLpgSQL_datum* copypPackageVarDatum(PLpgSQL_datum* datum);
-static PackageRuntimeState* buildPkgRunStatesbyPackage(PLpgSQL_package* pkg);
-static PackageRuntimeState* buildPkgRunStatebyPkgRunState(PackageRuntimeState* parentPkgState);
-static void copyCurrentSessionPkgs(SessionPackageRuntime* sessionPkgs, DList* pkgList);
-static bool pkgExistInSession(PackageRuntimeState* pkgState);
-static void copyParentSessionPkgs(SessionPackageRuntime* sessionPkgs, List* pkgList);
-static void restorePkgValuesByPkgState(PLpgSQL_package* targetPkg, PackageRuntimeState* pkgState, bool isInit = false);
-static void restoreAutonmSessionPkgs(SessionPackageRuntime* sessionPkgs);
+#include "tcop/pquery.h"
+#include "executor/executor.h"
+#include "executor/tstoreReceiver.h"
+
+static PLpgSQL_datum* CopyPackageVarDatum(PLpgSQL_datum* datum);
+static PackageRuntimeState* BuildPkgRunStatesbyPackage(PLpgSQL_package* pkg);
+static PackageRuntimeState* BuildPkgRunStatebyPkgRunState(PackageRuntimeState* parentPkgState);
+static void CopyCurrentSessionPkgs(SessionPackageRuntime* sessionPkgs, DList* pkgList);
+static bool PkgExistInSession(PackageRuntimeState* pkgState);
+static void CopyParentSessionPkgs(SessionPackageRuntime* sessionPkgs, List* pkgList);
+static void RestorePkgValuesByPkgState(PLpgSQL_package* targetPkg, PackageRuntimeState* pkgState, bool isInit = false);
+static void RestoreAutonmSessionPkgs(SessionPackageRuntime* sessionPkgs);
+static void ReleaseUnusedPortalContext(List* portalContexts, bool releaseAll = false);
+#define MAXSTRLEN ((1 << 11) - 1)
static Acl* PackageAclDefault(Oid ownerId)
{
- AclMode world_default;
AclMode owner_default;
int nacl = 0;
Acl* acl = NULL;
AclItem* aip = NULL;
- world_default = ACL_NO_RIGHTS;
owner_default = ACL_ALL_RIGHTS_PACKAGE;
- if (world_default != ACL_NO_RIGHTS)
- nacl++;
if (owner_default != ACL_NO_RIGHTS)
nacl++;
acl = allocacl(nacl);
aip = ACL_DAT(acl);
- if (world_default != ACL_NO_RIGHTS) {
- aip->ai_grantee = ACL_ID_PUBLIC;
- aip->ai_grantor = ownerId;
- ACLITEM_SET_PRIVS_GOPTIONS(*aip, world_default, ACL_NO_RIGHTS);
- aip++;
- }
if (owner_default != ACL_NO_RIGHTS) {
aip->ai_grantee = ownerId;
@@ -94,7 +93,6 @@ static Acl* PackageAclDefault(Oid ownerId)
return acl;
}
-
/* ----------------
* PackageSpecCreate
*
@@ -332,7 +330,7 @@ Oid PackageSpecCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId,
pkgacl = get_user_default_acl(ACL_OBJECT_PACKAGE, ownerId, pkgNamespace);
if (pkgacl != NULL)
values[Anum_gs_package_pkgacl - 1] = PointerGetDatum(pkgacl);
- else if (PLSQL_SECURITY_DEFINER) {
+ else if (PLSQL_SECURITY_DEFINER && u_sess->attr.attr_common.upgrade_mode == 0) {
values[Anum_gs_package_pkgacl - 1] = PointerGetDatum(PackageAclDefault(ownerId));
} else {
nulls[Anum_gs_package_pkgacl - 1] = true;
@@ -347,7 +345,7 @@ Oid PackageSpecCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId,
if (OidIsValid(oldPkgOid)) {
if (replace != true) {
ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
+ (errcode(ERRCODE_DUPLICATE_PACKAGE),
errmsg("package \"%s\" already exists.", pkgName)));
} else {
oldpkgtup = SearchSysCache1(PACKAGEOID, ObjectIdGetDatum(oldPkgOid));
@@ -359,6 +357,10 @@ Oid PackageSpecCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId,
errcause("System error"),
erraction("Drop and rebuild package.")));
}
+ if (!pg_package_ownercheck(HeapTupleGetOid(oldpkgtup), ownerId)) {
+ ReleaseSysCache(oldpkgtup);
+ aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PACKAGE, pkgName);
+ }
tup = heap_modify_tuple(oldpkgtup, tupDesc, values, nulls, replaces);
simple_heap_update(pkgDesc, &tup->t_self, tup);
ReleaseSysCache(oldpkgtup);
@@ -384,7 +386,7 @@ Oid PackageSpecCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId,
DeleteTypesDenpendOnPackage(PackageRelationId, pkgOid);
/* the 'shared dependencies' also change when update. */
deleteSharedDependencyRecordsFor(PackageRelationId, pkgOid, 0);
- dropFunctionByPackageOid(pkgOid);
+ DeleteFunctionByPackageOid(pkgOid);
}
heap_freetuple_ext(tup);
@@ -459,7 +461,6 @@ Oid PackageSpecCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId,
Oid PackageBodyCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId, const char* pkgBodySrc, const char* pkgInitSrc, bool replace)
{
Relation pkgDesc;
- Oid pkgOid = InvalidOid;
bool nulls[Natts_gs_package];
Datum values[Natts_gs_package];
bool replaces[Natts_gs_package];
@@ -477,7 +478,6 @@ Oid PackageBodyCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId,
Assert(PointerIsValid(pkgBodySrc));
HeapTuple tup = NULL;
HeapTuple oldpkgtup = NULL;
- Oid packageOid = InvalidOid;
Oid oldPkgOid = InvalidOid;
/* sanity checks */
if (pkgName == NULL) {
@@ -493,8 +493,8 @@ Oid PackageBodyCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId,
erraction("Please rename package name")));
}
- packageOid = PackageNameGetOid(pkgName, pkgNamespace);
- if (packageOid == InvalidOid) {
+ oldPkgOid = PackageNameGetOid(pkgName, pkgNamespace);
+ if (!OidIsValid(oldPkgOid)) {
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("package spec not found")));
}
/* initialize nulls and values */
@@ -516,7 +516,6 @@ Oid PackageBodyCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId,
pkgDesc = heap_open(PackageRelationId, RowExclusiveLock);
tupDesc = RelationGetDescr(pkgDesc);
- oldPkgOid = PackageNameGetOid(pkgName, pkgNamespace);
if (OidIsValid(oldPkgOid)) {
oldpkgtup = SearchSysCache1(PACKAGEOID, ObjectIdGetDatum(oldPkgOid));
if (!HeapTupleIsValid(oldpkgtup)) {
@@ -531,13 +530,14 @@ Oid PackageBodyCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId,
SysCacheGetAttr(PACKAGEOID, oldpkgtup, Anum_gs_package_pkgbodydeclsrc, &isNull);
if (!isNull && !replace) {
ereport(ERROR, (errcode(ERRCODE_DUPLICATE_PACKAGE), errmsg("package body already exists")));
- }
+ } else if (!isNull) {
+ DeleteFunctionByPackageOid(oldPkgOid);
+ DeleteTypesDenpendOnPackage(PackageRelationId, oldPkgOid, false);
+ }
tup = heap_modify_tuple(oldpkgtup, tupDesc, values, nulls, replaces);
simple_heap_update(pkgDesc, &tup->t_self, tup);
ReleaseSysCache(oldpkgtup);
isReplaced = true;
- } else {
- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("package spec not found")));
}
if (u_sess->attr.attr_common.IsInplaceUpgrade &&
u_sess->upg_cxt.Inplace_upgrade_next_gs_package_oid != InvalidOid) {
@@ -545,39 +545,34 @@ Oid PackageBodyCreate(Oid pkgNamespace, const char* pkgName, const Oid ownerId,
u_sess->upg_cxt.Inplace_upgrade_next_gs_package_oid = InvalidOid;
}
if (HeapTupleIsValid(tup)) {
- pkgOid = HeapTupleGetOid(tup);
+ oldPkgOid = HeapTupleGetOid(tup);
}
- Assert(OidIsValid(pkgOid));
CatalogUpdateIndexes(pkgDesc, tup);
- if (isReplaced) {
- DeleteTypesDenpendOnPackage(PackageRelationId, pkgOid, false);
- }
-
heap_freetuple_ext(tup);
- heap_close(pkgDesc, NoLock);
+ heap_close(pkgDesc, RowExclusiveLock);
/* Post creation hook for new schema */
- InvokeObjectAccessHook(OAT_POST_CREATE, PackageRelationId, pkgOid, 0, NULL);
+ InvokeObjectAccessHook(OAT_POST_CREATE, PackageRelationId, oldPkgOid, 0, NULL);
/* Advance command counter so new tuple can be seen by validator */
CommandCounterIncrement();
/* Recode the procedure create time. */
- if (OidIsValid(pkgOid)) {
- if (!isReplaced) {
- PgObjectOption objectOpt = {true, true, false, false};
- CreatePgObject(pkgOid, OBJECT_TYPE_PKGSPEC, ownerId, objectOpt);
- } else {
- UpdatePgObjectMtime(pkgOid, OBJECT_TYPE_PROC);
- }
+ if (OidIsValid(oldPkgOid)) {
+ if (!isReplaced) {
+ PgObjectOption objectOpt = {true, true, false, false};
+ CreatePgObject(oldPkgOid, OBJECT_TYPE_PKGSPEC, ownerId, objectOpt);
+ } else {
+ UpdatePgObjectMtime(oldPkgOid, OBJECT_TYPE_PROC);
+ }
}
- plpgsql_package_validator(pkgOid, false, true);
+ plpgsql_package_validator(oldPkgOid, false, true);
- return pkgOid;
+ return oldPkgOid;
}
bool IsFunctionInPackage(List* wholename)
@@ -620,15 +615,495 @@ bool IsFunctionInPackage(List* wholename)
return false;
}
+/* free the reference value of var */
static void free_var_value(PLpgSQL_var* var)
{
if (var->freeval) {
+ /* means the value is by reference, and need free */
pfree(DatumGetPointer(var->value));
var->freeval = false;
}
}
-void BuildSessionPackageRuntime(uint64 sessionId, uint64 parentSessionId)
+/* find auto session stored portals, and build new on depend on it */
+Portal BuildHoldPortalFromAutoSession(PLpgSQL_execstate* estate, int curVarDno, int outParamIndex)
+{
+ AutoSessionPortalData* holdPortal = NULL;
+ ListCell* cell = NULL;
+ PLpgSQL_var *curVar = NULL;
+ foreach(cell, u_sess->plsql_cxt.storedPortals) {
+ AutoSessionPortalData* portalData = (AutoSessionPortalData*)lfirst(cell);
+ if (portalData != NULL && portalData->outParamIndex == outParamIndex) {
+ holdPortal = portalData;
+ }
+ }
+
+ if (holdPortal == NULL) {
+ /* reset the cursor attribute */
+ curVar = (PLpgSQL_var*)(estate->datums[curVarDno]);
+ free_var_value(curVar);
+ curVar->value = (Datum)0;
+ curVar->isnull = true;
+ curVar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_ISOPEN]);
+ curVar->value = BoolGetDatum(false);
+ curVar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_FOUND]);
+ curVar->value = BoolGetDatum(false);
+ curVar->isnull = true;
+ curVar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_NOTFOUND]);
+ curVar->value = BoolGetDatum(false);
+ curVar->isnull = true;
+ curVar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_ROWCOUNT]);
+ curVar->value = Int32GetDatum(0);
+ curVar->isnull = true;
+ return NULL;
+ }
+ /* Reset SPI result (note we deliberately don't touch lastoid) */
+ SPI_processed = 0;
+ SPI_tuptable = NULL;
+ u_sess->SPI_cxt._current->processed = 0;
+ u_sess->SPI_cxt._current->tuptable = NULL;
+
+ SPI_STACK_LOG("begin", NULL, NULL);
+ if (_SPI_begin_call(true) < 0) {
+ ereport(ERROR, (errcode(ERRCODE_SPI_CONNECTION_FAILURE),
+ errmsg("SPI stack is corrupted when perform cursor operation, current level: %d, connected level: %d",
+ u_sess->SPI_cxt._curid, u_sess->SPI_cxt._connected)));
+ }
+
+ Portal portal = CreateNewPortal(true);
+ portal->holdContext = holdPortal->holdContext;
+ portal->holdStore = holdPortal->holdStore;
+ portal->tupDesc = holdPortal->tupDesc;
+ portal->strategy = holdPortal->strategy;
+ portal->cursorOptions = holdPortal->cursorOptions;
+ portal->commandTag = holdPortal->commandTag;
+ portal->atEnd = holdPortal->atEnd;
+ portal->atStart = holdPortal->atStart;
+ portal->portalPos = holdPortal->portalPos;
+
+ portal->autoHeld = true;
+ portal->resowner = NULL;
+ portal->createSubid = InvalidSubTransactionId;
+ portal->activeSubid = InvalidSubTransactionId;
+ portal->status = PORTAL_READY;
+
+ portal->portalPinned = true;
+
+ /* Pop the SPI stack */
+ SPI_STACK_LOG("end", NULL, NULL);
+ _SPI_end_call(true);
+
+ /* restore cursor var values */
+ curVar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_ISOPEN]);
+ curVar->value = BoolGetDatum(holdPortal->is_open);
+ curVar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_FOUND]);
+ curVar->value = BoolGetDatum(holdPortal->found);
+ curVar->isnull = holdPortal->null_fetch;
+ curVar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_NOTFOUND]);
+ curVar->value = BoolGetDatum(holdPortal->not_found);
+ curVar->isnull = holdPortal->null_fetch;
+ curVar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_ROWCOUNT]);
+ curVar->value = Int32GetDatum(holdPortal->row_count);
+ curVar->isnull = holdPortal->null_open;
+
+ return portal;
+}
+
+static void ReleaseUnusedPortalContext(List* portalContexts, bool releaseAll)
+{
+ ListCell* cell = NULL;
+ AutoSessionPortalContextData* portalContext = NULL;
+ foreach(cell, portalContexts) {
+ portalContext = (AutoSessionPortalContextData*)lfirst(cell);
+ if (releaseAll || portalContext->status == CONTEXT_NEW) {
+ /*
+ * if context not new, its session id and parent is from auto session.
+ * we should set them to parent session to delete it.
+ */
+ if (portalContext->status != CONTEXT_NEW) {
+ portalContext->portalHoldContext->session_id = u_sess->session_id;
+ portalContext->portalHoldContext->thread_id = gs_thread_self();
+ MemoryContextSetParent(portalContext->portalHoldContext, u_sess->top_portal_cxt);
+ }
+ MemoryContextDelete(portalContext->portalHoldContext);
+ }
+ }
+}
+
+/* restore cursors from auto transaction procedure out param */
+void restoreAutonmSessionCursors(PLpgSQL_execstate* estate, PLpgSQL_row* row)
+{
+ if (!u_sess->plsql_cxt.call_after_auto) {
+ return;
+ }
+ PLpgSQL_var* curvar = NULL;
+ for (int i = 0; i < row->nfields; i++) {
+ if (estate->datums[row->varnos[i]]->dtype != PLPGSQL_DTYPE_VAR) {
+ continue;
+ }
+ curvar = (PLpgSQL_var*)(estate->datums[row->varnos[i]]);
+ if (curvar->datatype->typoid == REFCURSOROID) {
+ Portal portal = BuildHoldPortalFromAutoSession(estate, row->varnos[i], i);
+ if (portal == NULL) {
+ continue;
+ }
+ if (curvar->pkg != NULL) {
+ MemoryContext temp = MemoryContextSwitchTo(curvar->pkg->pkg_cxt);
+ assign_text_var(curvar, portal->name);
+ temp = MemoryContextSwitchTo(temp);
+ } else {
+ assign_text_var(curvar, portal->name);
+ }
+ curvar->cursor_closed = false;
+ }
+ }
+
+ list_free_deep(u_sess->plsql_cxt.storedPortals);
+ u_sess->plsql_cxt.storedPortals = NIL;
+ ReleaseUnusedPortalContext(u_sess->plsql_cxt.portalContext);
+ list_free_deep(u_sess->plsql_cxt.portalContext);
+ u_sess->plsql_cxt.portalContext = NIL;
+ u_sess->plsql_cxt.call_after_auto = false;
+}
+
+static bool PortalConextInList(Portal portal, List* PortalContextList)
+{
+ ListCell* cell = NULL;
+ AutoSessionPortalContextData* portalContext = NULL;
+ foreach(cell, PortalContextList) {
+ portalContext = (AutoSessionPortalContextData*)lfirst(cell);
+ if (portalContext != NULL && portalContext->portalHoldContext == portal->holdContext) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void ResetAutoPortalConext(Portal portal)
+{
+ if (portal->holdStore == NULL) {
+ return;
+ }
+ /*
+ * we do not call tuplestore_end, because context is another session,
+ * this may cause memory leak, but it seems not serious, because autonomous
+ * session will destroy soon.
+ */
+ portal->holdStore = NULL;
+ List* PortalContextList = u_sess->plsql_cxt.auto_parent_session_pkgs->portalContext;
+ ListCell* cell = NULL;
+ AutoSessionPortalContextData* portalContext = NULL;
+ /* mark context is new, and can be re-used */
+ foreach(cell, PortalContextList) {
+ portalContext = (AutoSessionPortalContextData*)lfirst(cell);
+ if (portalContext != NULL && portalContext->portalHoldContext == portal->holdContext) {
+ portalContext->status = CONTEXT_NEW;
+ if (u_sess->plsql_cxt.parent_context != NULL) {
+ portalContext->portalHoldContext->session_id = u_sess->plsql_cxt.parent_session_id;
+ portalContext->portalHoldContext->thread_id = u_sess->plsql_cxt.parent_thread_id;
+ MemoryContextSetParent(portalContext->portalHoldContext, u_sess->plsql_cxt.parent_context);
+ }
+ }
+ }
+}
+
+MemoryContext GetAvailableHoldContext(List* PortalContextList)
+{
+ ListCell* cell = NULL;
+ AutoSessionPortalContextData* portalContext = NULL;
+ MemoryContext result = NULL;
+ foreach(cell, PortalContextList) {
+ portalContext = (AutoSessionPortalContextData*)lfirst(cell);
+ if (portalContext != NULL && portalContext->status == CONTEXT_NEW) {
+ result = portalContext->portalHoldContext;
+ portalContext->status = CONTEXT_USED;
+ break;
+ }
+ }
+
+ if (result == NULL) {
+ ereport(ERROR,
+ (errmodule(MOD_GPRC), errcode(ERRCODE_INVALID_STATUS),
+ errmsg("no available portal hold context"),
+ errdetail("no available portal hold context when hold autonomous transction procedure cursor"),
+ errcause("System error"),
+ erraction("Modify autonomous transction procedure")));
+ }
+
+
+ u_sess->plsql_cxt.parent_session_id = result->session_id;
+ u_sess->plsql_cxt.parent_thread_id = result->thread_id;
+ u_sess->plsql_cxt.parent_context = result->parent;
+ result->session_id = u_sess->session_id;
+ result->thread_id = gs_thread_self();
+ MemoryContextSetParent(result, u_sess->top_portal_cxt);
+
+ return result;
+}
+
+static List* BuildPortalContextListForAutoSession(PLpgSQL_function* func)
+{
+ List* result = NIL;
+ if (func == NULL) {
+ return result;
+ }
+
+ if (func->out_param_varno == -1) {
+ return result;
+ }
+
+ AutoSessionPortalContextData* portalContext = NULL;
+ PLpgSQL_datum* outDatum = func->datums[func->out_param_varno];
+ if (outDatum->dtype == PLPGSQL_DTYPE_VAR) {
+ PLpgSQL_var* outVar = (PLpgSQL_var*)outDatum;
+ if (outVar == NULL || outVar->datatype == NULL || outVar->datatype->typoid != REFCURSOROID) {
+ return result;
+ }
+ portalContext = (AutoSessionPortalContextData*)palloc0(sizeof(AutoSessionPortalContextData));
+ portalContext->status = CONTEXT_NEW;
+ portalContext->portalHoldContext = AllocSetContextCreate(u_sess->top_portal_cxt,
+ "PortalHoldContext",
+ ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE);
+ result = lappend(result, portalContext);
+ return result;
+ }
+
+ PLpgSQL_row* outRow = (PLpgSQL_row*)outDatum;
+ if (outRow->refname != NULL) {
+ /* means out param is just one normal row variable */
+ return result;
+ }
+ for (int i = 0; i < outRow->nfields; i++) {
+ if (func->datums[outRow->varnos[i]]->dtype == PLPGSQL_DTYPE_VAR) {
+ PLpgSQL_var* var = (PLpgSQL_var*)(func->datums[outRow->varnos[i]]);
+ if (var != NULL && var->datatype != NULL && var->datatype->typoid == REFCURSOROID) {
+ portalContext = (AutoSessionPortalContextData*)palloc0(sizeof(AutoSessionPortalContextData));
+ portalContext->status = CONTEXT_NEW;
+ portalContext->portalHoldContext = AllocSetContextCreate(u_sess->top_portal_cxt,
+ "PortalHoldContext",
+ ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE);
+ result = lappend(result, portalContext);
+ }
+ }
+ }
+ return result;
+}
+
+static void HoldOutParamPortal(Portal portal)
+{
+ if (portal->portalPinned && !portal->autoHeld) {
+ /*
+ * Doing transaction control, especially abort, inside a cursor
+ * loop that is not read-only, for example using UPDATE
+ * ... RETURNING, has weird semantics issues. Also, this
+ * implementation wouldn't work, because such portals cannot be
+ * held. (The core grammar enforces that only SELECT statements
+ * can drive a cursor, but for example PL/pgSQL does not restrict
+ * it.)
+ */
+ if (portal->strategy != PORTAL_ONE_SELECT) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
+ errmsg("cannot perform transaction commands inside a cursor loop that is not read-only")));
+ }
+
+ /* skip portal got error */
+ if (portal->status == PORTAL_FAILED)
+ return;
+
+ /* Verify it's in a suitable state to be held */
+ if (portal->status != PORTAL_READY)
+ ereport(ERROR, (errmsg("pinned portal(%s) is not ready to be auto-held, with status[%d]",
+ portal->name, portal->status)));
+
+ HoldPortal(portal);
+ portal->autoHeld = true;
+ }
+}
+
+static AutoSessionPortalData* BuildPortalDataForParentSession(PLpgSQL_execstate* estate,
+ int curVarDno, int outParamIndex)
+{
+ PLpgSQL_var* curvar = (PLpgSQL_var*)(estate->datums[curVarDno]);
+ if (curvar->isnull) {
+ return NULL;
+ }
+ char* curname = TextDatumGetCString(curvar->value);
+ Portal portal = SPI_cursor_find(curname);
+ pfree_ext(curname);
+ if (portal == NULL) {
+ return NULL;
+ }
+
+ /* portal not held, hold it */
+ if (portal->portalPinned && !portal->autoHeld) {
+ /* Push the SPI stack */
+ SPI_STACK_LOG("begin", NULL, NULL);
+ if (_SPI_begin_call(true) < 0) {
+ ereport(ERROR, (errcode(ERRCODE_SPI_CONNECTION_FAILURE),
+ errmsg("SPI stack is corrupted when perform cursor operation, current level: %d, connected level: %d",
+ u_sess->SPI_cxt._curid, u_sess->SPI_cxt._connected)));
+ }
+ HoldOutParamPortal(portal);
+ /* Pop the SPI stack */
+ SPI_STACK_LOG("end", NULL, NULL);
+ _SPI_end_call(true);
+ }
+
+ if (!portal->autoHeld) {
+ return NULL;
+ }
+
+ if (!PortalConextInList(portal, u_sess->plsql_cxt.auto_parent_session_pkgs->portalContext)) {
+ ereport(ERROR,
+ (errmodule(MOD_GPRC),
+ errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("nested call of ref cursor out param for autonomous transaction procedure is not supported yet."),
+ errdetail("N/A"),
+ errcause("feature not supported"),
+ erraction("Modify autonomous transction procedure")));
+ }
+
+ MemoryContext oldCtx = MemoryContextSwitchTo(portal->holdContext);
+ AutoSessionPortalData* portalData = (AutoSessionPortalData*)palloc0(sizeof(AutoSessionPortalData));
+ portalData->outParamIndex = outParamIndex;
+ portalData->strategy = portal->strategy;
+ portalData->cursorOptions = portal->cursorOptions;
+ portalData->commandTag = pstrdup(portal->commandTag);
+ portalData->atEnd = portal->atEnd;
+ portalData->atStart = portal->atStart;
+ portalData->portalPos = portal->portalPos;
+ portalData->holdStore = portal->holdStore;
+ portalData->holdContext = portal->holdContext;
+ portalData->tupDesc = CreateTupleDescCopy(portal->tupDesc);
+ /* cursor attribute data */
+ curvar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_ISOPEN]);
+ portalData->is_open = DatumGetBool(curvar->value);
+ portalData->null_open = curvar->isnull;
+ curvar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_FOUND]);
+ portalData->found = DatumGetBool(curvar->value);
+ portalData->null_fetch = curvar->isnull;
+ curvar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_NOTFOUND]);
+ portalData->not_found = DatumGetBool(curvar->value);
+ curvar = (PLpgSQL_var*)(estate->datums[curVarDno + CURSOR_ROWCOUNT]);
+ portalData->row_count = DatumGetInt32(curvar->value);
+ MemoryContextSwitchTo(oldCtx);
+ if (u_sess->plsql_cxt.parent_context != NULL) {
+ portalData->holdContext->session_id = u_sess->plsql_cxt.parent_session_id;
+ portalData->holdContext->thread_id = u_sess->plsql_cxt.parent_thread_id;
+ MemoryContextSetParent(portalData->holdContext, u_sess->plsql_cxt.parent_context);
+ }
+
+ return portalData;
+}
+
+static List* BuildPortalDataListForParentSession(PLpgSQL_execstate* estate)
+{
+ List* result = NIL;
+ if (estate == NULL) {
+ return result;
+ }
+ SessionPackageRuntime* sessionPkgs = NULL;
+ if (u_sess->plsql_cxt.auto_parent_session_pkgs == NULL) {
+ return result;
+ } else {
+ sessionPkgs = u_sess->plsql_cxt.auto_parent_session_pkgs;
+ }
+
+ /* means no out param */
+ if (estate->func->out_param_varno == -1) {
+ return result;
+ }
+
+ PLpgSQL_datum* outDatum = estate->datums[estate->func->out_param_varno];
+ AutoSessionPortalData* portalData = NULL;
+ if (outDatum->dtype == PLPGSQL_DTYPE_VAR) {
+ PLpgSQL_var* outVar = (PLpgSQL_var*)outDatum;
+ if (outVar == NULL || outVar->datatype == NULL || outVar->datatype->typoid != REFCURSOROID) {
+ return result;
+ }
+ portalData = BuildPortalDataForParentSession(estate, estate->func->out_param_varno, 0);
+ if (portalData != NULL) {
+ result = lappend(result, portalData);
+ }
+ return result;
+ }
+
+ PLpgSQL_row* outRow = (PLpgSQL_row*)outDatum;
+ if (outRow->refname != NULL) {
+ /* means out param is just one normal row variable */
+ return result;
+ }
+ for (int i = 0; i < outRow->nfields; i++) {
+ if (estate->datums[outRow->varnos[i]]->dtype != PLPGSQL_DTYPE_VAR) {
+ continue;
+ }
+ PLpgSQL_var* var = (PLpgSQL_var*)(estate->datums[outRow->varnos[i]]);
+ if (var != NULL && var->datatype != NULL && var->datatype->typoid == REFCURSOROID) {
+ portalData = BuildPortalDataForParentSession(estate, outRow->varnos[i], i);
+ if (portalData != NULL) {
+ result = lappend(result, portalData);
+ }
+ }
+ }
+
+ u_sess->plsql_cxt.parent_session_id = 0;
+ u_sess->plsql_cxt.parent_thread_id = 0;
+ u_sess->plsql_cxt.parent_context = NULL;
+ return result;
+}
+
+static List* BuildFuncInfoList(PLpgSQL_execstate* estate)
+{
+ List* result = NIL;
+ if (estate == NULL) {
+ return result;
+ }
+
+ AutoSessionFuncValInfo *autoSessionFuncInfo = (AutoSessionFuncValInfo *)palloc0(sizeof(AutoSessionFuncValInfo));
+ if (COMPAT_CURSOR) {
+ PLpgSQL_var* var = (PLpgSQL_var*)(estate->datums[estate->found_varno]);
+ autoSessionFuncInfo->found = var->value;
+ var = (PLpgSQL_var*)(estate->datums[estate->sql_cursor_found_varno]);
+ if (var->isnull) {
+ autoSessionFuncInfo->sql_cursor_found = PLPGSQL_NULL;
+ } else {
+ autoSessionFuncInfo->sql_cursor_found = var->value;
+ }
+ var = (PLpgSQL_var*)(estate->datums[estate->sql_notfound_varno]);
+ if (var->isnull) {
+ autoSessionFuncInfo->sql_notfound = PLPGSQL_NULL;
+ } else {
+ autoSessionFuncInfo->sql_notfound = var->value;
+ }
+
+ var = (PLpgSQL_var*)(estate->datums[estate->sql_isopen_varno]);
+ autoSessionFuncInfo->sql_isopen = var->value;
+ var = (PLpgSQL_var*)(estate->datums[estate->sql_rowcount_varno]);
+ autoSessionFuncInfo->sql_rowcount = var->value;
+ }
+ PLpgSQL_var* var = (PLpgSQL_var*)(estate->datums[estate->sqlcode_varno]);
+ if (var->isnull) {
+ autoSessionFuncInfo->sqlcode_isnull = true;
+ autoSessionFuncInfo->sqlcode = 0;
+ } else {
+ autoSessionFuncInfo->sqlcode_isnull = false;
+ char* sqlcode = TextDatumGetCString(var->value);
+ autoSessionFuncInfo->sqlcode = MAKE_SQLSTATE((unsigned char)sqlcode[0], (unsigned char)sqlcode[1],
+ (unsigned char)sqlcode[2], (unsigned char)sqlcode[3],
+ (unsigned char)sqlcode[4]);
+ }
+ result = lappend(result, autoSessionFuncInfo);
+
+ return result;
+}
+
+
+void BuildSessionPackageRuntimeForAutoSession(uint64 sessionId, uint64 parentSessionId,
+ PLpgSQL_execstate* estate, PLpgSQL_function* func)
{
SessionPackageRuntime* parentSessionPkgs = NULL;
@@ -637,7 +1112,7 @@ void BuildSessionPackageRuntime(uint64 sessionId, uint64 parentSessionId)
if (!u_sess->plsql_cxt.not_found_parent_session_pkgs) {
if (u_sess->plsql_cxt.auto_parent_session_pkgs == NULL) {
MemoryContext oldcontext = MemoryContextSwitchTo(SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_OPTIMIZER));
- parentSessionPkgs = g_instance.global_session_pkg->fetch(parentSessionId);
+ parentSessionPkgs = g_instance.global_session_pkg->Fetch(parentSessionId);
MemoryContextSwitchTo(oldcontext);
u_sess->plsql_cxt.auto_parent_session_pkgs = parentSessionPkgs;
} else {
@@ -654,34 +1129,74 @@ void BuildSessionPackageRuntime(uint64 sessionId, uint64 parentSessionId)
SessionPackageRuntime* resultSessionPkgs = (SessionPackageRuntime*)palloc0(sizeof(SessionPackageRuntime));
resultSessionPkgs->context = pkgRuntimeCtx;
if (u_sess->plsql_cxt.plpgsqlpkg_dlist_objects != NULL) {
- copyCurrentSessionPkgs(resultSessionPkgs, u_sess->plsql_cxt.plpgsqlpkg_dlist_objects);
+ CopyCurrentSessionPkgs(resultSessionPkgs, u_sess->plsql_cxt.plpgsqlpkg_dlist_objects);
}
if (parentSessionPkgs) {
List* parentPkgList = parentSessionPkgs->runtimes;
- copyParentSessionPkgs(resultSessionPkgs, parentPkgList);
+ CopyParentSessionPkgs(resultSessionPkgs, parentPkgList);
} else if (parentSessionId != 0) {
u_sess->plsql_cxt.not_found_parent_session_pkgs = true;
}
- g_instance.global_session_pkg->add(sessionId, resultSessionPkgs);
+ /* build portal context for auto session */
+ resultSessionPkgs->portalContext = BuildPortalContextListForAutoSession(func);
+
+ if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT) {
+ resultSessionPkgs->funcValInfo = BuildFuncInfoList(estate);
+ }
+
+ g_instance.global_session_pkg->Add(sessionId, resultSessionPkgs);
MemoryContextSwitchTo(oldCtx);
MemoryContextDelete(resultSessionPkgs->context);
}
-static void copyCurrentSessionPkgs(SessionPackageRuntime* sessionPkgs, DList* pkgList)
+void BuildSessionPackageRuntimeForParentSession(uint64 sessionId, PLpgSQL_execstate* estate)
+{
+ MemoryContext pkgRuntimeCtx = AllocSetContextCreate(CurrentMemoryContext,
+ "SessionPackageRuntime",
+ ALLOCSET_SMALL_MINSIZE,
+ ALLOCSET_SMALL_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE);
+ MemoryContext oldCtx = MemoryContextSwitchTo(pkgRuntimeCtx);
+ SessionPackageRuntime* resultSessionPkgs = (SessionPackageRuntime*)palloc0(sizeof(SessionPackageRuntime));
+ resultSessionPkgs->context = pkgRuntimeCtx;
+ if (u_sess->plsql_cxt.plpgsqlpkg_dlist_objects != NULL) {
+ CopyCurrentSessionPkgs(resultSessionPkgs, u_sess->plsql_cxt.plpgsqlpkg_dlist_objects);
+ }
+
+ /* build portal data for out param ref cursor of automous transaction */
+ resultSessionPkgs->portalData = BuildPortalDataListForParentSession(estate);
+
+ /* copy the portal context return to parent session */
+ if (u_sess->plsql_cxt.auto_parent_session_pkgs != NULL) {
+ resultSessionPkgs->portalContext =
+ CopyPortalContexts(u_sess->plsql_cxt.auto_parent_session_pkgs->portalContext);
+ }
+
+ if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT) {
+ resultSessionPkgs->funcValInfo = BuildFuncInfoList(estate);
+ }
+
+ g_instance.global_session_pkg->Add(sessionId, resultSessionPkgs);
+
+ MemoryContextSwitchTo(oldCtx);
+ MemoryContextDelete(resultSessionPkgs->context);
+}
+
+static void CopyCurrentSessionPkgs(SessionPackageRuntime* sessionPkgs, DList* pkgList)
{
PLpgSQL_package* pkg = NULL;
DListCell* cell = NULL;
dlist_foreach_cell(cell, pkgList) {
pkg = ((plpgsql_pkg_HashEnt*)lfirst(cell))->package;
- PackageRuntimeState* pkgState = buildPkgRunStatesbyPackage(pkg);
+ PackageRuntimeState* pkgState = BuildPkgRunStatesbyPackage(pkg);
sessionPkgs->runtimes = lappend(sessionPkgs->runtimes, pkgState);
}
}
-static bool pkgExistInSession(PackageRuntimeState* pkgState)
+static bool PkgExistInSession(PackageRuntimeState* pkgState)
{
if (pkgState == NULL) {
return false;
@@ -689,74 +1204,68 @@ static bool pkgExistInSession(PackageRuntimeState* pkgState)
PLpgSQL_pkg_hashkey hashkey;
hashkey.pkgOid = pkgState->packageId;
PLpgSQL_package* getpkg = plpgsql_pkg_HashTableLookup(&hashkey);
- if (getpkg) {
- return true;
- } else {
- return false;
- }
+ return getpkg ? true : false;
}
-static void copyParentSessionPkgs(SessionPackageRuntime* sessionPkgs, List* pkgList)
+static void CopyParentSessionPkgs(SessionPackageRuntime* sessionPkgs, List* pkgList)
{
ListCell* cell = NULL;
foreach(cell, pkgList) {
/* if package exist in current session, we already copy it */
- if (pkgExistInSession((PackageRuntimeState*)lfirst(cell))) {
+ if (PkgExistInSession((PackageRuntimeState*)lfirst(cell))) {
continue;
}
PackageRuntimeState* parentPkgState = (PackageRuntimeState*)lfirst(cell);
- PackageRuntimeState* pkgState = buildPkgRunStatebyPkgRunState(parentPkgState);
+ PackageRuntimeState* pkgState = BuildPkgRunStatebyPkgRunState(parentPkgState);
sessionPkgs->runtimes = lappend(sessionPkgs->runtimes, pkgState);
}
}
-static PackageRuntimeState* buildPkgRunStatesbyPackage(PLpgSQL_package* pkg)
+static PackageRuntimeState* BuildPkgRunStatesbyPackage(PLpgSQL_package* pkg)
{
PackageRuntimeState* pkgState = (PackageRuntimeState*)palloc0(sizeof(PackageRuntimeState));
pkgState->packageId = pkg->pkg_oid;
pkgState->size = pkg->ndatums;
pkgState->datums = (PLpgSQL_datum**)palloc0(sizeof(PLpgSQL_datum*) * pkg->ndatums);
for (int i = 0; i < pkg->ndatums; i++) {
- pkgState->datums[i] = copypPackageVarDatum(pkg->datums[i]);
+ pkgState->datums[i] = CopyPackageVarDatum(pkg->datums[i]);
}
return pkgState;
}
-static PackageRuntimeState* buildPkgRunStatebyPkgRunState(PackageRuntimeState* parentPkgState)
+static PackageRuntimeState* BuildPkgRunStatebyPkgRunState(PackageRuntimeState* parentPkgState)
{
PackageRuntimeState* pkgState = (PackageRuntimeState*)palloc0(sizeof(PackageRuntimeState));
pkgState->packageId = parentPkgState->packageId;
pkgState->size = parentPkgState->size;
pkgState->datums = (PLpgSQL_datum**)palloc0(sizeof(PLpgSQL_datum*) * parentPkgState->size);
for (int i = 0; i < parentPkgState->size; i++) {
- pkgState->datums[i] = copypPackageVarDatum(parentPkgState->datums[i]);
+ pkgState->datums[i] = CopyPackageVarDatum(parentPkgState->datums[i]);
}
return pkgState;
}
-static PLpgSQL_datum* copypPackageVarDatum(PLpgSQL_datum* datum)
+static PLpgSQL_datum* CopyPackageVarDatum(PLpgSQL_datum* datum)
{
PLpgSQL_datum* result = NULL;
if (datum == NULL)
return NULL;
/* only VAR store value */
- switch (datum->dtype) {
- case PLPGSQL_DTYPE_VAR: {
- PLpgSQL_var* newm = copyPlpgsqlVar((PLpgSQL_var*)datum);
- result = (PLpgSQL_datum*)newm;
- break;
- }
- default:
- break;
+ if (datum->dtype == PLPGSQL_DTYPE_VAR) {
+ PLpgSQL_var* var = (PLpgSQL_var*)datum;
+ if (unlikely(var->nest_table != NULL))
+ return NULL;
+ PLpgSQL_var* newm = copyPlpgsqlVar(var);
+ result = (PLpgSQL_datum*)newm;
}
return result;
}
/* restore package values by Autonm SessionPkgs */
-static void restoreAutonmSessionPkgs(SessionPackageRuntime* sessionPkgs)
+static void RestoreAutonmSessionPkgs(SessionPackageRuntime* sessionPkgs)
{
if (sessionPkgs == NULL || sessionPkgs->runtimes == NULL) {
return;
@@ -776,12 +1285,12 @@ static void restoreAutonmSessionPkgs(SessionPackageRuntime* sessionPkgs)
if (pkg == NULL) {
pkg = PackageInstantiation(pkgOid);
}
- restorePkgValuesByPkgState(pkg, pkgState);
+ RestorePkgValuesByPkgState(pkg, pkgState);
}
}
/* restore package values by pkgState */
-static void restorePkgValuesByPkgState(PLpgSQL_package* targetPkg, PackageRuntimeState* pkgState, bool isInit)
+static void RestorePkgValuesByPkgState(PLpgSQL_package* targetPkg, PackageRuntimeState* pkgState, bool isInit)
{
if (targetPkg == NULL || pkgState == NULL) {
return;
@@ -796,13 +1305,19 @@ static void restorePkgValuesByPkgState(PLpgSQL_package* targetPkg, PackageRuntim
targetPkg = PackageInstantiation(targetPkg->pkg_oid);
}
- for (int i = 0; i < targetPkg->ndatums && i < pkgState->size; i++) {
- /* null mean datum not a var */
- if (pkgState->datums[i] == NULL) {
+ int startNum = 0;
+ int endNum = targetPkg->ndatums < pkgState->size ? targetPkg->ndatums : pkgState->size;
+ /* when compiling body, need not restore public var */
+ if (isInit && targetPkg->is_bodycompiled) {
+ startNum = targetPkg->public_ndatums;
+ }
+
+ for (int i = startNum; i < endNum; i++) {
+ fromVar = (PLpgSQL_var*)pkgState->datums[i];
+ /* null mean datum not a var, no need to restore */
+ if (fromVar == NULL) {
continue;
}
-
- fromVar = (PLpgSQL_var*)pkgState->datums[i];
/* const value cannot be changed, cursor not supported by automo func yet */
if (fromVar->isconst || fromVar->is_cursor_var || fromVar->datatype->typoid == REFCURSOROID) {
continue;
@@ -835,22 +1350,146 @@ static void restorePkgValuesByPkgState(PLpgSQL_package* targetPkg, PackageRuntim
}
}
-/* init Autonomous session package values by parent session */
+static SessionPackageRuntime* GetSessPkgRuntime(uint64 sessionId)
+{
+ SessionPackageRuntime* sessionPkgs = NULL;
+ if (u_sess->plsql_cxt.auto_parent_session_pkgs == NULL) {
+ MemoryContext oldcontext = MemoryContextSwitchTo(SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_OPTIMIZER));
+ sessionPkgs = g_instance.global_session_pkg->Fetch(sessionId);
+ MemoryContextSwitchTo(oldcontext);
+ u_sess->plsql_cxt.auto_parent_session_pkgs = sessionPkgs;
+ } else {
+ sessionPkgs = u_sess->plsql_cxt.auto_parent_session_pkgs;
+ }
+ return sessionPkgs;
+}
+
+
+/* update packages already in auto session by parent session */
+void initAutoSessionPkgsValue(uint64 sessionId)
+{
+ if (u_sess->is_autonomous_session != true || u_sess->SPI_cxt._connected != 0) {
+ return;
+ }
+
+ ListCell* cell = NULL;
+ PackageRuntimeState* pkgState = NULL;
+ Oid pkgOid = InvalidOid;
+ PLpgSQL_pkg_hashkey hashkey;
+ PLpgSQL_package* pkg = NULL;
+
+ SessionPackageRuntime* sessionPkgs = GetSessPkgRuntime(sessionId);
+
+ if (sessionPkgs == NULL) {
+ u_sess->plsql_cxt.not_found_parent_session_pkgs = true;
+ return;
+ }
+ if (sessionPkgs->runtimes == NULL) {
+ return;
+ }
+
+ foreach(cell, sessionPkgs->runtimes) {
+ pkgState = (PackageRuntimeState*)lfirst(cell);
+ pkgOid = pkgState->packageId;
+ hashkey.pkgOid = pkgOid;
+ pkg = plpgsql_pkg_HashTableLookup(&hashkey);
+ if (pkg == NULL) {
+ continue;
+ }
+ RestorePkgValuesByPkgState(pkg, pkgState);
+ }
+}
+
+void setCursorAtrValue(PLpgSQL_execstate* estate, AutoSessionFuncValInfo* FuncValInfo)
+{
+ PLpgSQL_var* var = NULL;
+
+ var = (PLpgSQL_var*)(estate->datums[estate->found_varno]);
+ var->value = BoolGetDatum(FuncValInfo->found);
+ var->isnull = false;
+
+ /* Set the magic implicit cursor attribute variable FOUND to false */
+ var = (PLpgSQL_var*)(estate->datums[estate->sql_cursor_found_varno]);
+ /* if state is -1, found is set NULL */
+ if (FuncValInfo->sql_cursor_found == PLPGSQL_NULL) {
+ var->value = (Datum)0;
+ var->isnull = true;
+ } else {
+ var->value = (FuncValInfo->sql_cursor_found == 1) ? (Datum)1 : (Datum)0;
+ var->isnull = false;
+ }
+
+ /* Set the magic implicit cursor attribute variable NOTFOUND to true */
+ var = (PLpgSQL_var*)(estate->datums[estate->sql_notfound_varno]);
+ /* if state is -1, notfound is set NULL */
+ if (FuncValInfo->sql_notfound == PLPGSQL_NULL) {
+ var->value = (Datum)0;
+ var->isnull = true;
+ } else {
+ var->value = (FuncValInfo->sql_notfound == 1) ? (Datum)1 : (Datum)0;
+ var->isnull = false;
+ }
+
+ /* Set the magic implicit cursor attribute variable ISOPEN to false */
+ var = (PLpgSQL_var*)(estate->datums[estate->sql_isopen_varno]);
+ var->value = BoolGetDatum(FuncValInfo->sql_isopen);
+ var->isnull = false;
+
+ /* Set the magic implicit cursor attribute variable ROWCOUNT to 0 */
+ var = (PLpgSQL_var*)(estate->datums[estate->sql_rowcount_varno]);
+ /* reset == true and rowcount == -1, rowcount is set NULL */
+ if (FuncValInfo->sql_rowcount == -1) {
+ var->value = (Datum)0;
+ var->isnull = true;
+ } else {
+ var->value = FuncValInfo->sql_rowcount;
+ var->isnull = false;
+ }
+}
+
+void SetFuncInfoValue(List* SessionFuncInfo, PLpgSQL_execstate* estate)
+{
+ ListCell* cell = NULL;
+ AutoSessionFuncValInfo* FuncValInfo = NULL;
+
+ foreach(cell, SessionFuncInfo) {
+ FuncValInfo = (AutoSessionFuncValInfo*)lfirst(cell);
+ if (COMPAT_CURSOR) {
+ setCursorAtrValue(estate, FuncValInfo);
+ }
+ if (!FuncValInfo->sqlcode_isnull) {
+ PLpgSQL_var* var = (PLpgSQL_var*)(estate->datums[estate->sqlcode_varno]);
+ assign_text_var(var, plpgsql_get_sqlstate(FuncValInfo->sqlcode));
+ var = (PLpgSQL_var*)(estate->datums[estate->sqlstate_varno]);
+ assign_text_var(var, plpgsql_get_sqlstate(FuncValInfo->sqlcode));
+ }
+ }
+}
+
+/* update function info already in auto session by parent session */
+void initAutoSessionFuncInfoValue(uint64 sessionId, PLpgSQL_execstate* estate)
+{
+ SessionPackageRuntime* sessionPkgs = GetSessPkgRuntime(sessionId);
+
+ if (sessionPkgs == NULL) {
+ u_sess->plsql_cxt.not_found_parent_session_pkgs = true;
+ return;
+ }
+ if (sessionPkgs->funcValInfo == NULL) {
+ return;
+ }
+ SetFuncInfoValue(sessionPkgs->funcValInfo, estate);
+}
+
+
+/* update packages when initializing package in auto session by parent session */
void initAutonomousPkgValue(PLpgSQL_package* targetPkg, uint64 sessionId)
{
if (u_sess->plsql_cxt.not_found_parent_session_pkgs) {
return;
}
- SessionPackageRuntime* sessionPkgs = NULL;
- if (u_sess->plsql_cxt.auto_parent_session_pkgs == NULL) {
- MemoryContext oldcontext = MemoryContextSwitchTo(SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_OPTIMIZER));
- sessionPkgs = g_instance.global_session_pkg->fetch(sessionId);
- MemoryContextSwitchTo(oldcontext);
- u_sess->plsql_cxt.auto_parent_session_pkgs = sessionPkgs;
- } else {
- sessionPkgs = u_sess->plsql_cxt.auto_parent_session_pkgs;
- }
+ SessionPackageRuntime* sessionPkgs = GetSessPkgRuntime(sessionId);
if (sessionPkgs == NULL) {
u_sess->plsql_cxt.not_found_parent_session_pkgs = true;
@@ -863,15 +1502,63 @@ void initAutonomousPkgValue(PLpgSQL_package* targetPkg, uint64 sessionId)
foreach(cell, sessionPkgs->runtimes) {
pkgState = (PackageRuntimeState*)lfirst(cell);
if (targetPkg->pkg_oid == pkgState->packageId) {
- restorePkgValuesByPkgState(targetPkg, pkgState, true);
+ RestorePkgValuesByPkgState(targetPkg, pkgState, true);
break;
- } else {
- continue;
}
}
}
-void processAutonmSessionPkgs(PLpgSQL_function* func)
+List *processAutonmSessionPkgs(PLpgSQL_function* func, PLpgSQL_execstate* estate, bool isAutonm)
+{
+ List *autonmsList = NULL;
+ /* ignore inline_code_block function */
+ if (!OidIsValid(func->fn_oid)) {
+ return NULL;
+ }
+
+ uint64 currentSessionId = IS_THREAD_POOL_WORKER ? u_sess->session_id : t_thrd.proc_cxt.MyProcPid;
+
+ if (IsAutonomousTransaction(func->action->isAutonomous)) {
+ /*
+ * call after plpgsql_exec_autonm_function(), need restore
+ * autonm session pkgs to current session, and remove
+ * sessionpkgs from g_instance.global_session_pkg
+ */
+ uint64 automnSessionId = u_sess->SPI_cxt.autonomous_session->current_attach_sessionid;
+ SessionPackageRuntime* sessionpkgs = g_instance.global_session_pkg->Fetch(automnSessionId);
+ RestoreAutonmSessionPkgs(sessionpkgs);
+ if (sessionpkgs != NULL) {
+ MemoryContext oldcontext = MemoryContextSwitchTo(SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_OPTIMIZER));
+ u_sess->plsql_cxt.storedPortals = CopyPortalDatas(sessionpkgs);
+ u_sess->plsql_cxt.portalContext = CopyPortalContexts(sessionpkgs->portalContext);
+ autonmsList = CopyFuncInfoDatas(sessionpkgs);
+ u_sess->plsql_cxt.call_after_auto = true;
+ MemoryContextSwitchTo(oldcontext);
+ MemoryContextDelete(sessionpkgs->context);
+ g_instance.global_session_pkg->Remove(automnSessionId);
+ }
+ g_instance.global_session_pkg->Remove(currentSessionId);
+ } else {
+ /*
+ * call after plpgsql_exec_function(), If it is first level
+ * autonomous func, need add its all session package values
+ * to global, the parent session will fetch the sessionPkgs,
+ * and restore package values by it.
+ */
+ if (u_sess->is_autonomous_session == true && u_sess->SPI_cxt._connected == 0) {
+ BuildSessionPackageRuntimeForParentSession(currentSessionId, estate);
+ /* autonomous session will be reused by next autonomous procedure, need clean it */
+ if (u_sess->plsql_cxt.auto_parent_session_pkgs != NULL) {
+ MemoryContextDelete(u_sess->plsql_cxt.auto_parent_session_pkgs->context);
+ u_sess->plsql_cxt.auto_parent_session_pkgs = NULL;
+ }
+ u_sess->plsql_cxt.not_found_parent_session_pkgs = false;
+ }
+ }
+ return autonmsList;
+}
+
+void processAutonmSessionPkgsInException(PLpgSQL_function* func)
{
/* ignore inline_code_block function */
if (!OidIsValid(func->fn_oid)) {
@@ -884,16 +1571,23 @@ void processAutonmSessionPkgs(PLpgSQL_function* func)
/*
* call after plpgsql_exec_autonm_function(), need restore
* autonm session pkgs to current session, and remove
- * sessionpkgs from g_instance.global_session_pkg.
+ * sessionpkgs from g_instance.global_session_pkg
*/
- uint64 automnSessionId = u_sess->SPI_cxt.autonomous_session->current_attach_sessionid;
- SessionPackageRuntime* sessionpkgs = g_instance.global_session_pkg->fetch(automnSessionId);
- restoreAutonmSessionPkgs(sessionpkgs);
- if (sessionpkgs != NULL) {
- MemoryContextDelete(sessionpkgs->context);
- g_instance.global_session_pkg->remove(automnSessionId);
+ if (u_sess->SPI_cxt.autonomous_session == NULL) {
+ /* exception before create autonomous_session */
+ return;
}
- g_instance.global_session_pkg->remove(currentSessionId);
+ uint64 automnSessionId = u_sess->SPI_cxt.autonomous_session->current_attach_sessionid;
+ SessionPackageRuntime* sessionpkgs = g_instance.global_session_pkg->Fetch(automnSessionId);
+ RestoreAutonmSessionPkgs(sessionpkgs);
+ if (sessionpkgs != NULL) {
+ MemoryContext oldcontext = MemoryContextSwitchTo(SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_OPTIMIZER));
+ ReleaseUnusedPortalContext(sessionpkgs->portalContext, true);
+ MemoryContextSwitchTo(oldcontext);
+ MemoryContextDelete(sessionpkgs->context);
+ g_instance.global_session_pkg->Remove(automnSessionId);
+ }
+ g_instance.global_session_pkg->Remove(currentSessionId);
} else {
/*
* call after plpgsql_exec_function(), If it is first level
@@ -902,7 +1596,256 @@ void processAutonmSessionPkgs(PLpgSQL_function* func)
* and restore package values by it.
*/
if (u_sess->is_autonomous_session == true && u_sess->SPI_cxt._connected == 0) {
- BuildSessionPackageRuntime(currentSessionId, 0);
+ BuildSessionPackageRuntimeForParentSession(currentSessionId, NULL);
+ /* autonomous session will be reused by next autonomous procedure, need clean it */
+ if (u_sess->plsql_cxt.auto_parent_session_pkgs != NULL) {
+ MemoryContextDelete(u_sess->plsql_cxt.auto_parent_session_pkgs->context);
+ u_sess->plsql_cxt.auto_parent_session_pkgs = NULL;
+ }
+ u_sess->plsql_cxt.not_found_parent_session_pkgs = false;
}
}
}
+
+#ifndef ENABLE_MULTIPLE_NODES
+Oid GetOldTupleOid(const char* procedureName, oidvector* parameterTypes, Oid procNamespace,
+ Oid propackageid, Datum* values, Datum parameterModes)
+{
+ bool enableOutparamOverride = enable_out_param_override();
+ if (t_thrd.proc->workingVersionNum < 92470) {
+ HeapTuple oldtup = SearchSysCache3(PROCNAMEARGSNSP,
+ PointerGetDatum(procedureName),
+ values[Anum_pg_proc_proargtypes - 1],
+ ObjectIdGetDatum(procNamespace));
+ if (!HeapTupleIsValid(oldtup)) {
+ return InvalidOid;
+ }
+ Oid oldTupleOid = HeapTupleGetOid(oldtup);
+ ReleaseSysCache(oldtup);
+ return oldTupleOid;
+ }
+ if (enableOutparamOverride) {
+ HeapTuple oldtup = NULL;
+ oldtup = SearchSysCacheForProcAllArgs(PointerGetDatum(procedureName),
+ values[Anum_pg_proc_allargtypes - 1],
+ ObjectIdGetDatum(procNamespace),
+ ObjectIdGetDatum(propackageid),
+ parameterModes);
+ if (!HeapTupleIsValid(oldtup)) {
+ return InvalidOid;
+ }
+ Oid oldTupleOid = HeapTupleGetOid(oldtup);
+ ReleaseSysCache(oldtup);
+ return oldTupleOid;
+ } else {
+ CatCList* catlist = NULL;
+ catlist = SearchSysCacheList1(PROCALLARGS, CStringGetDatum(procedureName));
+ for (int i = 0; i < catlist->n_members; i++) {
+ HeapTuple proctup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
+ Oid packageid = InvalidOid;
+ if (HeapTupleIsValid(proctup)) {
+ Form_pg_proc pform = (Form_pg_proc)GETSTRUCT(proctup);
+ Oid oldTupleOid = HeapTupleGetOid(proctup);
+ /* compare function's namespace */
+ if (pform->pronamespace != procNamespace) {
+ continue;
+ }
+ bool isNull = false;
+ Datum packageIdDatum = SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_packageid, &isNull);
+ if (!isNull) {
+ packageid = ObjectIdGetDatum(packageIdDatum);
+ }
+ if (packageid != propackageid) {
+ continue;
+ }
+ oidvector* procParaType = ProcedureGetArgTypes(proctup);
+ bool result = DatumGetBool(
+ DirectFunctionCall2(oidvectoreq, PointerGetDatum(procParaType),
+ PointerGetDatum(parameterTypes)));
+ if (result) {
+ ReleaseSysCacheList(catlist);
+ return oldTupleOid;
+ }
+ }
+ }
+ if (catlist != NULL) {
+ ReleaseSysCacheList(catlist);
+ }
+ }
+ return InvalidOid;
+}
+
+/*
+ * judage the two arglis is same or not
+ */
+bool isSameArgList(CreateFunctionStmt* stmt1, CreateFunctionStmt* stmt2)
+{
+ List* argList1 = stmt1->parameters;
+ List* argList2 = stmt2->parameters;
+ ListCell* cell = NULL;
+ int length1 = list_length(argList1);
+ int length2 = list_length(argList2);
+ bool enable_outparam_override = enable_out_param_override();
+ bool isSameName = true;
+ FunctionParameter** arr1 = (FunctionParameter**)palloc0(length1 * sizeof(FunctionParameter*));
+ FunctionParameter** arr2 = (FunctionParameter**)palloc0(length2 * sizeof(FunctionParameter*));
+ FunctionParameter* fp1 = NULL;
+ FunctionParameter* fp2 = NULL;
+ int inArgNum1 = 0;
+ int inArgNum2 = 0;
+ int inLoc1 = 0;
+ int inLoc2 = 0;
+ int length = 0;
+ foreach(cell, argList1) {
+ arr1[length] = (FunctionParameter*)lfirst(cell);
+ if (arr1[length]->mode != FUNC_PARAM_OUT) {
+ inArgNum1++;
+ }
+ length = length + 1;
+ }
+ length = 0;
+ foreach(cell, argList2) {
+ arr2[length] = (FunctionParameter*)lfirst(cell);
+ if (arr2[length]->mode != FUNC_PARAM_OUT) {
+ inArgNum2++;
+ }
+ length = length + 1;
+ }
+ if (!enable_outparam_override) {
+ if (inArgNum1 != inArgNum2) {
+ return false;
+ } else if (inArgNum1 == inArgNum2 && length1 != length2) {
+ char message[MAXSTRLEN];
+ errno_t rc = sprintf_s(message, MAXSTRLEN, "can not override out param:%s", stmt1->funcname);
+ securec_check_ss_c(rc, "", "");
+ InsertErrorMessage(message, stmt1->startLineNumber);
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmodule(MOD_PLSQL),
+ errmsg("can not override out param:%s",
+ NameListToString(stmt1->funcname))));
+ }
+ } else {
+ if (length1 != length2) {
+ return false;
+ }
+ }
+ for (int i = 0, j = 0; i < length1 || j < length2; i++, j++) {
+ if (!enable_outparam_override) {
+ fp1 = arr1[inLoc1];
+ fp2 = arr2[inLoc2];
+ } else {
+ fp1 = arr1[i];
+ fp2 = arr2[j];
+ }
+ TypeName* t1 = fp1->argType;
+ TypeName* t2 = fp2->argType;
+ if (!enable_outparam_override) {
+ if (fp1->mode == FUNC_PARAM_OUT && fp2->mode == FUNC_PARAM_OUT) {
+ continue;
+ } else if (fp1->mode != FUNC_PARAM_OUT && fp2->mode == FUNC_PARAM_OUT) {
+ inLoc1++;
+ continue;
+ } else if (fp1->mode == FUNC_PARAM_OUT && fp2->mode != FUNC_PARAM_OUT) {
+ inLoc2++;
+ continue;
+ } else {
+ inLoc1++;
+ inLoc2++;
+ }
+ }
+ Oid toid1;
+ Oid toid2;
+ Type typtup1;
+ Type typtup2;
+ errno_t rc;
+ typtup1 = LookupTypeName(NULL, t1, NULL);
+ typtup2 = LookupTypeName(NULL, t2, NULL);
+ bool isTableOf1 = false;
+ bool isTableOf2 = false;
+ Oid baseOid1 = InvalidOid;
+ Oid baseOid2 = InvalidOid;
+ if (HeapTupleIsValid(typtup1)) {
+ toid1 = typeTypeId(typtup1);
+ if (((Form_pg_type)GETSTRUCT(typtup1))->typtype == TYPTYPE_TABLEOF) {
+ baseOid1 = ((Form_pg_type)GETSTRUCT(typtup1))->typelem;
+ isTableOf1 = true;
+ }
+ ReleaseSysCache(typtup1);
+ } else {
+ toid1 = findPackageParameter(strVal(linitial(t1->names)));
+ if (!OidIsValid(toid1)) {
+ char message[MAXSTRLEN];
+ rc = sprintf_s(message, MAXSTRLEN, "type is not exists %s.", fp1->name);
+ securec_check_ss_c(rc, "", "");
+ InsertErrorMessage(message, stmt1->startLineNumber);
+ ereport(ERROR,
+ (errmodule(MOD_PLSQL), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("type is not exists %s.", fp1->name),
+ errdetail("CommandType: %s", fp1->name), errcause("System error."),
+ erraction("Contact Huawei Engineer.")));
+ }
+ }
+ if (HeapTupleIsValid(typtup2)) {
+ toid2 = typeTypeId(typtup2);
+ if (((Form_pg_type)GETSTRUCT(typtup2))->typtype == TYPTYPE_TABLEOF) {
+ baseOid2 = ((Form_pg_type)GETSTRUCT(typtup2))->typelem;
+ isTableOf2 = true;
+ }
+ ReleaseSysCache(typtup2);
+ } else {
+ toid2 = findPackageParameter(strVal(linitial(t2->names)));
+ if (!OidIsValid(toid2)) {
+ char message[MAXSTRLEN];
+ rc = sprintf_s(message, MAXSTRLEN, "type is not exists %s.", fp2->name);
+ securec_check_ss_c(rc, "", "");
+ InsertErrorMessage(message, stmt1->startLineNumber);
+ ereport(ERROR,
+ (errmodule(MOD_PLSQL), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("type is not exists %s.", fp2->name),
+ errdetail("CommandType: %s", fp2->name), errcause("System error."),
+ erraction("Contact Huawei Engineer.")));
+ }
+ }
+ /* If table of type shold check its base type */
+ if (isTableOf1 == isTableOf2 && isTableOf1 == true) {
+ if (baseOid1 != baseOid2 || fp1->mode != fp2->mode) {
+ pfree(arr1);
+ pfree(arr2);
+ return false;
+ }
+ } else if (toid1 != toid2 || fp1->mode != fp2->mode) {
+ pfree(arr1);
+ pfree(arr2);
+ return false;
+ }
+ if (fp1->name == NULL || fp2->name == NULL) {
+ char message[MAXSTRLEN];
+ rc = sprintf_s(message, MAXSTRLEN, "type is not exists.");
+ securec_check_ss_c(rc, "", "");
+ InsertErrorMessage(message, stmt1->startLineNumber);
+ ereport(ERROR,
+ (errmodule(MOD_PLSQL), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("type is not exists."),
+ errdetail("CommandType."), errcause("System error."),
+ erraction("Contact Huawei Engineer.")));
+ }
+ if (strcmp(fp1->name, fp2->name) != 0) {
+ isSameName = false;
+ }
+ }
+ pfree(arr1);
+ pfree(arr2);
+ /* function delcare in package specification and define in package body must be same */
+ if (!isSameName && (stmt1->isFunctionDeclare^stmt2->isFunctionDeclare)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmodule(MOD_PLSQL),
+ errmsg("function declared in package specification and "
+ "package body must be the same, function: %s",
+ NameListToString(stmt1->funcname))));
+ }
+ return true;
+}
+
+#endif
diff --git a/src/common/backend/catalog/heap.cpp b/src/common/backend/catalog/heap.cpp
index 241077c08..44127e6a8 100644
--- a/src/common/backend/catalog/heap.cpp
+++ b/src/common/backend/catalog/heap.cpp
@@ -65,9 +65,11 @@
#include "catalog/pg_tablespace.h"
#include "catalog/pg_type.h"
#include "catalog/pg_type_fn.h"
+#include "catalog/pg_uid_fn.h"
#include "catalog/storage.h"
#include "catalog/storage_xlog.h"
#include "catalog/storage_gtt.h"
+#include "commands/matview.h"
#include "commands/tablecmds.h"
#include "commands/tablespace.h"
#include "commands/typecmds.h"
@@ -85,7 +87,6 @@
#include "pgxc/groupmgr.h"
#include "storage/buf/buf.h"
#include "storage/predicate.h"
-#include "storage/page_compression.h"
#include "storage/buf/bufmgr.h"
#include "storage/lmgr.h"
#include "storage/smgr/smgr.h"
@@ -179,6 +180,16 @@ extern void make_tmptable_cache_key(Oid relNode);
#define RELKIND_IN_RTM (relkind == RELKIND_RELATION || relkind == RELKIND_TOASTVALUE || relkind == RELKIND_MATVIEW)
+static RangePartitionDefState *MakeRangeDefaultSubpartition(PartitionState *partitionState, char *partitionName,
+ char *tablespacename);
+static ListPartitionDefState *MakeListDefaultSubpartition(PartitionState *partitionState, char *partitionName,
+ char *tablespacename);
+static HashPartitionDefState *MakeHashDefaultSubpartition(PartitionState *partitionState, char *partitionName,
+ char *tablespacename);
+static void MakeDefaultSubpartitionName(PartitionState *partitionState, char **subPartitionName,
+ const char *partitionName);
+static void getSubPartitionInfo(char partitionStrategy, Node *partitionDefState, List **subPartitionDefState,
+ char **partitionName, char **tablespacename);
/* ----------------------------------------------------------------
* XXX UGLY HARD CODED BADNESS FOLLOWS XXX
*
@@ -375,7 +386,26 @@ static FormData_pg_attribute a9 = {0,
false,
true,
0};
-static const Form_pg_attribute SysAtt[] = {&a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, &a9};
+
+static FormData_pg_attribute a10 = {0,
+ {"gs_tuple_uid"},
+ INT8OID,
+ 0,
+ sizeof(int64),
+ UidAttributeNumber,
+ 0,
+ -1,
+ -1,
+ true,
+ 'p',
+ 'd',
+ true,
+ false,
+ false,
+ true,
+ 0};
+
+static const Form_pg_attribute SysAtt[] = {&a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, &a9, &a10};
#else
static const Form_pg_attribute SysAtt[] = {&a1, &a2, &a3, &a4, &a5, &a6, &a7};
#endif
@@ -385,7 +415,7 @@ static const Form_pg_attribute SysAtt[] = {&a1, &a2, &a3, &a4, &a5, &a6, &a7};
* Note that we elog if the presented attno is invalid, which would only
* happen if there's a problem upstream.
*/
-Form_pg_attribute SystemAttributeDefinition(AttrNumber attno, bool relhasoids, bool relhasbucket)
+Form_pg_attribute SystemAttributeDefinition(AttrNumber attno, bool relhasoids, bool relhasbucket, bool relhasuids)
{
if (attno >= 0 || attno < -(int)lengthof(SysAtt))
ereport(
@@ -396,6 +426,10 @@ Form_pg_attribute SystemAttributeDefinition(AttrNumber attno, bool relhasoids, b
if (attno == BucketIdAttributeNumber && !relhasbucket)
ereport(
ERROR, (errcode(ERRCODE_INVALID_COLUMN_DEFINITION), errmsg("invalid system attribute number %d", attno)));
+ if (attno == UidAttributeNumber && !relhasuids) {
+ ereport(
+ ERROR, (errcode(ERRCODE_INVALID_COLUMN_DEFINITION), errmsg("invalid system attribute number %d", attno)));
+ }
return SysAtt[-attno - 1];
}
@@ -480,9 +514,8 @@ static void InitSubPartitionDef(Partition newPartition, Oid partOid, char strate
*/
Relation heap_create(const char* relname, Oid relnamespace, Oid reltablespace, Oid relid, Oid relfilenode,
Oid bucketOid, TupleDesc tupDesc, char relkind, char relpersistence, bool partitioned_relation, bool rowMovement,
- bool shared_relation, bool mapped_relation, bool allow_system_table_mods, int8 row_compress, Datum reloptions,
- Oid ownerid, bool skip_create_storage, TableAmType tam_type, int8 relindexsplit, StorageType storage_type,
- bool newcbi, Oid accessMethodObjectId)
+ bool shared_relation, bool mapped_relation, bool allow_system_table_mods, int8 row_compress, Oid ownerid,
+ bool skip_create_storage, TableAmType tam_type, int8 relindexsplit, StorageType storage_type, bool newcbi)
{
bool create_storage = false;
Relation rel;
@@ -593,11 +626,9 @@ Relation heap_create(const char* relname, Oid relnamespace, Oid reltablespace, O
relpersistence,
relkind,
row_compress,
- reloptions,
tam_type,
relindexsplit,
- storage_type,
- accessMethodObjectId
+ storage_type
);
if (partitioned_relation) {
@@ -947,7 +978,7 @@ void InsertPgAttributeTuple(Relation pg_attribute_rel, Form_pg_attribute new_att
* tuples to pg_attribute.
* --------------------------------
*/
-static void AddNewAttributeTuples(Oid new_rel_oid, TupleDesc tupdesc, char relkind, bool oidislocal, int oidinhcount, bool hasbucket)
+static void AddNewAttributeTuples(Oid new_rel_oid, TupleDesc tupdesc, char relkind, bool oidislocal, int oidinhcount, bool hasbucket, bool hasuids)
{
Form_pg_attribute attr;
int i;
@@ -1016,6 +1047,8 @@ static void AddNewAttributeTuples(Oid new_rel_oid, TupleDesc tupdesc, char relki
continue;
if (!hasbucket && SysAtt[i]->attnum == BucketIdAttributeNumber)
continue;
+ if (!hasuids && SysAtt[i]->attnum == UidAttributeNumber)
+ continue;
rc = memcpy_s(&attStruct, sizeof(FormData_pg_attribute), (char*)SysAtt[i], sizeof(FormData_pg_attribute));
securec_check(rc, "\0", "\0");
@@ -2492,6 +2525,7 @@ Oid heap_create_with_catalog(const char *relname, Oid relnamespace, Oid reltable
Oid relbucketOid = InvalidOid;
int2vector* bucketcol = NULL;
bool relhasbucket = false;
+ bool relhasuids = false;
pg_class_desc = heap_open(RelationRelationId, RowExclusiveLock);
@@ -2654,6 +2688,9 @@ Oid heap_create_with_catalog(const char *relname, Oid relnamespace, Oid reltable
TableAmType tam = get_tableam_from_reloptions(hreloptions, relkind, InvalidOid);
int8 indexsplit = get_indexsplit_from_reloptions(hreloptions, InvalidOid);
+ /* Get uids info from reloptions */
+ relhasuids = StdRdOptionsHasUids(hreloptions, relkind);
+
/*
* Create the relcache entry (mostly dummy at this point) and the physical
* disk file. (If we fail further down, it's the smgr's responsibility to
@@ -2675,7 +2712,6 @@ Oid heap_create_with_catalog(const char *relname, Oid relnamespace, Oid reltable
mapped_relation,
allow_system_table_mods,
row_compress,
- reloptions,
ownerid,
false,
tam,
@@ -2837,7 +2873,7 @@ Oid heap_create_with_catalog(const char *relname, Oid relnamespace, Oid reltable
* now add tuples to pg_attribute for the attributes in our new relation.
*/
AddNewAttributeTuples(
- relid, new_rel_desc->rd_att, relkind, oidislocal, oidinhcount, relhasbucket);
+ relid, new_rel_desc->rd_att, relkind, oidislocal, oidinhcount, relhasbucket, relhasuids);
if (ceLst != NULL) {
AddNewGsSecEncryptedColumnsTuples(relid, ceLst);
}
@@ -3524,6 +3560,13 @@ void heap_drop_with_catalog(Oid relid)
* until transaction commit. This ensures no one else will try to do
* something with the doomed relation.
*/
+ if (ISMLOG(RelationGetForm(rel)->relname.data)) {
+ char *base_relid_str = RelationGetForm(rel)->relname.data + MLOGLEN;
+ Oid base_relid = atoi(base_relid_str);
+ if (OidIsValid(base_relid)) {
+ CacheInvalidateRelcacheByRelid(base_relid);
+ }
+ }
relation_close(rel, NoLock);
/*
@@ -5205,7 +5248,7 @@ void dropDeltaTableOnPartition(Oid partId)
*
*/
Partition heapCreatePartition(const char* part_name, bool for_partitioned_table, Oid part_tablespace, Oid part_id,
- Oid partFileNode, Oid bucketOid, Oid ownerid, StorageType storage_type, bool newcbi, Datum reloptions)
+ Oid partFileNode, Oid bucketOid, Oid ownerid, StorageType storage_type, bool newcbi)
{
Partition new_part_desc = NULL;
bool createStorage = false;
@@ -5258,8 +5301,7 @@ Partition heapCreatePartition(const char* part_name, bool for_partitioned_table,
part_id, /* partition oid */
partFileNode, /* partition's file node, same as partition oid*/
part_tablespace,
- for_partitioned_table ? HEAP_DISK : storage_type,
- reloptions);
+ for_partitioned_table ? HEAP_DISK : storage_type);
/*
* Save newcbi as a context indicator to
@@ -5722,7 +5764,7 @@ Oid heapAddRangePartition(Relation pgPartRel, Oid partTableOid, Oid partTablespa
/* transform boundary value */
boundaryValue = transformPartitionBoundary(newPartDef->boundary, isTimestamptz);
- /*get partition tablespace*/
+ /* get partition tablespace oid */
if (newPartDef->tablespacename) {
newPartitionTableSpaceOid = get_tablespace_oid(newPartDef->tablespacename, false);
}
@@ -5763,9 +5805,7 @@ Oid heapAddRangePartition(Relation pgPartRel, Oid partTableOid, Oid partTablespa
newPartrelfileOid,
bucketOid,
ownerid,
- storage_type,
- false,
- reloptions);
+ storage_type);
Assert(newPartitionOid == PartitionGetPartid(newPartition));
if (isSubpartition) {
@@ -5876,7 +5916,7 @@ char* GenIntervalPartitionName(Relation rel)
rc = snprintf_s(partName, NAMEDATALEN, NAMEDATALEN - 1, INTERVAL_PARTITION_NAME_PREFIX_FMT, suffix);
securec_check_ss(rc, "\0", "\0");
existingPartOid = partitionNameGetPartitionOid(
- rel->rd_id, partName, PART_OBJ_TYPE_TABLE_PARTITION, AccessExclusiveLock, true, false, NULL, NULL, NoLock);
+ rel->rd_id, partName, PART_OBJ_TYPE_TABLE_PARTITION, AccessShareLock, true, false, NULL, NULL, NoLock);
if (!OidIsValid(existingPartOid)) {
return partName;
}
@@ -5972,9 +6012,7 @@ Oid HeapAddIntervalPartition(Relation pgPartRel, Relation rel, Oid partTableOid,
partrelfileOid,
bucketOid,
ownerid,
- storage_type,
- false,
- reloptions);
+ storage_type);
pfree(partName);
Assert(newPartitionOid == PartitionGetPartid(newPartition));
@@ -6008,7 +6046,6 @@ Oid HeapAddListPartition(Relation pgPartRel, Oid partTableOid, Oid partTablespac
Oid partrelfileOid = InvalidOid;
Relation relation;
Partition newListPartition;
- int maxLength = 64;
/*missing partition definition structure*/
if (!PointerIsValid(newListPartDef)) {
ereport(ERROR, (errcode(ERRCODE_DATA_CORRUPTED), errmsg("missing definition for new partition")));
@@ -6017,10 +6054,10 @@ Oid HeapAddListPartition(Relation pgPartRel, Oid partTableOid, Oid partTablespac
if (!PointerIsValid(newListPartDef->boundary)) {
ereport(ERROR, (errcode(ERRCODE_DATA_CORRUPTED), errmsg("boundary not defined for new partition")));
}
- if (newListPartDef->boundary->length > maxLength) {
+ if (newListPartDef->boundary->length > PARTKEY_VALUE_MAXNUM) {
ereport(ERROR,
(errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
- errmsg("too many partition keys, allowed is %d", maxLength)));
+ errmsg("too many partition keys, allowed is %d", PARTKEY_VALUE_MAXNUM)));
}
/*new partition name check*/
@@ -6031,7 +6068,7 @@ Oid HeapAddListPartition(Relation pgPartRel, Oid partTableOid, Oid partTablespac
/* transform boundary value */
boundaryValue = transformListBoundary(newListPartDef->boundary, isTimestamptz);
- /*get partition tablespace*/
+ /* get partition tablespace oid */
if (newListPartDef->tablespacename) {
newPartitionTableSpaceOid = get_tablespace_oid(newListPartDef->tablespacename, false);
}
@@ -6294,10 +6331,10 @@ Oid HeapAddHashPartition(Relation pgPartRel, Oid partTableOid, Oid partTablespac
if (!PointerIsValid(newHashPartDef->boundary)) {
ereport(ERROR, (errcode(ERRCODE_DATA_CORRUPTED), errmsg("boundary not defined for new partition")));
}
- if (newHashPartDef->boundary->length > MAX_PARTITIONKEY_NUM) {
+ if (newHashPartDef->boundary->length != 1) {
ereport(ERROR,
(errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
- errmsg("too many partition keys, allowed is %d", MAX_PARTITIONKEY_NUM)));
+ errmsg("too many partition keys, allowed is 1")));
}
/*new partition name check*/
@@ -6309,7 +6346,7 @@ Oid HeapAddHashPartition(Relation pgPartRel, Oid partTableOid, Oid partTablespac
bool isTime = false;
boundaryValue = transformPartitionBoundary(newHashPartDef->boundary, &isTime);
- /*get partition tablespace*/
+ /* get partition tablespace oid */
if (newHashPartDef->tablespacename) {
newPartitionTableSpaceOid = get_tablespace_oid(newHashPartDef->tablespacename, false);
}
@@ -6349,9 +6386,7 @@ Oid HeapAddHashPartition(Relation pgPartRel, Oid partTableOid, Oid partTablespac
partrelfileOid,
bucketOid,
ownerid,
- storage_type,
- false,
- reloptions);
+ storage_type);
Assert(newHashPartitionOid == PartitionGetPartid(newHashPartition));
if (isSubpartition) {
@@ -6526,9 +6561,7 @@ static void addNewPartitionTupleForTable(Relation pg_partition_rel, const char*
new_partition_rfoid,
InvalidOid,
ownerid,
- HEAP_DISK,
- false,
- reloptions);
+ HEAP_DISK);
Assert(new_partition_oid == PartitionGetPartid(new_partition));
new_partition->pd_part->parttype = PART_OBJ_TYPE_PARTED_TABLE;
@@ -6586,11 +6619,18 @@ bool IsExistDefaultSubpartitionName(List *partitionNameList, char *defaultPartit
return false;
}
-void MakeDefaultSubpartitionName(PartitionState *partitionState, char** subPartitionName, const char* partitionName)
+static void MakeDefaultSubpartitionName(PartitionState *partitionState, char **subPartitionName,
+ const char *partitionName)
{
int numLen = 0;
int subPartitionNameLen = 0;
- List *partitionNameList = GetPartitionNameList(partitionState->partitionList);
+ List *partitionNameList = NIL;
+ if (PointerIsValid(partitionState->partitionList)) {
+ partitionNameList = GetPartitionNameList(partitionState->partitionList);
+ } else if (PointerIsValid(partitionState->partitionNameList)) {
+ partitionNameList = partitionState->partitionNameList;
+ }
+
for (int i = 1; i < INT32_MAX_VALUE; i++) {
numLen = (int)log10(i) + 1;
@@ -6615,10 +6655,13 @@ void MakeDefaultSubpartitionName(PartitionState *partitionState, char** subParti
break;
}
}
- list_free_ext(partitionNameList);
+
+ if (PointerIsValid(partitionState->partitionList)) {
+ list_free_ext(partitionNameList);
+ }
}
-ListPartitionDefState *MakeListDefaultSubpartition(PartitionState *partitionState, char *partitionName,
+static ListPartitionDefState *MakeListDefaultSubpartition(PartitionState *partitionState, char *partitionName,
char *tablespacename)
{
ListPartitionDefState *subPartitionDefState = makeNode(ListPartitionDefState);
@@ -6632,7 +6675,7 @@ ListPartitionDefState *MakeListDefaultSubpartition(PartitionState *partitionStat
return subPartitionDefState;
}
-HashPartitionDefState *MakeHashDefaultSubpartition(PartitionState *partitionState, char *partitionName,
+static HashPartitionDefState *MakeHashDefaultSubpartition(PartitionState *partitionState, char *partitionName,
char *tablespacename)
{
HashPartitionDefState *subPartitionDefState = makeNode(HashPartitionDefState);
@@ -6644,7 +6687,7 @@ HashPartitionDefState *MakeHashDefaultSubpartition(PartitionState *partitionStat
return subPartitionDefState;
}
-RangePartitionDefState *MakeRangeDefaultSubpartition(PartitionState *partitionState, char *partitionName,
+static RangePartitionDefState *MakeRangeDefaultSubpartition(PartitionState *partitionState, char *partitionName,
char *tablespacename)
{
RangePartitionDefState *subPartitionDefState = makeNode(RangePartitionDefState);
@@ -6657,7 +6700,7 @@ RangePartitionDefState *MakeRangeDefaultSubpartition(PartitionState *partitionSt
return subPartitionDefState;
}
-void getSubPartitionInfo(char partitionStrategy, Node *partitionDefState,
+static void getSubPartitionInfo(char partitionStrategy, Node *partitionDefState,
List **subPartitionDefState, char **partitionName, char **tablespacename)
{
if (partitionStrategy == PART_STRATEGY_LIST) {
@@ -6702,42 +6745,93 @@ Node *MakeDefaultSubpartition(PartitionState *partitionState, Node *partitionDef
return NULL;
}
-static void addNewSubPartitionTuplesForPartition(Relation pgPartRel, Oid partTableOid, Oid partTablespace,
+List *addNewSubPartitionTuplesForPartition(Relation pgPartRel, Oid partTableOid, Oid partTablespace,
Oid bucketOid, Oid ownerid, Datum reloptions,
const bool *isTimestamptz, StorageType storage_type,
PartitionState *partitionState, Node *partitionDefState,
LOCKMODE partLockMode)
{
- if (partitionState->subPartitionState != NULL) {
- PartitionState *subPartitionState = partitionState->subPartitionState;
- List *subPartitionDefStateList = NIL;
- char *partitionName = NULL;
- char *tablespacename = NULL;
- ListCell *lc = NULL;
- char partitionStrategy = partitionState->partitionStrategy;
- char subPartitionStrategy = subPartitionState->partitionStrategy;
- getSubPartitionInfo(partitionStrategy, partitionDefState, &subPartitionDefStateList, &partitionName,
- &tablespacename);
+ List *subpartOidList = NIL;
+ if (partitionState->subPartitionState == NULL) {
+ return NIL;
+ }
+
+ PartitionState *subPartitionState = partitionState->subPartitionState;
+ List *subPartitionDefStateList = NIL;
+ char *partitionName = NULL;
+ char *tablespacename = NULL;
+ ListCell *lc = NULL;
+ Oid subpartOid = InvalidOid;
+ char partitionStrategy = partitionState->partitionStrategy;
+ char subPartitionStrategy = subPartitionState->partitionStrategy;
+ getSubPartitionInfo(partitionStrategy, partitionDefState, &subPartitionDefStateList, &partitionName,
+ &tablespacename);
+ foreach (lc, subPartitionDefStateList) {
if (subPartitionStrategy == PART_STRATEGY_LIST) {
- foreach (lc, subPartitionDefStateList) {
- ListPartitionDefState *subPartitionDefState = (ListPartitionDefState *)lfirst(lc);
- (void)HeapAddListPartition(pgPartRel, partTableOid, partTablespace, bucketOid, subPartitionDefState,
- ownerid, reloptions, isTimestamptz, storage_type, NULL, true);
- }
+ ListPartitionDefState *subPartitionDefState = (ListPartitionDefState *)lfirst(lc);
+ subpartOid = HeapAddListPartition(pgPartRel, partTableOid, partTablespace, bucketOid,
+ subPartitionDefState, ownerid, reloptions, isTimestamptz, storage_type, NULL, true);
} else if (subPartitionStrategy == PART_STRATEGY_HASH) {
- foreach (lc, subPartitionDefStateList) {
- HashPartitionDefState *subPartitionDefState = (HashPartitionDefState *)lfirst(lc);
- (void)HeapAddHashPartition(pgPartRel, partTableOid, partTablespace, bucketOid, subPartitionDefState,
- ownerid, reloptions, isTimestamptz, storage_type, NULL, true);
- }
+ HashPartitionDefState *subPartitionDefState = (HashPartitionDefState *)lfirst(lc);
+ subpartOid = HeapAddHashPartition(pgPartRel, partTableOid, partTablespace, bucketOid,
+ subPartitionDefState, ownerid, reloptions, isTimestamptz, storage_type, NULL, true);
} else {
- foreach (lc, subPartitionDefStateList) {
- RangePartitionDefState *subPartitionDefState = (RangePartitionDefState *)lfirst(lc);
- (void)heapAddRangePartition(pgPartRel, partTableOid, partTablespace, bucketOid, subPartitionDefState,
- ownerid, reloptions, isTimestamptz, storage_type, partLockMode, NULL, true);
- }
+ RangePartitionDefState *subPartitionDefState = (RangePartitionDefState *)lfirst(lc);
+ subpartOid = heapAddRangePartition(pgPartRel, partTableOid, partTablespace, bucketOid,
+ subPartitionDefState, ownerid, reloptions, isTimestamptz, storage_type, partLockMode, NULL, true);
+ }
+ if (OidIsValid(subpartOid)) {
+ subpartOidList = lappend_oid(subpartOidList, subpartOid);
}
}
+
+ return subpartOidList;
+}
+
+/*
+ * check whether the partion key has timestampwithzone type.
+ */
+static void IsPartitionKeyContainTimestampwithzoneType(const PartitionState *partTableState, const TupleDesc tupledesc,
+ bool *isTimestamptz, int partKeyNum)
+{
+ ListCell *partKeyCell = NULL;
+ ColumnRef *col = NULL;
+ char *columName = NULL;
+ int partKeyIdx = 0;
+ int attnum = tupledesc->natts;
+ Form_pg_attribute *attrs = tupledesc->attrs;
+
+ foreach (partKeyCell, partTableState->partitionKey) {
+ col = (ColumnRef *)lfirst(partKeyCell);
+ columName = ((Value *)linitial(col->fields))->val.str;
+
+ isTimestamptz[partKeyIdx] = false;
+ for (int i = 0; i < attnum; i++) {
+ if (TIMESTAMPTZOID == attrs[i]->atttypid && 0 == strcmp(columName, attrs[i]->attname.data)) {
+ isTimestamptz[partKeyIdx] = true;
+ break;
+ }
+ }
+ partKeyIdx++;
+ }
+
+ Assert(partKeyIdx == partKeyNum);
+}
+
+/* if partition's tablespace is not provided, it will inherit from parent partitioned
+ * so for a subpartition, the tablespace itself is used, if not exist, inherit from the partition, and if
+ * still not exist, inherit from the table */
+Oid GetPartTablespaceOidForSubpartition(Oid reltablespace, const char* partTablespacename)
+{
+ Oid partTablespaceOid = InvalidOid;
+ /* get partition tablespace oid */
+ if (PointerIsValid(partTablespacename)) {
+ partTablespaceOid = get_tablespace_oid(partTablespacename, false);
+ }
+ if (!OidIsValid(partTablespaceOid)) {
+ partTablespaceOid = reltablespace;
+ }
+ return partTablespaceOid;
}
/*
@@ -6758,38 +6852,19 @@ static void addNewPartitionTuplesForPartition(Relation pg_partition_rel, Oid rel
Oid reltablespace, Oid bucketOid, PartitionState* partTableState, Oid ownerid, Datum reloptions,
const TupleDesc tupledesc, char strategy, StorageType storage_type, LOCKMODE partLockMode)
{
- /*
- *check whether the partion key has timestampwithzone type.
- */
- ListCell* partKeyCell = NULL;
- ColumnRef* col = NULL;
- char* columName = NULL;
int partKeyNum = list_length(partTableState->partitionKey);
+ bool isTimestamptzForPartKey[partKeyNum];
+ memset_s(isTimestamptzForPartKey, sizeof(isTimestamptzForPartKey), 0, sizeof(isTimestamptzForPartKey));
+ IsPartitionKeyContainTimestampwithzoneType(partTableState, tupledesc, isTimestamptzForPartKey, partKeyNum);
- int attnum = tupledesc->natts;
- Form_pg_attribute* attrs = tupledesc->attrs;
-
- int partKeyIdx = 0;
- bool isTimestamptz[partKeyNum];
-
- memset_s(isTimestamptz, sizeof(isTimestamptz), 0, sizeof(isTimestamptz));
-
- foreach (partKeyCell, partTableState->partitionKey) {
- col = (ColumnRef*)lfirst(partKeyCell);
- columName = ((Value*)linitial(col->fields))->val.str;
-
- isTimestamptz[partKeyIdx] = false;
- for (int i = 0; i < attnum; i++) {
- if (TIMESTAMPTZOID == attrs[i]->atttypid && 0 == strcmp(columName, attrs[i]->attname.data)) {
- isTimestamptz[partKeyIdx] = true;
- break;
- }
- }
- partKeyIdx++;
+ bool *isTimestamptzForSubPartKey = NULL;
+ if (partTableState->subPartitionState != NULL) {
+ int subPartKeyNum = list_length(partTableState->subPartitionState->partitionKey);
+ isTimestamptzForSubPartKey = (bool*)palloc0(sizeof(bool) * subPartKeyNum);
+ IsPartitionKeyContainTimestampwithzoneType(partTableState->subPartitionState, tupledesc,
+ isTimestamptzForSubPartKey, subPartKeyNum);
}
- Assert(partKeyIdx == partKeyNum);
-
ListCell* cell = NULL;
Assert(pg_partition_rel);
@@ -6817,12 +6892,18 @@ static void addNewPartitionTuplesForPartition(Relation pg_partition_rel, Oid rel
partitionDefState,
ownerid,
reloptions,
- isTimestamptz,
+ isTimestamptzForPartKey,
storage_type,
subpartition_key_attr_no);
- addNewSubPartitionTuplesForPartition(
- pg_partition_rel, partitionOid, reltablespace, bucketOid, ownerid, reloptions, isTimestamptz,
- storage_type, partTableState, (Node*)partitionDefState, partLockMode);
+
+ Oid partTablespaceOid =
+ GetPartTablespaceOidForSubpartition(reltablespace, partitionDefState->tablespacename);
+ List *subpartitionOidList = addNewSubPartitionTuplesForPartition(pg_partition_rel, partitionOid,
+ partTablespaceOid, bucketOid, ownerid, reloptions, isTimestamptzForSubPartKey, storage_type,
+ partTableState, (Node *)partitionDefState, partLockMode);
+ if (subpartitionOidList != NIL) {
+ list_free_ext(subpartitionOidList);
+ }
} else if (strategy == PART_STRATEGY_HASH) {
HashPartitionDefState* partitionDefState = (HashPartitionDefState*)lfirst(cell);
if (partTableState->subPartitionState != NULL && partitionDefState->subPartitionDefState == NULL) {
@@ -6837,12 +6918,18 @@ static void addNewPartitionTuplesForPartition(Relation pg_partition_rel, Oid rel
partitionDefState,
ownerid,
reloptions,
- isTimestamptz,
+ isTimestamptzForPartKey,
storage_type,
subpartition_key_attr_no);
- addNewSubPartitionTuplesForPartition(
- pg_partition_rel, partitionOid, reltablespace, bucketOid, ownerid, reloptions, isTimestamptz,
- storage_type, partTableState, (Node*)partitionDefState, partLockMode);
+
+ Oid partTablespaceOid =
+ GetPartTablespaceOidForSubpartition(reltablespace, partitionDefState->tablespacename);
+ List *subpartitionOidList = addNewSubPartitionTuplesForPartition(pg_partition_rel, partitionOid,
+ partTablespaceOid, bucketOid, ownerid, reloptions, isTimestamptzForSubPartKey, storage_type,
+ partTableState, (Node *)partitionDefState, partLockMode);
+ if (subpartitionOidList != NIL) {
+ list_free_ext(subpartitionOidList);
+ }
} else {
RangePartitionDefState* partitionDefState = (RangePartitionDefState*)lfirst(cell);
if (partTableState->subPartitionState != NULL && partitionDefState->subPartitionDefState == NULL) {
@@ -6857,15 +6944,24 @@ static void addNewPartitionTuplesForPartition(Relation pg_partition_rel, Oid rel
(RangePartitionDefState*)lfirst(cell),
ownerid,
reloptions,
- isTimestamptz,
+ isTimestamptzForPartKey,
storage_type,
partLockMode,
subpartition_key_attr_no);
- addNewSubPartitionTuplesForPartition(
- pg_partition_rel, partitionOid, reltablespace, bucketOid, ownerid, reloptions, isTimestamptz,
- storage_type, partTableState, (Node*)partitionDefState, partLockMode);
+
+ Oid partTablespaceOid =
+ GetPartTablespaceOidForSubpartition(reltablespace, partitionDefState->tablespacename);
+ List *subpartitionOidList = addNewSubPartitionTuplesForPartition(pg_partition_rel, partitionOid,
+ partTablespaceOid, bucketOid, ownerid, reloptions, isTimestamptzForSubPartKey, storage_type,
+ partTableState, (Node *)partitionDefState, partLockMode);
+ if (subpartitionOidList != NIL) {
+ list_free_ext(subpartitionOidList);
+ }
}
}
+ if (isTimestamptzForSubPartKey != NULL) {
+ pfree_ext(isTimestamptzForSubPartKey);
+ }
}
void heap_truncate_one_part(Relation rel, Oid partOid)
@@ -7428,7 +7524,7 @@ bool* CheckPartkeyHasTimestampwithzone(Relation partTableRel, bool isForSubParti
pgPartRel = relation_open(PartitionRelationId, AccessShareLock);
- if (isForSubPartition) {
+ if (isForSubPartition || RelationIsPartitionOfSubPartitionTable(partTableRel)) {
partitionTableTuple = SearchSysCache1(PARTRELID, ObjectIdGetDatum(partTableRel->rd_id));
} else {
partitionTableTuple =
@@ -7493,7 +7589,7 @@ bool* CheckPartkeyHasTimestampwithzone(Relation partTableRel, bool isForSubParti
}
}
- if (isForSubPartition)
+ if (isForSubPartition || RelationIsPartitionOfSubPartitionTable(partTableRel))
ReleaseSysCache(partitionTableTuple);
else
heap_freetuple_ext(partitionTableTuple);
@@ -7607,3 +7703,37 @@ int GetIndexKeyAttsByTuple(Relation relation, HeapTuple indexTuple)
return DatumGetInt16(indkeyDatum);
}
+
+void AddOrDropUidsAttr(Oid relOid, bool oldRelHasUids, bool newRelHasUids)
+{
+ /* reloption uids don't change, do nothing */
+ if (oldRelHasUids == newRelHasUids) {
+ return;
+ }
+ /* insert uid attr if new reloption has uid */
+ if (newRelHasUids) {
+ Relation rel = heap_open(AttributeRelationId, RowExclusiveLock);
+ CatalogIndexState indstate = CatalogOpenIndexes(rel);
+ FormData_pg_attribute attStruct;
+ errno_t rc;
+ int uidAttrNum = -UidAttributeNumber;
+ rc = memcpy_s(&attStruct, sizeof(FormData_pg_attribute),
+ (char*)SysAtt[uidAttrNum - 1], sizeof(FormData_pg_attribute));
+ securec_check(rc, "\0", "\0");
+ /* Fill in the correct relation OID in the copied tuple */
+ attStruct.attrelid = relOid;
+ InsertPgAttributeTuple(rel, &attStruct, indstate);
+ CatalogCloseIndexes(indstate);
+ heap_close(rel, RowExclusiveLock);
+
+ /* Also insert uid backup table */
+ InsertUidEntry(relOid);
+ } else { /* delete attr if new reloption does not has uid */
+ ObjectAddress object;
+ object.classId = RelationRelationId;
+ object.objectId = relOid;
+ object.objectSubId = UidAttributeNumber;
+ performDeletion(&object, DROP_RESTRICT, 0);
+ }
+}
+
diff --git a/src/common/backend/catalog/index.cpp b/src/common/backend/catalog/index.cpp
index f2312132b..e86cc5afc 100644
--- a/src/common/backend/catalog/index.cpp
+++ b/src/common/backend/catalog/index.cpp
@@ -130,16 +130,14 @@ static bool binary_upgrade_is_next_psort_array_pg_type_oid_valid();
static Oid binary_upgrade_get_next_part_index_pg_class_rfoid();
static Oid bupgrade_get_next_psort_pg_class_rfoid();
-static const int max_hashbucket_index_worker = 4;
+static const int max_hashbucket_index_worker = 32;
static inline int get_parallel_workers(Relation heap)
{
- int parallel_workers = RelationGetParallelWorkers(heap, -1);
+ int parallel_workers = RelationGetParallelWorkers(heap, 0);
- if (parallel_workers != -1) {
+ if (parallel_workers != 0) {
parallel_workers = Min(max_hashbucket_index_worker, parallel_workers);
- } else {
- parallel_workers = max_hashbucket_index_worker;
}
return parallel_workers;
@@ -329,8 +327,8 @@ static TupleDesc ConstructTupleDescriptor(Relation heapRelation, IndexInfo* inde
/*
* here we are indexing on a system attribute (-1...-n)
*/
- from = SystemAttributeDefinition(
- atnum, heapRelation->rd_rel->relhasoids, RELATION_HAS_BUCKET(heapRelation));
+ from = SystemAttributeDefinition(atnum, heapRelation->rd_rel->relhasoids,
+ RELATION_HAS_BUCKET(heapRelation), RELATION_HAS_UIDS(heapRelation));
} else {
/*
* here we are indexing on a normal attribute (1...n)
@@ -914,9 +912,9 @@ Oid index_create(Relation heapRelation, const char *indexRelationName, Oid index
indexRelation = heap_create(indexRelationName, namespaceId, tableSpaceId, indexRelationId, relFileNode,
RELATION_CREATE_BUCKET(heapRelation) ? heapRelation->rd_bucketoid : InvalidOid, indexTupDesc, relKind,
relpersistence, isLocalPart, false, shared_relation, mapped_relation, allow_system_table_mods,
- REL_CMPRS_NOT_SUPPORT, (Datum)reloptions, heapRelation->rd_rel->relowner, skip_create_storage,
+ REL_CMPRS_NOT_SUPPORT, heapRelation->rd_rel->relowner, skip_create_storage,
isUstore ? TAM_USTORE : TAM_HEAP, /* XXX: Index tables are by default HEAP Table Type */
- relindexsplit, storage_type, extra->crossBucket, accessMethodObjectId);
+ relindexsplit, storage_type, extra->crossBucket);
Assert(indexRelationId == RelationGetRelid(indexRelation));
@@ -934,6 +932,7 @@ Oid index_create(Relation heapRelation, const char *indexRelationName, Oid index
* XXX should have a cleaner way to create cataloged indexes
*/
indexRelation->rd_rel->relowner = heapRelation->rd_rel->relowner;
+ indexRelation->rd_rel->relam = accessMethodObjectId;
indexRelation->rd_rel->relhasoids = false;
if (accessMethodObjectId == PSORT_AM_OID) {
@@ -1245,8 +1244,7 @@ Oid partition_index_create(const char* partIndexName, /* the name of partition i
parentIndex->rd_bucketoid,
parentIndex->rd_rel->relowner,
RelationGetStorageType(parentIndex),
- extra->crossbucket,
- indexRelOptions);
+ extra->crossbucket);
partitionIndex->pd_part->parttype = PART_OBJ_TYPE_INDEX_PARTITION;
partitionIndex->pd_part->rangenum = 0;
partitionIndex->pd_part->parentid = parentIndexId;
@@ -1284,13 +1282,9 @@ Oid partition_index_create(const char* partIndexName, /* the name of partition i
partitionIndex->pd_part->relfrozenxid = (ShortTransactionId)InvalidTransactionId;
/* insert into pg_partition */
-#ifndef ENABLE_MULTIPLE_NODES
- insertPartitionEntry(pg_partition_rel, partitionIndex, partitionIndex->pd_id, NULL, NULL, 0, 0, 0, indexRelOptions,
- PART_OBJ_TYPE_INDEX_PARTITION);
-#else
insertPartitionEntry(
pg_partition_rel, partitionIndex, partitionIndex->pd_id, NULL, NULL, 0, 0, 0, 0, PART_OBJ_TYPE_INDEX_PARTITION);
-#endif
+
/* Make the above change visible */
CommandCounterIncrement();
@@ -2739,8 +2733,7 @@ void index_build(Relation heapRelation, Partition heapPartition, Relation indexR
/* sub-partition */
indexInfo->ii_ParallelWorkers = 0;
} else if (!RELATION_OWN_BUCKET(heapRelation)) {
- /* plain table or part of table, no extra partition or bucket under it */
- indexInfo->ii_ParallelWorkers = plan_create_index_workers(RelationGetRelid(heapRelation));
+ indexInfo->ii_ParallelWorkers = parallel_workers;
}
/* disable parallel building index for system table */
@@ -2963,6 +2956,18 @@ static inline bool IsRedisExtraIndex(const IndexInfo* indexInfo, const TupleTabl
(indexInfo->ii_KeyAttrNumbers[0] == (slot->tts_tupleDescriptor->natts - 1)));
}
+static TransactionId GetCatalogOldestXmin(Relation heapRelation)
+{
+ TransactionId oldestXmin = GetOldestXmin(heapRelation);
+ if (IsCatalogRelation(heapRelation) || RelationIsAccessibleInLogicalDecoding(heapRelation)) {
+ TransactionId catalogXmin = GetReplicationSlotCatalogXmin();
+ if (TransactionIdIsNormal(catalogXmin) && TransactionIdPrecedes(catalogXmin, oldestXmin)) {
+ oldestXmin = catalogXmin;
+ }
+ }
+ return oldestXmin;
+}
+
/*
* IndexBuildHeapScan - scan the heap relation to find tuples to be indexed
*
@@ -3048,7 +3053,7 @@ double IndexBuildHeapScan(Relation heapRelation, Relation indexRelation, IndexIn
} else {
snapshot = SnapshotAny;
/* okay to ignore lazy VACUUMs here */
- OldestXmin = GetOldestXmin(heapRelation);
+ OldestXmin = GetCatalogOldestXmin(heapRelation);
}
scan = heap_beginscan_strat(heapRelation, /* relation */
@@ -3456,9 +3461,7 @@ double IndexBuildUHeapScan(Relation heapRelation, Relation indexRelation, IndexI
/*
* Scan all tuples in the base relation.
*/
- while ((UHeapGetNextSlotGuts(scan, ForwardScanDirection, slot)) != NULL) {
- bool tupleIsAlive = false;
- UHeapTuple targuheaptuple = NULL;
+ while ((UHeapIndexBuildGetNextTuple(sscan, slot)) != NULL) {
uheapTuple = ExecGetUHeapTupleFromSlot(slot);
CHECK_FOR_INTERRUPTS();
@@ -3467,10 +3470,6 @@ double IndexBuildUHeapScan(Relation heapRelation, Relation indexRelation, IndexI
if (ENABLE_WORKLOAD_CONTROL)
IOSchedulerAndUpdate(IO_TYPE_READ, 1, IO_TYPE_ROW);
- /* UHeapGetNextSlot did the time qual check */
- tupleIsAlive = true;
- targuheaptuple = uheapTuple;
-
reltuples += 1;
MemoryContextReset(econtext->ecxt_per_tuple_memory);
@@ -3507,7 +3506,7 @@ double IndexBuildUHeapScan(Relation heapRelation, Relation indexRelation, IndexI
heapTuple.t_self = uheapTuple->ctid;
/* Call the AM's callback routine to process the tuple */
- callback(indexRelation, &heapTuple, values, isnull, tupleIsAlive, callbackState);
+ callback(indexRelation, &heapTuple, values, isnull, true, callbackState);
}
UHeapEndScan(scan);
@@ -3968,6 +3967,7 @@ void validate_index(Oid heapId, Oid indexId, Snapshot snapshot)
ivinfo.message_level = DEBUG2;
ivinfo.num_heap_tuples = heapRelation->rd_rel->reltuples;
ivinfo.strategy = NULL;
+ ivinfo.invisibleParts = NULL;
state.tuplesort = tuplesort_begin_datum(
TIDOID, TIDLessOperator, InvalidOid, false, u_sess->attr.attr_memory.maintenance_work_mem, false);
@@ -4255,7 +4255,6 @@ void index_set_state_flags(Oid indexId, IndexStateFlagsAction action)
case INDEX_CREATE_SET_VALID:
/* Set indisvalid during a CREATE INDEX CONCURRENTLY sequence */
Assert(indexForm->indisready);
- Assert(!indexForm->indisvalid);
indexForm->indisvalid = true;
break;
case INDEX_DROP_CLEAR_VALID:
@@ -4329,7 +4328,8 @@ Oid IndexGetRelation(Oid indexId, bool missing_ok)
* Description :
* Notes :
*/
-void reindex_indexpart_internal(Relation heapRelation, Relation iRel, IndexInfo* indexInfo, Oid indexPartId)
+void reindex_indexpart_internal(Relation heapRelation, Relation iRel, IndexInfo* indexInfo, Oid indexPartId,
+ void* baseDesc)
{
Oid heapPartId = InvalidOid;
Partition heapPart = NULL;
@@ -4352,7 +4352,13 @@ void reindex_indexpart_internal(Relation heapRelation, Relation iRel, IndexInfo*
heapPart = partitionOpen(heapRelation, heapPartId, ShareLock);
indexpart = partitionOpen(iRel, indexPartId, AccessExclusiveLock);
- PartitionSetNewRelfilenode(iRel, indexpart, InvalidTransactionId, InvalidMultiXactId);
+ if (baseDesc) {
+ /* We'll put the old relfilenode to recycle bin. */
+ TrPartitionSetNewRelfilenode(iRel, indexpart, InvalidTransactionId, baseDesc);
+ } else {
+ /* We'll build a new physical relation for the index */
+ PartitionSetNewRelfilenode(iRel, indexpart, InvalidTransactionId, InvalidMultiXactId);
+ }
index_build(heapRelation, heapPart, iRel, indexpart, indexInfo, false, true, INDEX_CREATE_LOCAL_PARTITION, true);
@@ -4368,7 +4374,7 @@ void reindex_indexpart_internal(Relation heapRelation, Relation iRel, IndexInfo*
/*
* ReindexGlobalIndexInternal - This routine is used to recreate a single global index
*/
-void ReindexGlobalIndexInternal(Relation heapRelation, Relation iRel, IndexInfo* indexInfo)
+void ReindexGlobalIndexInternal(Relation heapRelation, Relation iRel, IndexInfo* indexInfo, void* baseDesc)
{
List* partitionList = NULL;
/* We'll open any partition of relation by partition OID and lock it */
@@ -4378,8 +4384,13 @@ void ReindexGlobalIndexInternal(Relation heapRelation, Relation iRel, IndexInfo*
partitionList = relationGetPartitionList(heapRelation, ShareLock);
}
- /* We'll build a new physical relation for the index */
- RelationSetNewRelfilenode(iRel, InvalidTransactionId, InvalidMultiXactId);
+ if (baseDesc) {
+ /* We'll put the old relfilenode to recycle bin. */
+ TrRelationSetNewRelfilenode(iRel, InvalidTransactionId, baseDesc);
+ } else {
+ /* We'll build a new physical relation for the index */
+ RelationSetNewRelfilenode(iRel, InvalidTransactionId, InvalidMultiXactId);
+ }
/* Initialize the index and rebuild */
/* Note: we do not need to re-establish pkey setting */
@@ -4552,9 +4563,9 @@ void reindex_index(Oid indexId, Oid indexPartId, bool skip_constraint_checks,
} else /* for partitioned table */
{
if (OidIsValid(indexPartId)) {
- reindex_indexpart_internal(heapRelation, iRel, indexInfo, indexPartId);
+ reindex_indexpart_internal(heapRelation, iRel, indexInfo, indexPartId, baseDesc);
} else if (RelationIsGlobalIndex(iRel)) {
- ReindexGlobalIndexInternal(heapRelation, iRel, indexInfo);
+ ReindexGlobalIndexInternal(heapRelation, iRel, indexInfo, baseDesc);
} else {
List* indexPartOidList = NULL;
ListCell* partCell = NULL;
@@ -4562,7 +4573,7 @@ void reindex_index(Oid indexId, Oid indexPartId, bool skip_constraint_checks,
indexPartOidList = indexGetPartitionOidList(iRel);
foreach (partCell, indexPartOidList) {
Oid indexPartOid = lfirst_oid(partCell);
- reindex_indexpart_internal(heapRelation, iRel, indexInfo, indexPartOid);
+ reindex_indexpart_internal(heapRelation, iRel, indexInfo, indexPartOid, baseDesc);
}
releasePartitionOidList(&indexPartOidList);
@@ -4830,16 +4841,12 @@ bool ReindexRelation(Oid relid, int flags, int reindexType, void *baseDesc, Adap
RelationSetIndexList(rel, indexIds, ClassOidIndexId);
}
- /*
- * Close rel, but continue to hold the lock.
- */
- heap_close(rel, NoLock);
-
// reset all local indexes on partition usable if needed
if (RELATION_IS_PARTITIONED(rel)) { /* for partitioned table */
Oid partOid;
ListCell* cell = NULL;
- List* partOidList = relationGetPartitionOidList(rel);
+ List *partOidList =
+ RelationIsSubPartitioned(rel) ? RelationGetSubPartitionOidList(rel) : relationGetPartitionOidList(rel);
foreach (cell, partOidList) {
partOid = lfirst_oid(cell);
@@ -4849,6 +4856,13 @@ bool ReindexRelation(Oid relid, int flags, int reindexType, void *baseDesc, Adap
result = (indexIds != NIL);
+ bool isRelSubPartitioned = RelationIsSubPartitioned(rel);
+
+ /*
+ * Close rel, but continue to hold the lock.
+ */
+ heap_close(rel, NoLock);
+
if (!isPartitioned) { /* for non partitioned table */
/*
* If the relation has a secondary toast rel, reindex that too while we
@@ -4862,15 +4876,30 @@ bool ReindexRelation(Oid relid, int flags, int reindexType, void *baseDesc, Adap
if (((uint32)flags) & REINDEX_REL_PROCESS_TOAST) {
partTupleList = searchPgPartitionByParentId(PART_OBJ_TYPE_TABLE_PARTITION, relid);
-
foreach (partCell, partTupleList) {
- Oid toastOid = ((Form_pg_partition)GETSTRUCT((HeapTuple)lfirst(partCell)))->reltoastrelid;
+ if (isRelSubPartitioned) {
+ /* for subpartitioned table, we reindex the toastoid of subpartition */
+ HeapTuple partTuple = (HeapTuple)lfirst(partCell);
+ List *subpartTupleList =
+ searchPgPartitionByParentId(PART_OBJ_TYPE_TABLE_SUB_PARTITION, HeapTupleGetOid(partTuple));
+ ListCell* subpartCell = NULL;
+ foreach (subpartCell, subpartTupleList) {
+ Oid toastOid = ((Form_pg_partition)GETSTRUCT((HeapTuple)lfirst(subpartCell)))->reltoastrelid;
- if (OidIsValid(toastOid)) {
- result = ReindexRelation(toastOid, flags, REINDEX_BTREE_INDEX, baseDesc) || result;
+ if (OidIsValid(toastOid)) {
+ result = ReindexRelation(toastOid, flags, REINDEX_BTREE_INDEX, baseDesc) || result;
+ }
+ }
+ freePartList(subpartTupleList);
+ } else {
+ /* for partitioned table, we reindex the toastoid of partition */
+ Oid toastOid = ((Form_pg_partition)GETSTRUCT((HeapTuple)lfirst(partCell)))->reltoastrelid;
+
+ if (OidIsValid(toastOid)) {
+ result = ReindexRelation(toastOid, flags, REINDEX_BTREE_INDEX, baseDesc) || result;
+ }
}
}
-
freePartList(partTupleList);
}
}
@@ -5827,7 +5856,7 @@ void AddGPIForSubPartition(Oid partTableOid, Oid partOid, Oid subPartOid)
/*
* @@GaussDB@@
- * Target : This routine is used to scan partition tuples and elete them from all global partition indexes.
+ * Target : This routine is used to scan partition tuples and delete them from all global partition indexes.
*/
void ScanPartitionDeleteGPITuples(Relation partTableRel, Relation partRel, const List* indexRelList,
const List* indexInfoList)
@@ -5898,7 +5927,7 @@ void ScanPartitionDeleteGPITuples(Relation partTableRel, Relation partRel, const
* @@GaussDB@@
* Target : This routine is used to delete the partition tuples from all global partition indexes.
*/
-void DeleteGPITuplesForPartition(Oid partTableOid, Oid partOid)
+bool DeleteGPITuplesForPartition(Oid partTableOid, Oid partOid)
{
Relation partTableRel = NULL;
Relation partRel = NULL;
@@ -5907,6 +5936,7 @@ void DeleteGPITuplesForPartition(Oid partTableOid, Oid partOid)
List* indexRelList = NIL;
List* indexInfoList = NIL;
ListCell* cell = NULL;
+ bool all_ubtree = true;
partTableRel = heap_open(partTableOid, AccessShareLock);
part = partitionOpen(partTableRel, partOid, AccessExclusiveLock);
@@ -5918,6 +5948,12 @@ void DeleteGPITuplesForPartition(Oid partTableOid, Oid partOid)
Relation indexRel = relation_open(indexOid, RowExclusiveLock);
IndexInfo* indexInfo = BuildIndexInfo(indexRel);
+ if (!RelationIsUstoreIndex(indexRel)) {
+ all_ubtree = false;
+ relation_close(indexRel, RowExclusiveLock);
+ continue;
+ }
+
indexRelList = lappend(indexRelList, indexRel);
indexInfoList = lappend(indexInfoList, indexInfo);
}
@@ -5937,6 +5973,8 @@ void DeleteGPITuplesForPartition(Oid partTableOid, Oid partOid)
releaseDummyRelation(&partRel);
partitionClose(partTableRel, part, NoLock);
heap_close(partTableRel, NoLock);
+
+ return all_ubtree;
}
/*
@@ -6091,10 +6129,7 @@ bool RecheckIndexTuple(const IndexScanDesc scan, TupleTableSlot *slot)
bool *isnull = (bool*)palloc(sizeof(bool) * nattrs);
/* form index datum with correct tuple descriptor */
- TupleDesc tmpDesc = slot->tts_tupleDescriptor;
- slot->tts_tupleDescriptor = RelationGetDescr(scan->heapRelation);
FormIndexDatum(so->indexInfo, slot, so->fakeEstate, values, isnull);
- slot->tts_tupleDescriptor = tmpDesc;
IndexTuple trueItup = index_form_tuple(RelationGetDescr(scan->indexRelation), values, isnull);
trueItup->t_tid = itup->t_tid;
diff --git a/src/common/backend/catalog/information_schema.sql b/src/common/backend/catalog/information_schema.sql
index 7d1a8373b..5e1b865c3 100644
--- a/src/common/backend/catalog/information_schema.sql
+++ b/src/common/backend/catalog/information_schema.sql
@@ -179,7 +179,7 @@ CREATE FUNCTION _pg_interval_type(typid oid, mod int4) RETURNS text
AS
$$SELECT
CASE WHEN $1 IN (1186) /* interval */
- THEN upper(substring(format_type($1, $2) from 'interval[()0-9]* #"%#"' for '#'))
+ THEN pg_catalog.upper(substring(pg_catalog.format_type($1, $2) from 'interval[()0-9]* #"%#"' for '#'))
ELSE null::text
END$$;
@@ -218,7 +218,7 @@ CREATE DOMAIN sql_identifier AS character varying;
*/
CREATE VIEW information_schema_catalog_name AS
- SELECT CAST(current_database() AS sql_identifier) AS catalog_name;
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS catalog_name;
GRANT SELECT ON information_schema_catalog_name TO PUBLIC;
@@ -255,7 +255,7 @@ CREATE VIEW applicable_roles AS
FROM pg_auth_members m
JOIN pg_authid a ON (m.member = a.oid)
JOIN pg_authid b ON (m.roleid = b.oid)
- WHERE pg_has_role(a.oid, 'USAGE');
+ WHERE pg_catalog.pg_has_role(a.oid, 'USAGE');
GRANT SELECT ON applicable_roles TO PUBLIC;
@@ -287,19 +287,19 @@ GRANT SELECT ON administrable_role_authorizations TO PUBLIC;
*/
CREATE VIEW attributes AS
- SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS udt_catalog,
CAST(nc.nspname AS sql_identifier) AS udt_schema,
CAST(c.relname AS sql_identifier) AS udt_name,
CAST(a.attname AS sql_identifier) AS attribute_name,
CAST(a.attnum AS cardinal_number) AS ordinal_position,
- CAST(pg_get_expr(ad.adbin, ad.adrelid) AS character_data) AS attribute_default,
+ CAST(pg_catalog.pg_get_expr(ad.adbin, ad.adrelid) AS character_data) AS attribute_default,
CAST(CASE WHEN a.attnotnull OR (t.typtype = 'd' AND t.typnotnull) THEN 'NO' ELSE 'YES' END
AS yes_or_no)
AS is_nullable, -- This column was apparently removed between SQL:2003 and SQL:2008.
CAST(
CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
- WHEN nt.nspname = 'pg_catalog' THEN format_type(a.atttypid, null)
+ WHEN nt.nspname = 'pg_catalog' THEN pg_catalog.format_type(a.atttypid, null)
ELSE 'USER-DEFINED' END
AS character_data)
AS data_type,
@@ -318,7 +318,7 @@ CREATE VIEW attributes AS
CAST(null AS sql_identifier) AS character_set_schema,
CAST(null AS sql_identifier) AS character_set_name,
- CAST(CASE WHEN nco.nspname IS NOT NULL THEN current_database() END AS sql_identifier) AS collation_catalog,
+ CAST(CASE WHEN nco.nspname IS NOT NULL THEN pg_catalog.current_database() END AS sql_identifier) AS collation_catalog,
CAST(nco.nspname AS sql_identifier) AS collation_schema,
CAST(co.collname AS sql_identifier) AS collation_name,
@@ -348,7 +348,7 @@ CREATE VIEW attributes AS
AS interval_type,
CAST(null AS cardinal_number) AS interval_precision,
- CAST(current_database() AS sql_identifier) AS attribute_udt_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS attribute_udt_catalog,
CAST(nt.nspname AS sql_identifier) AS attribute_udt_schema,
CAST(t.typname AS sql_identifier) AS attribute_udt_name,
@@ -368,8 +368,8 @@ CREATE VIEW attributes AS
WHERE a.attnum > 0 AND NOT a.attisdropped
AND c.relkind in ('c')
- AND (pg_has_role(c.relowner, 'USAGE')
- OR has_type_privilege(c.reltype, 'USAGE'));
+ AND (pg_catalog.pg_has_role(c.relowner, 'USAGE')
+ OR pg_catalog.has_type_privilege(c.reltype, 'USAGE'));
GRANT SELECT ON attributes TO PUBLIC;
@@ -382,17 +382,17 @@ GRANT SELECT ON attributes TO PUBLIC;
CREATE VIEW character_sets AS
SELECT CAST(null AS sql_identifier) AS character_set_catalog,
CAST(null AS sql_identifier) AS character_set_schema,
- CAST(getdatabaseencoding() AS sql_identifier) AS character_set_name,
- CAST(CASE WHEN getdatabaseencoding() = 'UTF8' THEN 'UCS' ELSE getdatabaseencoding() END AS sql_identifier) AS character_repertoire,
- CAST(getdatabaseencoding() AS sql_identifier) AS form_of_use,
- CAST(current_database() AS sql_identifier) AS default_collate_catalog,
+ CAST(pg_catalog.getdatabaseencoding() AS sql_identifier) AS character_set_name,
+ CAST(CASE WHEN pg_catalog.getdatabaseencoding() = 'UTF8' THEN 'UCS' ELSE pg_catalog.getdatabaseencoding() END AS sql_identifier) AS character_repertoire,
+ CAST(pg_catalog.getdatabaseencoding() AS sql_identifier) AS form_of_use,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS default_collate_catalog,
CAST(nc.nspname AS sql_identifier) AS default_collate_schema,
CAST(c.collname AS sql_identifier) AS default_collate_name
FROM pg_database d
LEFT JOIN (pg_collation c JOIN pg_namespace nc ON (c.collnamespace = nc.oid))
ON (datcollate = collcollate AND datctype = collctype)
- WHERE d.datname = current_database()
- ORDER BY char_length(c.collname) DESC, c.collname ASC -- prefer full/canonical name
+ WHERE d.datname = pg_catalog.current_database()
+ ORDER BY pg_catalog.char_length(c.collname) DESC, c.collname ASC -- prefer full/canonical name
LIMIT 1;
GRANT SELECT ON character_sets TO PUBLIC;
@@ -404,10 +404,10 @@ GRANT SELECT ON character_sets TO PUBLIC;
*/
CREATE VIEW check_constraint_routine_usage AS
- SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS constraint_catalog,
CAST(nc.nspname AS sql_identifier) AS constraint_schema,
CAST(c.conname AS sql_identifier) AS constraint_name,
- CAST(current_database() AS sql_identifier) AS specific_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS specific_catalog,
CAST(np.nspname AS sql_identifier) AS specific_schema,
CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name
FROM pg_namespace nc, pg_constraint c, pg_depend d, pg_proc p, pg_namespace np
@@ -418,7 +418,7 @@ CREATE VIEW check_constraint_routine_usage AS
AND d.refobjid = p.oid
AND d.refclassid = 'pg_catalog.pg_proc'::regclass
AND p.pronamespace = np.oid
- AND pg_has_role(p.proowner, 'USAGE');
+ AND pg_catalog.pg_has_role(p.proowner, 'USAGE');
GRANT SELECT ON check_constraint_routine_usage TO PUBLIC;
@@ -429,22 +429,22 @@ GRANT SELECT ON check_constraint_routine_usage TO PUBLIC;
*/
CREATE VIEW check_constraints AS
- SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS constraint_catalog,
CAST(rs.nspname AS sql_identifier) AS constraint_schema,
CAST(con.conname AS sql_identifier) AS constraint_name,
- CAST(substring(pg_get_constraintdef(con.oid) from 7) AS character_data)
+ CAST(substring(pg_catalog.pg_get_constraintdef(con.oid) from 7) AS character_data)
AS check_clause
FROM pg_constraint con
LEFT OUTER JOIN pg_namespace rs ON (rs.oid = con.connamespace)
LEFT OUTER JOIN pg_class c ON (c.oid = con.conrelid)
LEFT OUTER JOIN pg_type t ON (t.oid = con.contypid)
- WHERE pg_has_role(coalesce(c.relowner, t.typowner), 'USAGE')
+ WHERE pg_catalog.pg_has_role(coalesce(c.relowner, t.typowner), 'USAGE')
AND con.contype = 'c'
UNION
-- not-null constraints
- SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS constraint_catalog,
CAST(n.nspname AS sql_identifier) AS constraint_schema,
CAST(CAST(n.oid AS text) || '_' || CAST(r.oid AS text) || '_' || CAST(a.attnum AS text) || '_not_null' AS sql_identifier) AS constraint_name, -- XXX
CAST(a.attname || ' IS NOT NULL' AS character_data)
@@ -456,7 +456,7 @@ CREATE VIEW check_constraints AS
AND NOT a.attisdropped
AND a.attnotnull
AND r.relkind = 'r'
- AND pg_has_role(r.relowner, 'USAGE');
+ AND pg_catalog.pg_has_role(r.relowner, 'USAGE');
GRANT SELECT ON check_constraints TO PUBLIC;
@@ -467,13 +467,13 @@ GRANT SELECT ON check_constraints TO PUBLIC;
*/
CREATE VIEW collations AS
- SELECT CAST(current_database() AS sql_identifier) AS collation_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS collation_catalog,
CAST(nc.nspname AS sql_identifier) AS collation_schema,
CAST(c.collname AS sql_identifier) AS collation_name,
CAST('NO PAD' AS character_data) AS pad_attribute
FROM pg_collation c, pg_namespace nc
WHERE c.collnamespace = nc.oid
- AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = current_database()));
+ AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = pg_catalog.current_database()));
GRANT SELECT ON collations TO PUBLIC;
@@ -484,15 +484,15 @@ GRANT SELECT ON collations TO PUBLIC;
*/
CREATE VIEW collation_character_set_applicability AS
- SELECT CAST(current_database() AS sql_identifier) AS collation_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS collation_catalog,
CAST(nc.nspname AS sql_identifier) AS collation_schema,
CAST(c.collname AS sql_identifier) AS collation_name,
CAST(null AS sql_identifier) AS character_set_catalog,
CAST(null AS sql_identifier) AS character_set_schema,
- CAST(getdatabaseencoding() AS sql_identifier) AS character_set_name
+ CAST(pg_catalog.getdatabaseencoding() AS sql_identifier) AS character_set_name
FROM pg_collation c, pg_namespace nc
WHERE c.collnamespace = nc.oid
- AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = current_database()));
+ AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = pg_catalog.current_database()));
GRANT SELECT ON collation_character_set_applicability TO PUBLIC;
@@ -511,10 +511,10 @@ GRANT SELECT ON collation_character_set_applicability TO PUBLIC;
*/
CREATE VIEW column_domain_usage AS
- SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS domain_catalog,
CAST(nt.nspname AS sql_identifier) AS domain_schema,
CAST(t.typname AS sql_identifier) AS domain_name,
- CAST(current_database() AS sql_identifier) AS table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name
@@ -528,10 +528,10 @@ CREATE VIEW column_domain_usage AS
AND a.atttypid = t.oid
AND t.typtype = 'd'
AND c.relkind IN ('r', 'm', 'v', 'f')
- AND (c.relname not like 'mlog_%' AND c.relname not like 'matviewmap_%')
+ AND (c.relname not like 'mlog\_%' AND c.relname not like 'matviewmap\_%')
AND a.attnum > 0
AND NOT a.attisdropped
- AND pg_has_role(t.typowner, 'USAGE');
+ AND pg_catalog.pg_has_role(t.typowner, 'USAGE');
GRANT SELECT ON column_domain_usage TO PUBLIC;
@@ -544,7 +544,7 @@ GRANT SELECT ON column_domain_usage TO PUBLIC;
CREATE VIEW column_privileges AS
SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
- CAST(current_database() AS sql_identifier) AS table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(x.relname AS sql_identifier) AS table_name,
CAST(x.attname AS sql_identifier) AS column_name,
@@ -552,7 +552,7 @@ CREATE VIEW column_privileges AS
CAST(
CASE WHEN
-- object owner always has grant options
- pg_has_role(x.grantee, x.relowner, 'USAGE')
+ pg_catalog.pg_has_role(x.grantee, x.relowner, 'USAGE')
OR x.grantable
THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
@@ -565,7 +565,7 @@ CREATE VIEW column_privileges AS
pr_c.prtype,
pr_c.grantable,
pr_c.relowner
- FROM (SELECT oid, relname, relnamespace, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).*
+ FROM (SELECT oid, relname, relnamespace, relowner, (pg_catalog.aclexplode(coalesce(relacl, pg_catalog.acldefault('r', relowner)))).*
FROM pg_class
WHERE relkind IN ('r', 'm', 'v', 'f')
) pr_c (oid, relname, relnamespace, relowner, grantor, grantee, prtype, grantable),
@@ -582,7 +582,7 @@ CREATE VIEW column_privileges AS
pr_a.prtype,
pr_a.grantable,
c.relowner
- FROM (SELECT attrelid, attname, (aclexplode(coalesce(attacl, acldefault('c', relowner)))).*
+ FROM (SELECT attrelid, attname, (pg_catalog.aclexplode(coalesce(attacl, pg_catalog.acldefault('c', relowner)))).*
FROM pg_attribute a JOIN pg_class cc ON (a.attrelid = cc.oid)
WHERE attnum > 0
AND NOT attisdropped
@@ -603,9 +603,9 @@ CREATE VIEW column_privileges AS
AND x.grantee = grantee.oid
AND x.grantor = u_grantor.oid
AND x.prtype IN ('INSERT', 'SELECT', 'UPDATE', 'REFERENCES', 'COMMENT')
- AND (x.relname not like 'mlog_%' AND x.relname not like 'matviewmap_%')
- AND (pg_has_role(u_grantor.oid, 'USAGE')
- OR pg_has_role(grantee.oid, 'USAGE')
+ AND (x.relname not like 'mlog\_%' AND x.relname not like 'matviewmap\_%')
+ AND (pg_catalog.pg_has_role(u_grantor.oid, 'USAGE')
+ OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
OR grantee.rolname = 'PUBLIC');
GRANT SELECT ON column_privileges TO PUBLIC;
@@ -617,10 +617,10 @@ GRANT SELECT ON column_privileges TO PUBLIC;
*/
CREATE VIEW column_udt_usage AS
- SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS udt_catalog,
CAST(coalesce(nbt.nspname, nt.nspname) AS sql_identifier) AS udt_schema,
CAST(coalesce(bt.typname, t.typname) AS sql_identifier) AS udt_name,
- CAST(current_database() AS sql_identifier) AS table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name
@@ -634,8 +634,8 @@ CREATE VIEW column_udt_usage AS
AND a.atttypid = t.oid
AND nc.oid = c.relnamespace
AND a.attnum > 0 AND NOT a.attisdropped AND c.relkind in ('r', 'm', 'v', 'f')
- AND (c.relname not like 'mlog_%' AND c.relname not like 'matviewmap_%')
- AND pg_has_role(coalesce(bt.typowner, t.typowner), 'USAGE');
+ AND (c.relname not like 'mlog\_%' AND c.relname not like 'matviewmap\_%')
+ AND pg_catalog.pg_has_role(coalesce(bt.typowner, t.typowner), 'USAGE');
GRANT SELECT ON column_udt_usage TO PUBLIC;
@@ -646,12 +646,12 @@ GRANT SELECT ON column_udt_usage TO PUBLIC;
*/
CREATE VIEW columns AS
- SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name,
CAST(a.attnum AS cardinal_number) AS ordinal_position,
- CAST(CASE WHEN ad.adgencol <> 's' THEN pg_get_expr(ad.adbin, ad.adrelid) END AS character_data) AS column_default,
+ CAST(CASE WHEN ad.adgencol <> 's' THEN pg_catalog.pg_get_expr(ad.adbin, ad.adrelid) END AS character_data) AS column_default,
CAST(CASE WHEN a.attnotnull OR (t.typtype = 'd' AND t.typnotnull) THEN 'NO' ELSE 'YES' END
AS yes_or_no)
AS is_nullable,
@@ -659,11 +659,11 @@ CREATE VIEW columns AS
CAST(
CASE WHEN t.typtype = 'd' THEN
CASE WHEN bt.typelem <> 0 AND bt.typlen = -1 THEN 'ARRAY'
- WHEN nbt.nspname = 'pg_catalog' THEN format_type(t.typbasetype, null)
+ WHEN nbt.nspname = 'pg_catalog' THEN pg_catalog.format_type(t.typbasetype, null)
ELSE 'USER-DEFINED' END
ELSE
CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
- WHEN nt.nspname = 'pg_catalog' THEN format_type(a.atttypid, null)
+ WHEN nt.nspname = 'pg_catalog' THEN pg_catalog.format_type(a.atttypid, null)
ELSE 'USER-DEFINED' END
END
AS character_data)
@@ -709,18 +709,18 @@ CREATE VIEW columns AS
CAST(null AS sql_identifier) AS character_set_schema,
CAST(null AS sql_identifier) AS character_set_name,
- CAST(CASE WHEN nco.nspname IS NOT NULL THEN current_database() END AS sql_identifier) AS collation_catalog,
+ CAST(CASE WHEN nco.nspname IS NOT NULL THEN pg_catalog.current_database() END AS sql_identifier) AS collation_catalog,
CAST(nco.nspname AS sql_identifier) AS collation_schema,
CAST(co.collname AS sql_identifier) AS collation_name,
- CAST(CASE WHEN t.typtype = 'd' THEN current_database() ELSE null END
+ CAST(CASE WHEN t.typtype = 'd' THEN pg_catalog.current_database() ELSE null END
AS sql_identifier) AS domain_catalog,
CAST(CASE WHEN t.typtype = 'd' THEN nt.nspname ELSE null END
AS sql_identifier) AS domain_schema,
CAST(CASE WHEN t.typtype = 'd' THEN t.typname ELSE null END
AS sql_identifier) AS domain_name,
- CAST(current_database() AS sql_identifier) AS udt_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS udt_catalog,
CAST(coalesce(nbt.nspname, nt.nspname) AS sql_identifier) AS udt_schema,
CAST(coalesce(bt.typname, t.typname) AS sql_identifier) AS udt_name,
@@ -741,7 +741,7 @@ CREATE VIEW columns AS
CAST(null AS yes_or_no) AS identity_cycle,
CAST(CASE WHEN ad.adgencol = 's' THEN 'ALWAYS' ELSE 'NEVER' END AS character_data) AS is_generated,
- CAST(CASE WHEN ad.adgencol = 's' THEN pg_get_expr(ad.adbin, ad.adrelid) END AS character_data) AS generation_expression,
+ CAST(CASE WHEN ad.adgencol = 's' THEN pg_catalog.pg_get_expr(ad.adbin, ad.adrelid) END AS character_data) AS generation_expression,
CAST(CASE WHEN c.relkind = 'r'
OR (c.relkind = 'v'
@@ -757,14 +757,14 @@ CREATE VIEW columns AS
LEFT JOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid))
ON a.attcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')
- WHERE (NOT pg_is_other_temp_schema(nc.oid))
+ WHERE (NOT pg_catalog.pg_is_other_temp_schema(nc.oid))
AND a.attnum > 0 AND NOT a.attisdropped AND c.relkind in ('r', 'm', 'v', 'f')
- AND (c.relname not like 'mlog_%' AND c.relname not like 'matviewmap_%')
+ AND (c.relname not like 'mlog\_%' AND c.relname not like 'matviewmap\_%')
- AND (pg_has_role(c.relowner, 'USAGE')
- OR has_column_privilege(c.oid, a.attnum,
+ AND (pg_catalog.pg_has_role(c.relowner, 'USAGE')
+ OR pg_catalog.has_column_privilege(c.oid, a.attnum,
'SELECT, INSERT, UPDATE, REFERENCES'));
GRANT SELECT ON columns TO PUBLIC;
@@ -776,11 +776,11 @@ GRANT SELECT ON columns TO PUBLIC;
*/
CREATE VIEW constraint_column_usage AS
- SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(tblschema AS sql_identifier) AS table_schema,
CAST(tblname AS sql_identifier) AS table_name,
CAST(colname AS sql_identifier) AS column_name,
- CAST(current_database() AS sql_identifier) AS constraint_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS constraint_catalog,
CAST(cstrschema AS sql_identifier) AS constraint_schema,
CAST(cstrname AS sql_identifier) AS constraint_name
@@ -817,7 +817,7 @@ CREATE VIEW constraint_column_usage AS
) AS x (tblschema, tblname, tblowner, colname, cstrschema, cstrname)
- WHERE pg_has_role(x.tblowner, 'USAGE');
+ WHERE pg_catalog.pg_has_role(x.tblowner, 'USAGE');
GRANT SELECT ON constraint_column_usage TO PUBLIC;
@@ -828,10 +828,10 @@ GRANT SELECT ON constraint_column_usage TO PUBLIC;
*/
CREATE VIEW constraint_table_usage AS
- SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nr.nspname AS sql_identifier) AS table_schema,
CAST(r.relname AS sql_identifier) AS table_name,
- CAST(current_database() AS sql_identifier) AS constraint_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS constraint_catalog,
CAST(nc.nspname AS sql_identifier) AS constraint_schema,
CAST(c.conname AS sql_identifier) AS constraint_name
@@ -842,7 +842,7 @@ CREATE VIEW constraint_table_usage AS
AND ( (c.contype = 'f' AND c.confrelid = r.oid)
OR (c.contype IN ('p', 'u') AND c.conrelid = r.oid) )
AND r.relkind = 'r'
- AND pg_has_role(r.relowner, 'USAGE');
+ AND pg_catalog.pg_has_role(r.relowner, 'USAGE');
GRANT SELECT ON constraint_table_usage TO PUBLIC;
@@ -872,10 +872,10 @@ GRANT SELECT ON constraint_table_usage TO PUBLIC;
*/
CREATE VIEW domain_constraints AS
- SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS constraint_catalog,
CAST(rs.nspname AS sql_identifier) AS constraint_schema,
CAST(con.conname AS sql_identifier) AS constraint_name,
- CAST(current_database() AS sql_identifier) AS domain_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS domain_catalog,
CAST(n.nspname AS sql_identifier) AS domain_schema,
CAST(t.typname AS sql_identifier) AS domain_name,
CAST(CASE WHEN condeferrable THEN 'YES' ELSE 'NO' END
@@ -886,8 +886,8 @@ CREATE VIEW domain_constraints AS
WHERE rs.oid = con.connamespace
AND n.oid = t.typnamespace
AND t.oid = con.contypid
- AND (pg_has_role(t.typowner, 'USAGE')
- OR has_type_privilege(t.oid, 'USAGE'));
+ AND (pg_catalog.pg_has_role(t.typowner, 'USAGE')
+ OR pg_catalog.has_type_privilege(t.oid, 'USAGE'));
GRANT SELECT ON domain_constraints TO PUBLIC;
@@ -898,10 +898,10 @@ GRANT SELECT ON domain_constraints TO PUBLIC;
*/
CREATE VIEW domain_udt_usage AS
- SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS udt_catalog,
CAST(nbt.nspname AS sql_identifier) AS udt_schema,
CAST(bt.typname AS sql_identifier) AS udt_name,
- CAST(current_database() AS sql_identifier) AS domain_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS domain_catalog,
CAST(nt.nspname AS sql_identifier) AS domain_schema,
CAST(t.typname AS sql_identifier) AS domain_name
@@ -912,7 +912,7 @@ CREATE VIEW domain_udt_usage AS
AND t.typbasetype = bt.oid
AND bt.typnamespace = nbt.oid
AND t.typtype = 'd'
- AND pg_has_role(bt.typowner, 'USAGE');
+ AND pg_catalog.pg_has_role(bt.typowner, 'USAGE');
GRANT SELECT ON domain_udt_usage TO PUBLIC;
@@ -923,13 +923,13 @@ GRANT SELECT ON domain_udt_usage TO PUBLIC;
*/
CREATE VIEW domains AS
- SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS domain_catalog,
CAST(nt.nspname AS sql_identifier) AS domain_schema,
CAST(t.typname AS sql_identifier) AS domain_name,
CAST(
CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
- WHEN nbt.nspname = 'pg_catalog' THEN format_type(t.typbasetype, null)
+ WHEN nbt.nspname = 'pg_catalog' THEN pg_catalog.format_type(t.typbasetype, null)
ELSE 'USER-DEFINED' END
AS character_data)
AS data_type,
@@ -948,7 +948,7 @@ CREATE VIEW domains AS
CAST(null AS sql_identifier) AS character_set_schema,
CAST(null AS sql_identifier) AS character_set_name,
- CAST(CASE WHEN nco.nspname IS NOT NULL THEN current_database() END AS sql_identifier) AS collation_catalog,
+ CAST(CASE WHEN nco.nspname IS NOT NULL THEN pg_catalog.current_database() END AS sql_identifier) AS collation_catalog,
CAST(nco.nspname AS sql_identifier) AS collation_schema,
CAST(co.collname AS sql_identifier) AS collation_name,
@@ -980,7 +980,7 @@ CREATE VIEW domains AS
CAST(t.typdefault AS character_data) AS domain_default,
- CAST(current_database() AS sql_identifier) AS udt_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS udt_catalog,
CAST(nbt.nspname AS sql_identifier) AS udt_schema,
CAST(bt.typname AS sql_identifier) AS udt_name,
@@ -997,8 +997,8 @@ CREATE VIEW domains AS
LEFT JOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid))
ON t.typcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')
- WHERE (pg_has_role(t.typowner, 'USAGE')
- OR has_type_privilege(t.oid, 'USAGE'));
+ WHERE (pg_catalog.pg_has_role(t.typowner, 'USAGE')
+ OR pg_catalog.has_type_privilege(t.oid, 'USAGE'));
GRANT SELECT ON domains TO PUBLIC;
@@ -1014,7 +1014,7 @@ GRANT SELECT ON domains TO PUBLIC;
CREATE VIEW enabled_roles AS
SELECT CAST(a.rolname AS sql_identifier) AS role_name
FROM pg_authid a
- WHERE pg_has_role(a.oid, 'USAGE');
+ WHERE pg_catalog.pg_has_role(a.oid, 'USAGE');
GRANT SELECT ON enabled_roles TO PUBLIC;
@@ -1033,10 +1033,10 @@ GRANT SELECT ON enabled_roles TO PUBLIC;
*/
CREATE VIEW key_column_usage AS
- SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS constraint_catalog,
CAST(nc_nspname AS sql_identifier) AS constraint_schema,
CAST(conname AS sql_identifier) AS constraint_name,
- CAST(current_database() AS sql_identifier) AS table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nr_nspname AS sql_identifier) AS table_schema,
CAST(relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name,
@@ -1059,12 +1059,12 @@ CREATE VIEW key_column_usage AS
AND nc.oid = c.connamespace
AND c.contype IN ('p', 'u', 'f')
AND r.relkind = 'r'
- AND (NOT pg_is_other_temp_schema(nr.oid)) ) AS ss
+ AND (NOT pg_catalog.pg_is_other_temp_schema(nr.oid)) ) AS ss
WHERE ss.roid = a.attrelid
AND a.attnum = (ss.x).x
AND NOT a.attisdropped
- AND (pg_has_role(relowner, 'USAGE')
- OR has_column_privilege(roid, a.attnum,
+ AND (pg_catalog.pg_has_role(relowner, 'USAGE')
+ OR pg_catalog.has_column_privilege(roid, a.attnum,
'SELECT, INSERT, UPDATE, REFERENCES'));
GRANT SELECT ON key_column_usage TO PUBLIC;
@@ -1092,7 +1092,7 @@ GRANT SELECT ON key_column_usage TO PUBLIC;
*/
CREATE VIEW parameters AS
- SELECT CAST(current_database() AS sql_identifier) AS specific_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS specific_catalog,
CAST(n_nspname AS sql_identifier) AS specific_schema,
CAST(proname || '_' || CAST(p_oid AS text) AS sql_identifier) AS specific_name,
CAST((ss.x).n AS cardinal_number) AS ordinal_position,
@@ -1109,7 +1109,7 @@ CREATE VIEW parameters AS
CAST(NULLIF(proargnames[(ss.x).n], '') AS sql_identifier) AS parameter_name,
CAST(
CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
- WHEN nt.nspname = 'pg_catalog' THEN format_type(t.oid, null)
+ WHEN nt.nspname = 'pg_catalog' THEN pg_catalog.format_type(t.oid, null)
ELSE 'USER-DEFINED' END AS character_data)
AS data_type,
CAST(null AS cardinal_number) AS character_maximum_length,
@@ -1126,7 +1126,7 @@ CREATE VIEW parameters AS
CAST(null AS cardinal_number) AS datetime_precision,
CAST(null AS character_data) AS interval_type,
CAST(null AS cardinal_number) AS interval_precision,
- CAST(current_database() AS sql_identifier) AS udt_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS udt_catalog,
CAST(nt.nspname AS sql_identifier) AS udt_schema,
CAST(t.typname AS sql_identifier) AS udt_name,
CAST(null AS sql_identifier) AS scope_catalog,
@@ -1141,8 +1141,8 @@ CREATE VIEW parameters AS
_pg_expandarray(coalesce(p.proallargtypes, p.proargtypes::oid[])) AS x
FROM pg_namespace n, pg_proc p
WHERE n.oid = p.pronamespace
- AND (pg_has_role(p.proowner, 'USAGE') OR
- has_function_privilege(p.oid, 'EXECUTE'))) AS ss
+ AND (pg_catalog.pg_has_role(p.proowner, 'USAGE') OR
+ pg_catalog.has_function_privilege(p.oid, 'EXECUTE'))) AS ss
WHERE t.oid = (ss.x).x AND t.typnamespace = nt.oid;
GRANT SELECT ON parameters TO PUBLIC;
@@ -1162,12 +1162,12 @@ GRANT SELECT ON parameters TO PUBLIC;
*/
CREATE VIEW referential_constraints AS
- SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS constraint_catalog,
CAST(ncon.nspname AS sql_identifier) AS constraint_schema,
CAST(con.conname AS sql_identifier) AS constraint_name,
CAST(
CASE WHEN npkc.nspname IS NULL THEN NULL
- ELSE current_database() END
+ ELSE pg_catalog.current_database() END
AS sql_identifier) AS unique_constraint_catalog,
CAST(npkc.nspname AS sql_identifier) AS unique_constraint_schema,
CAST(pkc.conname AS sql_identifier) AS unique_constraint_name,
@@ -1210,10 +1210,10 @@ CREATE VIEW referential_constraints AS
AND pkc.conrelid = con.confrelid
LEFT JOIN pg_namespace npkc ON pkc.connamespace = npkc.oid
- WHERE pg_has_role(c.relowner, 'USAGE')
+ WHERE pg_catalog.pg_has_role(c.relowner, 'USAGE')
-- SELECT privilege omitted, per SQL standard
- OR has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
- OR has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES') ;
+ OR pg_catalog.has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
+ OR pg_catalog.has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES') ;
GRANT SELECT ON referential_constraints TO PUBLIC;
@@ -1276,22 +1276,22 @@ GRANT SELECT ON role_column_grants TO PUBLIC;
CREATE VIEW routine_privileges AS
SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
- CAST(current_database() AS sql_identifier) AS specific_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS specific_catalog,
CAST(n.nspname AS sql_identifier) AS specific_schema,
CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name,
- CAST(current_database() AS sql_identifier) AS routine_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS routine_catalog,
CAST(n.nspname AS sql_identifier) AS routine_schema,
CAST(p.proname AS sql_identifier) AS routine_name,
CAST(p.prtype AS character_data) AS privilege_type,
CAST(
CASE WHEN
-- object owner always has grant options
- pg_has_role(grantee.oid, p.proowner, 'USAGE')
+ pg_catalog.pg_has_role(grantee.oid, p.proowner, 'USAGE')
OR p.grantable
THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
FROM (
- SELECT oid, proname, proowner, pronamespace, (aclexplode(coalesce(proacl, acldefault('f', proowner)))).* FROM pg_proc
+ SELECT oid, proname, proowner, pronamespace, (pg_catalog.aclexplode(coalesce(proacl, pg_catalog.acldefault('f', proowner)))).* FROM pg_proc
) p (oid, proname, proowner, pronamespace, grantor, grantee, prtype, grantable),
pg_namespace n,
pg_authid u_grantor,
@@ -1305,8 +1305,8 @@ CREATE VIEW routine_privileges AS
AND grantee.oid = p.grantee
AND u_grantor.oid = p.grantor
AND p.prtype IN ('EXECUTE', 'ALTER', 'DROP', 'COMMENT')
- AND (pg_has_role(u_grantor.oid, 'USAGE')
- OR pg_has_role(grantee.oid, 'USAGE')
+ AND (pg_catalog.pg_has_role(u_grantor.oid, 'USAGE')
+ OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
OR grantee.rolname = 'PUBLIC');
GRANT SELECT ON routine_privileges TO PUBLIC;
@@ -1365,10 +1365,10 @@ GRANT SELECT ON role_routine_grants TO PUBLIC;
*/
CREATE VIEW routines AS
- SELECT CAST(current_database() AS sql_identifier) AS specific_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS specific_catalog,
CAST(n.nspname AS sql_identifier) AS specific_schema,
CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name,
- CAST(current_database() AS sql_identifier) AS routine_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS routine_catalog,
CAST(n.nspname AS sql_identifier) AS routine_schema,
CAST(p.proname AS sql_identifier) AS routine_name,
CAST('FUNCTION' AS character_data) AS routine_type,
@@ -1381,7 +1381,7 @@ CREATE VIEW routines AS
CAST(
CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
- WHEN nt.nspname = 'pg_catalog' THEN format_type(t.oid, null)
+ WHEN nt.nspname = 'pg_catalog' THEN pg_catalog.format_type(t.oid, null)
ELSE 'USER-DEFINED' END AS character_data)
AS data_type,
CAST(null AS cardinal_number) AS character_maximum_length,
@@ -1398,7 +1398,7 @@ CREATE VIEW routines AS
CAST(null AS cardinal_number) AS datetime_precision,
CAST(null AS character_data) AS interval_type,
CAST(null AS cardinal_number) AS interval_precision,
- CAST(current_database() AS sql_identifier) AS type_udt_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS type_udt_catalog,
CAST(nt.nspname AS sql_identifier) AS type_udt_schema,
CAST(t.typname AS sql_identifier) AS type_udt_name,
CAST(null AS sql_identifier) AS scope_catalog,
@@ -1410,12 +1410,12 @@ CREATE VIEW routines AS
CAST(CASE WHEN l.lanname = 'sql' THEN 'SQL' ELSE 'EXTERNAL' END AS character_data)
AS routine_body,
CAST(
- CASE WHEN pg_has_role(p.proowner, 'USAGE') THEN p.prosrc ELSE null END
+ CASE WHEN pg_catalog.pg_has_role(p.proowner, 'USAGE') THEN p.prosrc ELSE null END
AS character_data) AS routine_definition,
CAST(
CASE WHEN l.lanname = 'c' THEN p.prosrc ELSE null END
AS character_data) AS external_name,
- CAST(upper(l.lanname) AS character_data) AS external_language,
+ CAST(pg_catalog.upper(l.lanname) AS character_data) AS external_language,
CAST('GENERAL' AS character_data) AS parameter_style,
CAST(CASE WHEN p.provolatile = 'i' THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_deterministic,
@@ -1466,8 +1466,8 @@ CREATE VIEW routines AS
WHERE n.oid = p.pronamespace AND p.prolang = l.oid
AND p.prorettype = t.oid AND t.typnamespace = nt.oid
- AND (pg_has_role(p.proowner, 'USAGE')
- OR has_function_privilege(p.oid, 'EXECUTE'));
+ AND (pg_catalog.pg_has_role(p.proowner, 'USAGE')
+ OR pg_catalog.has_function_privilege(p.oid, 'EXECUTE'));
GRANT SELECT ON routines TO PUBLIC;
@@ -1478,7 +1478,7 @@ GRANT SELECT ON routines TO PUBLIC;
*/
CREATE VIEW schemata AS
- SELECT CAST(current_database() AS sql_identifier) AS catalog_name,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS catalog_name,
CAST(n.nspname AS sql_identifier) AS schema_name,
CAST(u.rolname AS sql_identifier) AS schema_owner,
CAST(null AS sql_identifier) AS default_character_set_catalog,
@@ -1486,7 +1486,7 @@ CREATE VIEW schemata AS
CAST(null AS sql_identifier) AS default_character_set_name,
CAST(null AS character_data) AS sql_path
FROM pg_namespace n, pg_authid u
- WHERE n.nspowner = u.oid AND pg_has_role(n.nspowner, 'USAGE');
+ WHERE n.nspowner = u.oid AND pg_catalog.pg_has_role(n.nspowner, 'USAGE');
GRANT SELECT ON schemata TO PUBLIC;
@@ -1497,7 +1497,7 @@ GRANT SELECT ON schemata TO PUBLIC;
*/
CREATE VIEW sequences AS
- SELECT CAST(current_database() AS sql_identifier) AS sequence_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS sequence_catalog,
CAST(nc.nspname AS sql_identifier) AS sequence_schema,
CAST(c.relname AS sql_identifier) AS sequence_name,
CAST('int16' AS character_data) AS data_type,
@@ -1505,17 +1505,17 @@ CREATE VIEW sequences AS
CAST(2 AS cardinal_number) AS numeric_precision_radix,
CAST(0 AS cardinal_number) AS numeric_scale,
-- XXX: The following could be improved if we had LATERAL.
- CAST((pg_sequence_parameters(c.oid)).start_value AS character_data) AS start_value,
- CAST((pg_sequence_parameters(c.oid)).minimum_value AS character_data) AS minimum_value,
- CAST((pg_sequence_parameters(c.oid)).maximum_value AS character_data) AS maximum_value,
- CAST((pg_sequence_parameters(c.oid)).increment AS character_data) AS increment,
- CAST(CASE WHEN (pg_sequence_parameters(c.oid)).cycle_option THEN 'YES' ELSE 'NO' END AS yes_or_no) AS cycle_option
+ CAST((pg_catalog.pg_sequence_parameters(c.oid)).start_value AS character_data) AS start_value,
+ CAST((pg_catalog.pg_sequence_parameters(c.oid)).minimum_value AS character_data) AS minimum_value,
+ CAST((pg_catalog.pg_sequence_parameters(c.oid)).maximum_value AS character_data) AS maximum_value,
+ CAST((pg_catalog.pg_sequence_parameters(c.oid)).increment AS character_data) AS increment,
+ CAST(CASE WHEN (pg_catalog.pg_sequence_parameters(c.oid)).cycle_option THEN 'YES' ELSE 'NO' END AS yes_or_no) AS cycle_option
FROM pg_namespace nc, pg_class c
WHERE c.relnamespace = nc.oid
AND (c.relkind = 'L' or c.relkind = 'S')
- AND (NOT pg_is_other_temp_schema(nc.oid))
- AND (pg_has_role(c.relowner, 'USAGE')
- OR has_sequence_privilege(c.oid, 'SELECT, UPDATE, USAGE') );
+ AND (NOT pg_catalog.pg_is_other_temp_schema(nc.oid))
+ AND (pg_catalog.pg_has_role(c.relowner, 'USAGE')
+ OR pg_catalog.has_sequence_privilege(c.oid, 'SELECT, UPDATE, USAGE') );
GRANT SELECT ON sequences TO PUBLIC;
@@ -1560,7 +1560,7 @@ INSERT INTO sql_implementation_info VALUES ('10003', 'CATALOG NAME', NULL, 'Y',
INSERT INTO sql_implementation_info VALUES ('10004', 'COLLATING SEQUENCE', NULL, (SELECT default_collate_name FROM character_sets), NULL);
INSERT INTO sql_implementation_info VALUES ('23', 'CURSOR COMMIT BEHAVIOR', 1, NULL, 'close cursors and retain prepared statements');
INSERT INTO sql_implementation_info VALUES ('2', 'DATA SOURCE NAME', NULL, '', NULL);
-INSERT INTO sql_implementation_info VALUES ('17', 'DBMS NAME', NULL, (select trim(trailing ' ' from substring(version() from '^[^0-9]*'))), NULL);
+INSERT INTO sql_implementation_info VALUES ('17', 'DBMS NAME', NULL, (select trim(trailing ' ' from substring(pg_catalog.version() from '^[^0-9]*'))), NULL);
INSERT INTO sql_implementation_info VALUES ('18', 'DBMS VERSION', NULL, '???', NULL); -- filled by initdb
INSERT INTO sql_implementation_info VALUES ('26', 'DEFAULT TRANSACTION ISOLATION', 2, NULL, 'READ COMMITTED; user-settable');
INSERT INTO sql_implementation_info VALUES ('28', 'IDENTIFIER CASE', 3, NULL, 'stored in mixed case - case sensitive');
@@ -1718,10 +1718,10 @@ GRANT SELECT ON sql_sizing_profiles TO PUBLIC;
*/
CREATE VIEW table_constraints AS
- SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS constraint_catalog,
CAST(nc.nspname AS sql_identifier) AS constraint_schema,
CAST(c.conname AS sql_identifier) AS constraint_name,
- CAST(current_database() AS sql_identifier) AS table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nr.nspname AS sql_identifier) AS table_schema,
CAST(r.relname AS sql_identifier) AS table_name,
CAST(
@@ -1744,20 +1744,20 @@ CREATE VIEW table_constraints AS
AND c.conrelid = r.oid
AND c.contype NOT IN ('t', 'x') -- ignore nonstandard constraints
AND r.relkind = 'r'
- AND (NOT pg_is_other_temp_schema(nr.oid))
- AND (pg_has_role(r.relowner, 'USAGE')
+ AND (NOT pg_catalog.pg_is_other_temp_schema(nr.oid))
+ AND (pg_catalog.pg_has_role(r.relowner, 'USAGE')
-- SELECT privilege omitted, per SQL standard
- OR has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
- OR has_any_column_privilege(r.oid, 'INSERT, UPDATE, REFERENCES') )
+ OR pg_catalog.has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
+ OR pg_catalog.has_any_column_privilege(r.oid, 'INSERT, UPDATE, REFERENCES') )
UNION ALL
-- not-null constraints
- SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS constraint_catalog,
CAST(nr.nspname AS sql_identifier) AS constraint_schema,
CAST(CAST(nr.oid AS text) || '_' || CAST(r.oid AS text) || '_' || CAST(a.attnum AS text) || '_not_null' AS sql_identifier) AS constraint_name, -- XXX
- CAST(current_database() AS sql_identifier) AS table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nr.nspname AS sql_identifier) AS table_schema,
CAST(r.relname AS sql_identifier) AS table_name,
CAST('CHECK' AS character_data) AS constraint_type,
@@ -1774,11 +1774,11 @@ CREATE VIEW table_constraints AS
AND a.attnum > 0
AND NOT a.attisdropped
AND r.relkind = 'r'
- AND (NOT pg_is_other_temp_schema(nr.oid))
- AND (pg_has_role(r.relowner, 'USAGE')
+ AND (NOT pg_catalog.pg_is_other_temp_schema(nr.oid))
+ AND (pg_catalog.pg_has_role(r.relowner, 'USAGE')
-- SELECT privilege omitted, per SQL standard
- OR has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
- OR has_any_column_privilege(r.oid, 'INSERT, UPDATE, REFERENCES') );
+ OR pg_catalog.has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
+ OR pg_catalog.has_any_column_privilege(r.oid, 'INSERT, UPDATE, REFERENCES') );
GRANT SELECT ON table_constraints TO PUBLIC;
@@ -1799,20 +1799,20 @@ GRANT SELECT ON table_constraints TO PUBLIC;
CREATE VIEW table_privileges AS
SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
- CAST(current_database() AS sql_identifier) AS table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(c.prtype AS character_data) AS privilege_type,
CAST(
CASE WHEN
-- object owner always has grant options
- pg_has_role(grantee.oid, c.relowner, 'USAGE')
+ pg_catalog.pg_has_role(grantee.oid, c.relowner, 'USAGE')
OR c.grantable
THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable,
CAST(CASE WHEN c.prtype = 'SELECT' THEN 'YES' ELSE 'NO' END AS yes_or_no) AS with_hierarchy
FROM (
- SELECT oid, relname, relnamespace, relkind, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* FROM pg_class
+ SELECT oid, relname, relnamespace, relkind, relowner, (pg_catalog.aclexplode(coalesce(relacl, pg_catalog.acldefault('r', relowner)))).* FROM pg_class
) AS c (oid, relname, relnamespace, relkind, relowner, grantor, grantee, prtype, grantable),
pg_namespace nc,
pg_authid u_grantor,
@@ -1824,14 +1824,14 @@ CREATE VIEW table_privileges AS
WHERE c.relnamespace = nc.oid
AND c.relkind IN ('r', 'm', 'v')
- AND (c.relname not like 'mlog_%' AND c.relname not like 'matviewmap_%')
+ AND (c.relname not like 'mlog\_%' AND c.relname not like 'matviewmap\_%')
AND c.grantee = grantee.oid
AND c.grantor = u_grantor.oid
AND (c.prtype IN ('INSERT', 'SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'REFERENCES', 'TRIGGER')
OR c.prtype IN ('ALTER', 'DROP', 'COMMENT', 'INDEX', 'VACUUM')
)
- AND (pg_has_role(u_grantor.oid, 'USAGE')
- OR pg_has_role(grantee.oid, 'USAGE')
+ AND (pg_catalog.pg_has_role(u_grantor.oid, 'USAGE')
+ OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
OR grantee.rolname = 'PUBLIC');
GRANT SELECT ON table_privileges TO PUBLIC;
@@ -1864,12 +1864,12 @@ GRANT SELECT ON role_table_grants TO PUBLIC;
*/
CREATE VIEW tables AS
- SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(
- CASE WHEN nc.oid = pg_my_temp_schema() THEN 'LOCAL TEMPORARY'
+ CASE WHEN nc.oid = pg_catalog.pg_my_temp_schema() THEN 'LOCAL TEMPORARY'
WHEN c.relkind = 'r' THEN 'BASE TABLE'
WHEN c.relkind = 'm' THEN 'MATERIALIZED VIEW'
WHEN c.relkind = 'v' THEN 'VIEW'
@@ -1880,7 +1880,7 @@ CREATE VIEW tables AS
CAST(null AS sql_identifier) AS self_referencing_column_name,
CAST(null AS character_data) AS reference_generation,
- CAST(CASE WHEN t.typname IS NOT NULL THEN current_database() ELSE null END AS sql_identifier) AS user_defined_type_catalog,
+ CAST(CASE WHEN t.typname IS NOT NULL THEN pg_catalog.current_database() ELSE null END AS sql_identifier) AS user_defined_type_catalog,
CAST(nt.nspname AS sql_identifier) AS user_defined_type_schema,
CAST(t.typname AS sql_identifier) AS user_defined_type_name,
@@ -1896,11 +1896,11 @@ CREATE VIEW tables AS
LEFT JOIN (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid)) ON (c.reloftype = t.oid)
WHERE c.relkind IN ('r', 'm', 'v', 'f')
- AND (c.relname not like 'mlog_%' AND c.relname not like 'matviewmap_%')
- AND (NOT pg_is_other_temp_schema(nc.oid))
- AND (pg_has_role(c.relowner, 'USAGE')
- OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
- OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES') );
+ AND (c.relname not like 'mlog\_%' AND c.relname not like 'matviewmap\_%')
+ AND (NOT pg_catalog.pg_is_other_temp_schema(nc.oid))
+ AND (pg_catalog.pg_has_role(c.relowner, 'USAGE')
+ OR pg_catalog.has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
+ OR pg_catalog.has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES') );
GRANT SELECT ON tables TO PUBLIC;
@@ -1927,10 +1927,10 @@ GRANT SELECT ON tables TO PUBLIC;
*/
CREATE VIEW triggered_update_columns AS
- SELECT CAST(current_database() AS sql_identifier) AS trigger_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS trigger_catalog,
CAST(n.nspname AS sql_identifier) AS trigger_schema,
CAST(t.tgname AS sql_identifier) AS trigger_name,
- CAST(current_database() AS sql_identifier) AS event_object_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS event_object_catalog,
CAST(n.nspname AS sql_identifier) AS event_object_schema,
CAST(c.relname AS sql_identifier) AS event_object_table,
CAST(a.attname AS sql_identifier) AS event_object_column
@@ -1945,10 +1945,10 @@ CREATE VIEW triggered_update_columns AS
AND t.oid = ta.tgoid
AND (a.attrelid, a.attnum) = (t.tgrelid, ta.tgattnum)
AND NOT t.tgisinternal
- AND (NOT pg_is_other_temp_schema(n.oid))
- AND (pg_has_role(c.relowner, 'USAGE')
+ AND (NOT pg_catalog.pg_is_other_temp_schema(n.oid))
+ AND (pg_catalog.pg_has_role(c.relowner, 'USAGE')
-- SELECT privilege omitted, per SQL standard
- OR has_column_privilege(c.oid, a.attnum, 'INSERT, UPDATE, REFERENCES') );
+ OR pg_catalog.has_column_privilege(c.oid, a.attnum, 'INSERT, UPDATE, REFERENCES') );
GRANT SELECT ON triggered_update_columns TO PUBLIC;
@@ -1991,23 +1991,23 @@ GRANT SELECT ON triggered_update_columns TO PUBLIC;
*/
CREATE VIEW triggers AS
- SELECT CAST(current_database() AS sql_identifier) AS trigger_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS trigger_catalog,
CAST(n.nspname AS sql_identifier) AS trigger_schema,
CAST(t.tgname AS sql_identifier) AS trigger_name,
CAST(em.text AS character_data) AS event_manipulation,
- CAST(current_database() AS sql_identifier) AS event_object_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS event_object_catalog,
CAST(n.nspname AS sql_identifier) AS event_object_schema,
CAST(c.relname AS sql_identifier) AS event_object_table,
CAST(null AS cardinal_number) AS action_order,
-- XXX strange hacks follow
CAST(
- CASE WHEN pg_has_role(c.relowner, 'USAGE')
- THEN (SELECT m[1] FROM regexp_matches(pg_get_triggerdef(t.oid), E'.{35,} WHEN \\((.+)\\) EXECUTE PROCEDURE') AS rm(m) LIMIT 1)
+ CASE WHEN pg_catalog.pg_has_role(c.relowner, 'USAGE')
+ THEN (SELECT m[1] FROM pg_catalog.regexp_matches(pg_catalog.pg_get_triggerdef(t.oid), E'.{35,} WHEN \\((.+)\\) EXECUTE PROCEDURE') AS rm(m) LIMIT 1)
ELSE null END
AS character_data) AS action_condition,
CAST(
- substring(pg_get_triggerdef(t.oid) from
- position('EXECUTE PROCEDURE' in substring(pg_get_triggerdef(t.oid) from 48)) + 47)
+ substring(pg_catalog.pg_get_triggerdef(t.oid) from
+ position('EXECUTE PROCEDURE' in substring(pg_catalog.pg_get_triggerdef(t.oid) from 48)) + 47)
AS character_data) AS action_statement,
CAST(
-- hard-wired reference to TRIGGER_TYPE_ROW
@@ -2034,11 +2034,11 @@ CREATE VIEW triggers AS
AND c.oid = t.tgrelid
AND t.tgtype & em.num <> 0
AND NOT t.tgisinternal
- AND (NOT pg_is_other_temp_schema(n.oid))
- AND (pg_has_role(c.relowner, 'USAGE')
+ AND (NOT pg_catalog.pg_is_other_temp_schema(n.oid))
+ AND (pg_catalog.pg_has_role(c.relowner, 'USAGE')
-- SELECT privilege omitted, per SQL standard
- OR has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
- OR has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES') );
+ OR pg_catalog.has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
+ OR pg_catalog.has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES') );
GRANT SELECT ON triggers TO PUBLIC;
@@ -2051,19 +2051,19 @@ GRANT SELECT ON triggers TO PUBLIC;
CREATE VIEW udt_privileges AS
SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
- CAST(current_database() AS sql_identifier) AS udt_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS udt_catalog,
CAST(n.nspname AS sql_identifier) AS udt_schema,
CAST(t.typname AS sql_identifier) AS udt_name,
CAST(t.prtype AS character_data) AS privilege_type, -- sic
CAST(
CASE WHEN
-- object owner always has grant options
- pg_has_role(grantee.oid, t.typowner, 'USAGE')
+ pg_catalog.pg_has_role(grantee.oid, t.typowner, 'USAGE')
OR t.grantable
THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
FROM (
- SELECT oid, typname, typnamespace, typtype, typowner, (aclexplode(coalesce(typacl, acldefault('T', typowner)))).* FROM pg_type
+ SELECT oid, typname, typnamespace, typtype, typowner, (pg_catalog.aclexplode(coalesce(typacl, pg_catalog.acldefault('T', typowner)))).* FROM pg_type
) AS t (oid, typname, typnamespace, typtype, typowner, grantor, grantee, prtype, grantable),
pg_namespace n,
pg_authid u_grantor,
@@ -2078,8 +2078,8 @@ CREATE VIEW udt_privileges AS
AND t.grantee = grantee.oid
AND t.grantor = u_grantor.oid
AND t.prtype IN ('USAGE', 'ALTER', 'DROP', 'COMMENT')
- AND (pg_has_role(u_grantor.oid, 'USAGE')
- OR pg_has_role(grantee.oid, 'USAGE')
+ AND (pg_catalog.pg_has_role(u_grantor.oid, 'USAGE')
+ OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
OR grantee.rolname = 'PUBLIC');
GRANT SELECT ON udt_privileges TO PUBLIC;
@@ -2116,7 +2116,7 @@ CREATE VIEW usage_privileges AS
-- Collations have no real privileges, so we represent all collations with implicit usage privilege here.
SELECT CAST(u.rolname AS sql_identifier) AS grantor,
CAST('PUBLIC' AS sql_identifier) AS grantee,
- CAST(current_database() AS sql_identifier) AS object_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS object_catalog,
CAST(n.nspname AS sql_identifier) AS object_schema,
CAST(c.collname AS sql_identifier) AS object_name,
CAST('COLLATION' AS character_data) AS object_type,
@@ -2129,14 +2129,14 @@ CREATE VIEW usage_privileges AS
WHERE u.oid = c.collowner
AND c.collnamespace = n.oid
- AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = current_database()))
+ AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = pg_catalog.current_database()))
UNION ALL
/* domains */
SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
- CAST(current_database() AS sql_identifier) AS object_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS object_catalog,
CAST(n.nspname AS sql_identifier) AS object_schema,
CAST(t.typname AS sql_identifier) AS object_name,
CAST('DOMAIN' AS character_data) AS object_type,
@@ -2144,12 +2144,12 @@ CREATE VIEW usage_privileges AS
CAST(
CASE WHEN
-- object owner always has grant options
- pg_has_role(grantee.oid, t.typowner, 'USAGE')
+ pg_catalog.pg_has_role(grantee.oid, t.typowner, 'USAGE')
OR t.grantable
THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
FROM (
- SELECT oid, typname, typnamespace, typtype, typowner, (aclexplode(coalesce(typacl, acldefault('T', typowner)))).* FROM pg_type
+ SELECT oid, typname, typnamespace, typtype, typowner, (pg_catalog.aclexplode(coalesce(typacl, pg_catalog.acldefault('T', typowner)))).* FROM pg_type
) AS t (oid, typname, typnamespace, typtype, typowner, grantor, grantee, prtype, grantable),
pg_namespace n,
pg_authid u_grantor,
@@ -2164,8 +2164,8 @@ CREATE VIEW usage_privileges AS
AND t.grantee = grantee.oid
AND t.grantor = u_grantor.oid
AND t.prtype IN ('USAGE')
- AND (pg_has_role(u_grantor.oid, 'USAGE')
- OR pg_has_role(grantee.oid, 'USAGE')
+ AND (pg_catalog.pg_has_role(u_grantor.oid, 'USAGE')
+ OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
OR grantee.rolname = 'PUBLIC')
UNION ALL
@@ -2173,7 +2173,7 @@ CREATE VIEW usage_privileges AS
/* foreign-data wrappers */
SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
- CAST(current_database() AS sql_identifier) AS object_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS object_catalog,
CAST('' AS sql_identifier) AS object_schema,
CAST(fdw.fdwname AS sql_identifier) AS object_name,
CAST('FOREIGN DATA WRAPPER' AS character_data) AS object_type,
@@ -2181,12 +2181,12 @@ CREATE VIEW usage_privileges AS
CAST(
CASE WHEN
-- object owner always has grant options
- pg_has_role(grantee.oid, fdw.fdwowner, 'USAGE')
+ pg_catalog.pg_has_role(grantee.oid, fdw.fdwowner, 'USAGE')
OR fdw.grantable
THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
FROM (
- SELECT fdwname, fdwowner, (aclexplode(coalesce(fdwacl, acldefault('F', fdwowner)))).* FROM pg_foreign_data_wrapper
+ SELECT fdwname, fdwowner, (pg_catalog.aclexplode(coalesce(fdwacl, pg_catalog.acldefault('F', fdwowner)))).* FROM pg_foreign_data_wrapper
) AS fdw (fdwname, fdwowner, grantor, grantee, prtype, grantable),
pg_authid u_grantor,
(
@@ -2198,8 +2198,8 @@ CREATE VIEW usage_privileges AS
WHERE u_grantor.oid = fdw.grantor
AND grantee.oid = fdw.grantee
AND fdw.prtype IN ('USAGE')
- AND (pg_has_role(u_grantor.oid, 'USAGE')
- OR pg_has_role(grantee.oid, 'USAGE')
+ AND (pg_catalog.pg_has_role(u_grantor.oid, 'USAGE')
+ OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
OR grantee.rolname = 'PUBLIC')
UNION ALL
@@ -2207,7 +2207,7 @@ CREATE VIEW usage_privileges AS
/* foreign servers */
SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
- CAST(current_database() AS sql_identifier) AS object_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS object_catalog,
CAST('' AS sql_identifier) AS object_schema,
CAST(srv.srvname AS sql_identifier) AS object_name,
CAST('FOREIGN SERVER' AS character_data) AS object_type,
@@ -2215,12 +2215,12 @@ CREATE VIEW usage_privileges AS
CAST(
CASE WHEN
-- object owner always has grant options
- pg_has_role(grantee.oid, srv.srvowner, 'USAGE')
+ pg_catalog.pg_has_role(grantee.oid, srv.srvowner, 'USAGE')
OR srv.grantable
THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
FROM (
- SELECT srvname, srvowner, (aclexplode(coalesce(srvacl, acldefault('S', srvowner)))).* FROM pg_foreign_server
+ SELECT srvname, srvowner, (pg_catalog.aclexplode(coalesce(srvacl, pg_catalog.acldefault('S', srvowner)))).* FROM pg_foreign_server
) AS srv (srvname, srvowner, grantor, grantee, prtype, grantable),
pg_authid u_grantor,
(
@@ -2232,8 +2232,8 @@ CREATE VIEW usage_privileges AS
WHERE u_grantor.oid = srv.grantor
AND grantee.oid = srv.grantee
AND srv.prtype IN ('USAGE')
- AND (pg_has_role(u_grantor.oid, 'USAGE')
- OR pg_has_role(grantee.oid, 'USAGE')
+ AND (pg_catalog.pg_has_role(u_grantor.oid, 'USAGE')
+ OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
OR grantee.rolname = 'PUBLIC')
UNION ALL
@@ -2241,7 +2241,7 @@ CREATE VIEW usage_privileges AS
/* sequences */
SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
- CAST(current_database() AS sql_identifier) AS object_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS object_catalog,
CAST(n.nspname AS sql_identifier) AS object_schema,
CAST(c.relname AS sql_identifier) AS object_name,
CAST('SEQUENCE' AS character_data) AS object_type,
@@ -2249,12 +2249,12 @@ CREATE VIEW usage_privileges AS
CAST(
CASE WHEN
-- object owner always has grant options
- pg_has_role(grantee.oid, c.relowner, 'USAGE')
+ pg_catalog.pg_has_role(grantee.oid, c.relowner, 'USAGE')
OR c.grantable
THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
FROM (
- SELECT oid, relname, relnamespace, relkind, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* FROM pg_class
+ SELECT oid, relname, relnamespace, relkind, relowner, (pg_catalog.aclexplode(coalesce(relacl, pg_catalog.acldefault('r', relowner)))).* FROM pg_class
) AS c (oid, relname, relnamespace, relkind, relowner, grantor, grantee, prtype, grantable),
pg_namespace n,
pg_authid u_grantor,
@@ -2269,8 +2269,8 @@ CREATE VIEW usage_privileges AS
AND c.grantee = grantee.oid
AND c.grantor = u_grantor.oid
AND c.prtype IN ('USAGE')
- AND (pg_has_role(u_grantor.oid, 'USAGE')
- OR pg_has_role(grantee.oid, 'USAGE')
+ AND (pg_catalog.pg_has_role(u_grantor.oid, 'USAGE')
+ OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
OR grantee.rolname = 'PUBLIC');
GRANT SELECT ON usage_privileges TO PUBLIC;
@@ -2303,7 +2303,7 @@ GRANT SELECT ON role_usage_grants TO PUBLIC;
*/
CREATE VIEW user_defined_types AS
- SELECT CAST(current_database() AS sql_identifier) AS user_defined_type_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS user_defined_type_catalog,
CAST(n.nspname AS sql_identifier) AS user_defined_type_schema,
CAST(c.relname AS sql_identifier) AS user_defined_type_name,
CAST('STRUCTURED' AS character_data) AS user_defined_type_category,
@@ -2338,8 +2338,8 @@ CREATE VIEW user_defined_types AS
WHERE n.oid = c.relnamespace
AND t.typrelid = c.oid
AND c.relkind = 'c'
- AND (pg_has_role(t.typowner, 'USAGE')
- OR has_type_privilege(t.oid, 'USAGE'));
+ AND (pg_catalog.pg_has_role(t.typowner, 'USAGE')
+ OR pg_catalog.has_type_privilege(t.oid, 'USAGE'));
GRANT SELECT ON user_defined_types TO PUBLIC;
@@ -2351,10 +2351,10 @@ GRANT SELECT ON user_defined_types TO PUBLIC;
CREATE VIEW view_column_usage AS
SELECT DISTINCT
- CAST(current_database() AS sql_identifier) AS view_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS view_catalog,
CAST(nv.nspname AS sql_identifier) AS view_schema,
CAST(v.relname AS sql_identifier) AS view_name,
- CAST(current_database() AS sql_identifier) AS table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nt.nspname AS sql_identifier) AS table_schema,
CAST(t.relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name
@@ -2376,10 +2376,10 @@ CREATE VIEW view_column_usage AS
AND dt.refobjid = t.oid
AND t.relnamespace = nt.oid
AND t.relkind IN ('r', 'm', 'v', 'f')
- AND (t.relname not like 'mlog_%' AND t.relname not like 'matviewmap_%')
+ AND (t.relname not like 'mlog\_%' AND t.relname not like 'matviewmap\_%')
AND t.oid = a.attrelid
AND dt.refobjsubid = a.attnum
- AND pg_has_role(t.relowner, 'USAGE');
+ AND pg_catalog.pg_has_role(t.relowner, 'USAGE');
GRANT SELECT ON view_column_usage TO PUBLIC;
@@ -2391,10 +2391,10 @@ GRANT SELECT ON view_column_usage TO PUBLIC;
CREATE VIEW view_routine_usage AS
SELECT DISTINCT
- CAST(current_database() AS sql_identifier) AS table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nv.nspname AS sql_identifier) AS table_schema,
CAST(v.relname AS sql_identifier) AS table_name,
- CAST(current_database() AS sql_identifier) AS specific_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS specific_catalog,
CAST(np.nspname AS sql_identifier) AS specific_schema,
CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name
@@ -2412,7 +2412,7 @@ CREATE VIEW view_routine_usage AS
AND dp.refclassid = 'pg_catalog.pg_proc'::regclass
AND dp.refobjid = p.oid
AND p.pronamespace = np.oid
- AND pg_has_role(p.proowner, 'USAGE');
+ AND pg_catalog.pg_has_role(p.proowner, 'USAGE');
GRANT SELECT ON view_routine_usage TO PUBLIC;
@@ -2424,10 +2424,10 @@ GRANT SELECT ON view_routine_usage TO PUBLIC;
CREATE VIEW view_table_usage AS
SELECT DISTINCT
- CAST(current_database() AS sql_identifier) AS view_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS view_catalog,
CAST(nv.nspname AS sql_identifier) AS view_schema,
CAST(v.relname AS sql_identifier) AS view_name,
- CAST(current_database() AS sql_identifier) AS table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nt.nspname AS sql_identifier) AS table_schema,
CAST(t.relname AS sql_identifier) AS table_name
@@ -2447,8 +2447,8 @@ CREATE VIEW view_table_usage AS
AND dt.refobjid = t.oid
AND t.relnamespace = nt.oid
AND t.relkind IN ('r', 'm', 'v', 'f')
- AND (t.relname not like 'mlog_%' AND t.relname not like 'matviewmap_%')
- AND pg_has_role(t.relowner, 'USAGE');
+ AND (t.relname not like 'mlog\_%' AND t.relname not like 'matviewmap\_%')
+ AND pg_catalog.pg_has_role(t.relowner, 'USAGE');
GRANT SELECT ON view_table_usage TO PUBLIC;
@@ -2459,13 +2459,13 @@ GRANT SELECT ON view_table_usage TO PUBLIC;
*/
CREATE VIEW views AS
- SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(
- CASE WHEN pg_has_role(c.relowner, 'USAGE')
- THEN pg_get_viewdef(c.oid)
+ CASE WHEN pg_catalog.pg_has_role(c.relowner, 'USAGE')
+ THEN pg_catalog.pg_get_viewdef(c.oid)
ELSE null END
AS character_data) AS view_definition,
@@ -2504,10 +2504,10 @@ CREATE VIEW views AS
WHERE c.relnamespace = nc.oid
AND c.relkind = 'v'
- AND (NOT pg_is_other_temp_schema(nc.oid))
- AND (pg_has_role(c.relowner, 'USAGE')
- OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
- OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES') );
+ AND (NOT pg_catalog.pg_is_other_temp_schema(nc.oid))
+ AND (pg_catalog.pg_has_role(c.relowner, 'USAGE')
+ OR pg_catalog.has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
+ OR pg_catalog.has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES') );
GRANT SELECT ON views TO PUBLIC;
@@ -2520,7 +2520,7 @@ GRANT SELECT ON views TO PUBLIC;
*/
CREATE VIEW data_type_privileges AS
- SELECT CAST(current_database() AS sql_identifier) AS object_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS object_catalog,
CAST(x.objschema AS sql_identifier) AS object_schema,
CAST(x.objname AS sql_identifier) AS object_name,
CAST(x.objtype AS character_data) AS object_type,
@@ -2548,13 +2548,13 @@ GRANT SELECT ON data_type_privileges TO PUBLIC;
*/
CREATE VIEW element_types AS
- SELECT CAST(current_database() AS sql_identifier) AS object_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS object_catalog,
CAST(n.nspname AS sql_identifier) AS object_schema,
CAST(x.objname AS sql_identifier) AS object_name,
CAST(x.objtype AS character_data) AS object_type,
CAST(x.objdtdid AS sql_identifier) AS collection_type_identifier,
CAST(
- CASE WHEN nbt.nspname = 'pg_catalog' THEN format_type(bt.oid, null)
+ CASE WHEN nbt.nspname = 'pg_catalog' THEN pg_catalog.format_type(bt.oid, null)
ELSE 'USER-DEFINED' END AS character_data) AS data_type,
CAST(null AS cardinal_number) AS character_maximum_length,
@@ -2562,7 +2562,7 @@ CREATE VIEW element_types AS
CAST(null AS sql_identifier) AS character_set_catalog,
CAST(null AS sql_identifier) AS character_set_schema,
CAST(null AS sql_identifier) AS character_set_name,
- CAST(CASE WHEN nco.nspname IS NOT NULL THEN current_database() END AS sql_identifier) AS collation_catalog,
+ CAST(CASE WHEN nco.nspname IS NOT NULL THEN pg_catalog.current_database() END AS sql_identifier) AS collation_catalog,
CAST(nco.nspname AS sql_identifier) AS collation_schema,
CAST(co.collname AS sql_identifier) AS collation_name,
CAST(null AS cardinal_number) AS numeric_precision,
@@ -2574,7 +2574,7 @@ CREATE VIEW element_types AS
CAST(null AS character_data) AS domain_default, -- XXX maybe a bug in the standard
- CAST(current_database() AS sql_identifier) AS udt_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS udt_catalog,
CAST(nbt.nspname AS sql_identifier) AS udt_schema,
CAST(bt.typname AS sql_identifier) AS udt_name,
@@ -2594,7 +2594,7 @@ CREATE VIEW element_types AS
FROM pg_class c, pg_attribute a
WHERE c.oid = a.attrelid
AND c.relkind IN ('r', 'm', 'v', 'f', 'c')
- AND (c.relname not like 'mlog_%' AND c.relname not like 'matviewmap_%')
+ AND (c.relname not like 'mlog\_%' AND c.relname not like 'matviewmap\_%')
AND attnum > 0 AND NOT attisdropped
UNION ALL
@@ -2649,8 +2649,8 @@ CREATE VIEW _pg_foreign_table_columns AS
FROM pg_foreign_table t, pg_authid u, pg_namespace n, pg_class c,
pg_attribute a
WHERE u.oid = c.relowner
- AND (pg_has_role(c.relowner, 'USAGE')
- OR has_column_privilege(c.oid, a.attnum, 'SELECT, INSERT, UPDATE, REFERENCES'))
+ AND (pg_catalog.pg_has_role(c.relowner, 'USAGE')
+ OR pg_catalog.has_column_privilege(c.oid, a.attnum, 'SELECT, INSERT, UPDATE, REFERENCES'))
AND n.oid = c.relnamespace
AND c.oid = t.ftrelid
AND c.relkind = 'f'
@@ -2662,12 +2662,12 @@ CREATE VIEW _pg_foreign_table_columns AS
* COLUMN_OPTIONS view
*/
CREATE VIEW column_options AS
- SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
+ SELECT CAST(pg_catalog.current_database() AS sql_identifier) AS table_catalog,
c.nspname AS table_schema,
c.relname AS table_name,
c.attname AS column_name,
- CAST((pg_options_to_table(c.attfdwoptions)).option_name AS sql_identifier) AS option_name,
- CAST((pg_options_to_table(c.attfdwoptions)).option_value AS character_data) AS option_value
+ CAST((pg_catalog.pg_options_to_table(c.attfdwoptions)).option_name AS sql_identifier) AS option_name,
+ CAST((pg_catalog.pg_options_to_table(c.attfdwoptions)).option_value AS character_data) AS option_value
FROM _pg_foreign_table_columns c;
GRANT SELECT ON column_options TO PUBLIC;
@@ -2678,14 +2678,14 @@ CREATE VIEW _pg_foreign_data_wrappers AS
SELECT w.oid,
w.fdwowner,
w.fdwoptions,
- CAST(current_database() AS sql_identifier) AS foreign_data_wrapper_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS foreign_data_wrapper_catalog,
CAST(fdwname AS sql_identifier) AS foreign_data_wrapper_name,
CAST(u.rolname AS sql_identifier) AS authorization_identifier,
CAST('c' AS character_data) AS foreign_data_wrapper_language
FROM pg_foreign_data_wrapper w, pg_authid u
WHERE u.oid = w.fdwowner
- AND (pg_has_role(fdwowner, 'USAGE')
- OR has_foreign_data_wrapper_privilege(w.oid, 'USAGE'));
+ AND (pg_catalog.pg_has_role(fdwowner, 'USAGE')
+ OR pg_catalog.has_foreign_data_wrapper_privilege(w.oid, 'USAGE'));
/*
@@ -2695,8 +2695,8 @@ CREATE VIEW _pg_foreign_data_wrappers AS
CREATE VIEW foreign_data_wrapper_options AS
SELECT foreign_data_wrapper_catalog,
foreign_data_wrapper_name,
- CAST((pg_options_to_table(w.fdwoptions)).option_name AS sql_identifier) AS option_name,
- CAST((pg_options_to_table(w.fdwoptions)).option_value AS character_data) AS option_value
+ CAST((pg_catalog.pg_options_to_table(w.fdwoptions)).option_name AS sql_identifier) AS option_name,
+ CAST((pg_catalog.pg_options_to_table(w.fdwoptions)).option_value AS character_data) AS option_value
FROM _pg_foreign_data_wrappers w;
GRANT SELECT ON foreign_data_wrapper_options TO PUBLIC;
@@ -2721,9 +2721,9 @@ GRANT SELECT ON foreign_data_wrappers TO PUBLIC;
CREATE VIEW _pg_foreign_servers AS
SELECT s.oid,
s.srvoptions,
- CAST(current_database() AS sql_identifier) AS foreign_server_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS foreign_server_catalog,
CAST(srvname AS sql_identifier) AS foreign_server_name,
- CAST(current_database() AS sql_identifier) AS foreign_data_wrapper_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS foreign_data_wrapper_catalog,
CAST(w.fdwname AS sql_identifier) AS foreign_data_wrapper_name,
CAST(srvtype AS character_data) AS foreign_server_type,
CAST(srvversion AS character_data) AS foreign_server_version,
@@ -2731,8 +2731,8 @@ CREATE VIEW _pg_foreign_servers AS
FROM pg_foreign_server s, pg_foreign_data_wrapper w, pg_authid u
WHERE w.oid = s.srvfdw
AND u.oid = s.srvowner
- AND (pg_has_role(s.srvowner, 'USAGE')
- OR has_server_privilege(s.oid, 'USAGE'));
+ AND (pg_catalog.pg_has_role(s.srvowner, 'USAGE')
+ OR pg_catalog.has_server_privilege(s.oid, 'USAGE'));
/*
@@ -2742,8 +2742,8 @@ CREATE VIEW _pg_foreign_servers AS
CREATE VIEW foreign_server_options AS
SELECT foreign_server_catalog,
foreign_server_name,
- CAST((pg_options_to_table(s.srvoptions)).option_name AS sql_identifier) AS option_name,
- CAST((pg_options_to_table(s.srvoptions)).option_value AS character_data) AS option_value
+ CAST((pg_catalog.pg_options_to_table(s.srvoptions)).option_name AS sql_identifier) AS option_name,
+ CAST((pg_catalog.pg_options_to_table(s.srvoptions)).option_value AS character_data) AS option_value
FROM _pg_foreign_servers s;
GRANT SELECT ON TABLE foreign_server_options TO PUBLIC;
@@ -2769,20 +2769,20 @@ GRANT SELECT ON foreign_servers TO PUBLIC;
/* Base view for foreign tables */
CREATE VIEW _pg_foreign_tables AS
SELECT
- CAST(current_database() AS sql_identifier) AS foreign_table_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS foreign_table_catalog,
n.nspname AS foreign_table_schema,
c.relname AS foreign_table_name,
t.ftoptions AS ftoptions,
- CAST(current_database() AS sql_identifier) AS foreign_server_catalog,
+ CAST(pg_catalog.current_database() AS sql_identifier) AS foreign_server_catalog,
CAST(srvname AS sql_identifier) AS foreign_server_name,
CAST(u.rolname AS sql_identifier) AS authorization_identifier
FROM pg_foreign_table t, pg_foreign_server s, pg_foreign_data_wrapper w,
pg_authid u, pg_namespace n, pg_class c
WHERE w.oid = s.srvfdw
AND u.oid = c.relowner
- AND (pg_has_role(c.relowner, 'USAGE')
- OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
- OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES'))
+ AND (pg_catalog.pg_has_role(c.relowner, 'USAGE')
+ OR pg_catalog.has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
+ OR pg_catalog.has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES'))
AND n.oid = c.relnamespace
AND c.oid = t.ftrelid
AND c.relkind = 'f'
@@ -2797,8 +2797,8 @@ CREATE VIEW foreign_table_options AS
SELECT foreign_table_catalog,
foreign_table_schema,
foreign_table_name,
- CAST((pg_options_to_table(t.ftoptions)).option_name AS sql_identifier) AS option_name,
- CAST((pg_options_to_table(t.ftoptions)).option_value AS character_data) AS option_value
+ CAST((pg_catalog.pg_options_to_table(t.ftoptions)).option_name AS sql_identifier) AS option_name,
+ CAST((pg_catalog.pg_options_to_table(t.ftoptions)).option_value AS character_data) AS option_value
FROM _pg_foreign_tables t;
GRANT SELECT ON TABLE foreign_table_options TO PUBLIC;
@@ -2842,10 +2842,10 @@ CREATE VIEW user_mapping_options AS
SELECT authorization_identifier,
foreign_server_catalog,
foreign_server_name,
- CAST((pg_options_to_table(um.umoptions)).option_name AS sql_identifier) AS option_name,
+ CAST((pg_catalog.pg_options_to_table(um.umoptions)).option_name AS sql_identifier) AS option_name,
CAST(CASE WHEN (umuser <> 0 AND authorization_identifier = current_user)
- OR (umuser = 0 AND pg_has_role(srvowner, 'USAGE'))
- OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user) THEN (pg_options_to_table(um.umoptions)).option_value
+ OR (umuser = 0 AND pg_catalog.pg_has_role(srvowner, 'USAGE'))
+ OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user) THEN (pg_catalog.pg_options_to_table(um.umoptions)).option_value
ELSE NULL END AS character_data) AS option_value
FROM _pg_user_mappings um;
diff --git a/src/common/backend/catalog/namespace.cpp b/src/common/backend/catalog/namespace.cpp
index 18104d7a7..36a80a56b 100644
--- a/src/common/backend/catalog/namespace.cpp
+++ b/src/common/backend/catalog/namespace.cpp
@@ -36,6 +36,7 @@
#include "catalog/pg_collation.h"
#include "catalog/pg_conversion.h"
#include "catalog/pg_conversion_fn.h"
+#include "catalog/pg_language.h"
#include "catalog/pg_namespace.h"
#include "catalog/pg_opclass.h"
#include "catalog/pg_operator.h"
@@ -52,7 +53,9 @@
#include "catalog/pgxc_class.h"
#include "catalog/pgxc_group.h"
#include "catalog/indexing.h"
+#include "catalog/gs_db_privilege.h"
#include "commands/dbcommands.h"
+#include "commands/proclang.h"
#include "commands/tablecmds.h"
#include "funcapi.h"
#include "mb/pg_wchar.h"
@@ -151,8 +154,6 @@
* Note: all data pointed to by these List variables is in t_thrd.top_mem_cxt.
*/
-static volatile uint32 gt_tempID_seed = 0;
-
/* Local functions */
static void InitTempTableNamespace(void);
static void RemoveTempRelations(Oid tempNamespaceId);
@@ -214,7 +215,6 @@ Oid RangeVarGetRelidExtended(const RangeVar* relation, LOCKMODE lockmode, bool m
bool target_is_partition, bool isSupportSynonym, RangeVarGetRelidCallback callback, void* callback_arg,
StringInfo detailInfo, Oid* refSynOid)
{
- uint64 inval_count;
Oid relId;
Oid oldRelId = InvalidOid;
bool retry = false;
@@ -251,13 +251,18 @@ Oid RangeVarGetRelidExtended(const RangeVar* relation, LOCKMODE lockmode, bool m
* by calling AcceptInvalidationMessages() before beginning this loop, but
* that would add a significant amount overhead, so for now we don't.
*/
+ uint64 sess_inval_count;
+ uint64 thrd_inval_count = 0;
for (;;) {
/*
* Remember this value, so that, after looking up the relation name
* and locking its OID, we can check whether any invalidation messages
* have been processed that might require a do-over.
*/
- inval_count = u_sess->inval_cxt.SharedInvalidMessageCounter;
+ sess_inval_count = u_sess->inval_cxt.SIMCounter;
+ if (EnableLocalSysCache()) {
+ thrd_inval_count = t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter;
+ }
/*
* Some non-default relpersistence value may have been specified. The
@@ -376,8 +381,16 @@ Oid RangeVarGetRelidExtended(const RangeVar* relation, LOCKMODE lockmode, bool m
/*
* If no invalidation message were processed, we're done!
*/
- if (inval_count == u_sess->inval_cxt.SharedInvalidMessageCounter)
- break;
+ if (EnableLocalSysCache()) {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter &&
+ thrd_inval_count == t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter) {
+ break;
+ }
+ } else {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter) {
+ break;
+ }
+ }
/*
* Something may have changed. Let's repeat the name lookup, to make
@@ -468,6 +481,72 @@ Oid RangeVarGetCreationNamespace(const RangeVar* newRelation)
return namespaceId;
}
+bool CheckRelationCreateAnyPrivilege(Oid userId, char relkind)
+{
+ AclResult aclResult = ACLCHECK_NO_PRIV;
+ switch (relkind) {
+ case RELKIND_COMPOSITE_TYPE:
+ if (HasSpecAnyPriv(userId, CREATE_ANY_TYPE, false)) {
+ aclResult = ACLCHECK_OK;
+ }
+ break;
+ /* sequence object */
+ case RELKIND_SEQUENCE:
+ case RELKIND_LARGE_SEQUENCE:
+ if (HasSpecAnyPriv(userId, CREATE_ANY_SEQUENCE, false)) {
+ aclResult = ACLCHECK_OK;
+ }
+ break;
+ case RELKIND_INDEX:
+ case RELKIND_GLOBAL_INDEX:
+ if (HasSpecAnyPriv(userId, CREATE_ANY_INDEX, false)) {
+ aclResult = ACLCHECK_OK;
+ }
+ break;
+ /* table */
+ default:
+ if (HasSpecAnyPriv(userId, CREATE_ANY_TABLE, false)) {
+ aclResult = ACLCHECK_OK;
+ }
+ break;
+ }
+ return (aclResult == ACLCHECK_OK) ? true : false;
+}
+
+/*
+ * checking whether the user has create any permission
+ */
+bool CheckCreatePrivilegeInNamespace(Oid namespaceId, Oid roleId, const char* anyPrivilege)
+{
+ /* Check we have creation rights in target namespace */
+ AclResult aclResult = pg_namespace_aclcheck(namespaceId, roleId, ACL_CREATE);
+ /*
+ * anyResult is true, explain that the current user is granted create any permission
+ */
+ bool anyResult = false;
+ if (aclResult != ACLCHECK_OK && !IsSysSchema(namespaceId)) {
+ anyResult = HasSpecAnyPriv(roleId, anyPrivilege, false);
+ }
+ if (aclResult != ACLCHECK_OK && !anyResult) {
+ aclcheck_error(aclResult, ACL_KIND_NAMESPACE, get_namespace_name(namespaceId));
+ }
+ return anyResult;
+}
+
+static void CheckCreateRelPrivilegeInNamespace(char relkind, Oid namespaceId)
+{
+ bool anyResult = false;
+ AclResult aclResult = pg_namespace_aclcheck(namespaceId, GetUserId(), ACL_CREATE);
+ if (aclResult != ACLCHECK_OK && !IsSysSchema(namespaceId)) {
+ if (relkind != '\0') {
+ anyResult = CheckRelationCreateAnyPrivilege(GetUserId(), relkind);
+ }
+ }
+ if (aclResult != ACLCHECK_OK && (!anyResult)) {
+ aclcheck_error(aclResult, ACL_KIND_NAMESPACE, get_namespace_name(namespaceId));
+ }
+}
+
/*
* RangeVarGetAndCheckCreationNamespace
*
@@ -494,9 +573,9 @@ Oid RangeVarGetCreationNamespace(const RangeVar* newRelation)
* As a further side-effect, if the select namespace is a temporary namespace,
* we mark the RangeVar as RELPERSISTENCE_TEMP.
*/
-Oid RangeVarGetAndCheckCreationNamespace(RangeVar* relation, LOCKMODE lockmode, Oid* existing_relation_id)
+Oid RangeVarGetAndCheckCreationNamespace(RangeVar* relation, LOCKMODE lockmode,
+ Oid* existing_relation_id, char relkind)
{
- uint64 inval_count;
Oid relid;
Oid oldrelid = InvalidOid;
Oid nspid;
@@ -522,11 +601,13 @@ Oid RangeVarGetAndCheckCreationNamespace(RangeVar* relation, LOCKMODE lockmode,
* while we're doing the name lookups and acquiring locks. See comments
* in that function for a more detailed explanation of this logic.
*/
+ uint64 sess_inval_count;
+ uint64 thrd_inval_count = 0;
for (;;) {
- AclResult aclresult;
-
- inval_count = u_sess->inval_cxt.SharedInvalidMessageCounter;
-
+ sess_inval_count = u_sess->inval_cxt.SIMCounter;
+ if (EnableLocalSysCache()) {
+ thrd_inval_count = t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter;
+ }
/* Look up creation namespace and check for existing relation. */
nspid = RangeVarGetCreationNamespace(relation);
Assert(OidIsValid(nspid));
@@ -542,12 +623,8 @@ Oid RangeVarGetAndCheckCreationNamespace(RangeVar* relation, LOCKMODE lockmode,
*/
if (IsBootstrapProcessingMode())
break;
-
/* Check namespace permissions. */
- aclresult = pg_namespace_aclcheck(nspid, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, ACL_KIND_NAMESPACE, get_namespace_name(nspid));
-
+ CheckCreateRelPrivilegeInNamespace(relkind, nspid);
if (retry) {
/* If nothing changed, we're done. */
if (relid == oldrelid && nspid == oldnspid)
@@ -574,8 +651,16 @@ Oid RangeVarGetAndCheckCreationNamespace(RangeVar* relation, LOCKMODE lockmode,
}
/* If no invalidation message were processed, we're done! */
- if (inval_count == u_sess->inval_cxt.SharedInvalidMessageCounter)
- break;
+ if (EnableLocalSysCache()) {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter &&
+ thrd_inval_count == t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter) {
+ break;
+ }
+ } else {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter) {
+ break;
+ }
+ }
/* Something may have changed, so recheck our work. */
retry = true;
@@ -917,6 +1002,85 @@ bool TypeIsVisible(Oid typid)
return visible;
}
+bool isTableofIndexbyType(Oid typeOid)
+{
+ bool result = false;
+ HeapTuple typeTup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typeOid));
+ if (!HeapTupleIsValid(typeTup)) {
+ return result;
+ }
+
+ if (((Form_pg_type)GETSTRUCT(typeTup))->typtype == TYPTYPE_TABLEOF &&
+ (((Form_pg_type)GETSTRUCT(typeTup))->typcategory == TYPCATEGORY_TABLEOF_VARCHAR ||
+ ((Form_pg_type)GETSTRUCT(typeTup))->typcategory == TYPCATEGORY_TABLEOF_INTEGER)) {
+ result = true;
+ }
+
+ ReleaseSysCache(typeTup);
+
+ return result;
+}
+
+bool isTableofType(Oid typeOid, Oid* base_oid, Oid* indexbyType)
+{
+ bool result = false;
+ HeapTuple typeTup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typeOid));
+ if (!HeapTupleIsValid(typeTup)) {
+ return result;
+ }
+
+ if (((Form_pg_type)GETSTRUCT(typeTup))->typtype == TYPTYPE_TABLEOF) {
+ *base_oid = ((Form_pg_type)GETSTRUCT(typeTup))->typelem;
+ result = true;
+ }
+
+ if (indexbyType != NULL) {
+ if (((Form_pg_type)GETSTRUCT(typeTup))->typcategory == TYPCATEGORY_TABLEOF_VARCHAR) {
+ *indexbyType = VARCHAROID;
+ } else if (((Form_pg_type)GETSTRUCT(typeTup))->typcategory == TYPCATEGORY_TABLEOF_INTEGER) {
+ *indexbyType = INT4OID;
+ } else {
+ *indexbyType = InvalidOid;
+ }
+ }
+
+ ReleaseSysCache(typeTup);
+
+ return result;
+}
+
+bool IsPlpgsqlLanguageOid(Oid langoid)
+{
+ HeapTuple tp;
+ bool isNull = true;
+ char* langName = NULL;
+
+ Relation relation = heap_open(LanguageRelationId, NoLock);
+ tp = SearchSysCache1(LANGOID, ObjectIdGetDatum(langoid));
+ if (!HeapTupleIsValid(tp)) {
+ ereport(ERROR, (errcode(ERRCODE_CACHE_LOOKUP_FAILED),
+ (errmsg("cache lookup failed for language %u", langoid), errdetail("N/A."),
+ errcause("System error."), erraction("Contact engineer to support."))));
+ }
+ Datum datum = heap_getattr(tp, Anum_pg_language_lanname, RelationGetDescr(relation), &isNull);
+ if (isNull) {
+ heap_close(relation, NoLock);
+ ReleaseSysCache(tp);
+ ereport(ERROR,
+ (errcode(ERRCODE_CACHE_LOOKUP_FAILED), errmsg("cache lookup failed for language name %u", langoid)));
+ }
+ langName = NameStr(*DatumGetName(datum));
+ int result = strcasecmp(langName, "plpgsql");
+ heap_close(relation, NoLock);
+ ReleaseSysCache(tp);
+
+ if (result == 0) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
static FuncCandidateList FuncnameAddCandidates(FuncCandidateList resultList, HeapTuple procTup, List* argNames,
Oid namespaceId, Oid objNsp, int nargs, CatCList* catList, bool expandVariadic, bool expandDefaults,
bool includeOut, Oid refSynOid, bool enable_outparam_override)
@@ -946,11 +1110,15 @@ static FuncCandidateList FuncnameAddCandidates(FuncCandidateList resultList, Hea
// For compatiable with the non-A special cases, for example function with out
// param can't be called by SQL in A, but some of these are stilled called by
// such as gsql in SQL.
- Datum pprokind = SysCacheGetAttr(PROCOID, procTup, Anum_pg_proc_prokind, &isNull);
- if ((!isNull && PROC_IS_FUNC(pprokind)) || isNull) {
- proNargs = procForm->pronargs;
- allArgTypes = NULL;
- includeOut = false;
+ Datum prolangoid = SysCacheGetAttr(PROCOID, procTup, Anum_pg_proc_prolang, &isNull);
+ if (strcasecmp(get_language_name((Oid)prolangoid), "plpgsql") != 0 ||
+ u_sess->attr.attr_common.IsInplaceUpgrade || IsInitdb) {
+ Datum pprokind = SysCacheGetAttr(PROCOID, procTup, Anum_pg_proc_prokind, &isNull);
+ if ((!isNull && PROC_IS_FUNC(pprokind)) || isNull) {
+ proNargs = procForm->pronargs;
+ allArgTypes = NULL;
+ includeOut = false;
+ }
}
} else {
proNargs = procForm->pronargs;
@@ -1089,6 +1257,15 @@ static FuncCandidateList FuncnameAddCandidates(FuncCandidateList resultList, Hea
}
}
+ int allArgNum = 0;
+#ifndef ENABLE_MULTIPLE_NODES
+ Datum allArgs = SysCacheGetAttr(PROCOID, procTup, Anum_pg_proc_proallargtypes, &isNull);
+ if (!isNull) {
+ ArrayType* arr1 = DatumGetArrayTypeP(allArgs); /* ensure not toasted */
+ allArgNum = ARR_DIMS(arr1)[0];
+ }
+#endif
+
/*
* We must compute the effective argument list so that we can easily
* compare it to earlier results. We waste a palloc cycle if it gets
@@ -1104,6 +1281,7 @@ static FuncCandidateList FuncnameAddCandidates(FuncCandidateList resultList, Hea
newResult->packageOid = DatumGetObjectId(packageOidDatum);
/* record the referenced synonym oid for building view dependency. */
newResult->refSynOid = refSynOid;
+ newResult->allArgNum = allArgNum;
Oid* proargtypes = NULL;
#ifndef ENABLE_MULTIPLE_NODES
@@ -1138,6 +1316,20 @@ static FuncCandidateList FuncnameAddCandidates(FuncCandidateList resultList, Hea
securec_check(rc, "\0", "\0");
}
+ /*
+ * some procedure args have tableof variable,
+ * when match the proc parameters' type,
+ * we should change to its base type.
+ */
+ if (numProcAllArgs > 0 && newResult->args != NULL) {
+ for (int i = 0; i < numProcAllArgs; i++) {
+ Oid base_oid = InvalidOid;
+ if(isTableofType(newResult->args[i], &base_oid, NULL)) {
+ newResult->args[i] = base_oid;
+ }
+ }
+ }
+
if (variadic) {
int i;
@@ -1354,11 +1546,11 @@ FuncCandidateList FuncnameGetCandidates(List* names, int nargs, List* argnames,
}
#endif
- if (u_sess->plsql_cxt.curr_compile_context != NULL &&
+ if (OidIsValid(u_sess->plsql_cxt.running_pkg_oid)) {
+ caller_pkg_oid = u_sess->plsql_cxt.running_pkg_oid;
+ } else if (u_sess->plsql_cxt.curr_compile_context != NULL &&
u_sess->plsql_cxt.curr_compile_context->plpgsql_curr_compile_package != NULL) {
caller_pkg_oid = u_sess->plsql_cxt.curr_compile_context->plpgsql_curr_compile_package->pkg_oid;
- } else {
- caller_pkg_oid = u_sess->plsql_cxt.running_pkg_oid;
}
/* check for caller error */
Assert(nargs >= 0 || !(expand_variadic || expand_defaults));
@@ -1382,11 +1574,19 @@ FuncCandidateList FuncnameGetCandidates(List* names, int nargs, List* argnames,
/* Step1. search syscache by name only and add candidates from pg_proc */
CatCList* catlist = NULL;
+#ifndef ENABLE_MULTIPLE_NODES
+ if (t_thrd.proc->workingVersionNum < 92470) {
+ catlist = SearchSysCacheList1(PROCNAMEARGSNSP, CStringGetDatum(funcname));
+ } else {
+ catlist = SearchSysCacheList1(PROCALLARGS, CStringGetDatum(funcname));
+ }
+#else
catlist = SearchSysCacheList1(PROCNAMEARGSNSP, CStringGetDatum(funcname));
- for (i = 0; i < catlist->n_members; i++) {
+#endif
+ for (i = 0; i < catlist->n_members; i++) {
namespaceId = initNamesapceId;
- HeapTuple proctup = &catlist->members[i]->tuple;
+ HeapTuple proctup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
if (!OidIsValid(HeapTupleGetOid(proctup)) || !HeapTupleIsValid(proctup)) {
continue;
}
@@ -1510,7 +1710,7 @@ FuncCandidateList FuncnameGetCandidates(List* names, int nargs, List* argnames,
catlist = SearchSysCacheList1(PROCNAMEARGSNSP, CStringGetDatum(NameStr(synForm->synobjname)));
#endif
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple procTuple = &catlist->members[i]->tuple;
+ HeapTuple procTuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
if (!OidIsValid(HeapTupleGetOid(procTuple))) {
continue;
}
@@ -1568,7 +1768,7 @@ KeyCandidateList CeknameGetCandidates(const List *names, bool key_create)
catlist = SearchSysCacheList1(COLUMNSETTINGNAME, CStringGetDatum(keyname));
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple keytup = &catlist->members[i]->tuple;
+ HeapTuple keytup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_gs_column_keys keyform = (Form_gs_column_keys)GETSTRUCT(keytup);
KeyCandidateList newResult;
@@ -1636,7 +1836,7 @@ KeyCandidateList GlobalSettingGetCandidates(const List *names, bool key_create)
catlist = SearchSysCacheList1(GLOBALSETTINGNAME, CStringGetDatum(keyname));
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple keytup = &catlist->members[i]->tuple;
+ HeapTuple keytup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_gs_client_global_keys keyform = (Form_gs_client_global_keys)GETSTRUCT(keytup);
KeyCandidateList newResult;
@@ -1888,8 +2088,27 @@ bool FunctionIsVisible(Oid funcid)
visible = false;
oidvector* proargs = ProcedureGetArgTypes(proctup);
- clist = FuncnameGetCandidates(list_make1(makeString(proname)), nargs, NIL, false, false, false);
+#ifndef ENABLE_MULTIPLE_NODES
+ bool enable_outparam_override = false;
+ enable_outparam_override = enable_out_param_override();
+ if (enable_outparam_override) {
+ bool isNull = false;
+ Datum argTypes = ProcedureGetAllArgTypes(proctup, &isNull);
+ if (!isNull) {
+ oidvector* allArgTypes = (oidvector *)PG_DETOAST_DATUM(argTypes);
+ int proNargs = allArgTypes->dim1;
+ clist = FuncnameGetCandidates(list_make1(makeString(proname)),
+ proNargs, NIL, false, false, false, true);
+ } else {
+ clist = FuncnameGetCandidates(list_make1(makeString(proname)), nargs, NIL, false, false, false);
+ }
+ } else {
+ clist = FuncnameGetCandidates(list_make1(makeString(proname)), nargs, NIL, false, false, false);
+ }
+#else
+ clist = FuncnameGetCandidates(list_make1(makeString(proname)), nargs, NIL, false, false, false);
+#endif
for (; clist; clist = clist->next) {
if (memcmp(clist->args, proargs->values, nargs * sizeof(Oid)) == 0) {
/* Found the expected entry; is it the right proc? */
@@ -1973,7 +2192,7 @@ Oid OpernameGetOprid(List* names, Oid oprleft, Oid oprright)
continue; /* do not look in temp namespace */
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple opertup = &catlist->members[i]->tuple;
+ HeapTuple opertup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_operator operform = (Form_pg_operator)GETSTRUCT(opertup);
if (operform->oprnamespace == namespaceId) {
@@ -2050,7 +2269,7 @@ FuncCandidateList OpernameGetCandidates(List* names, char oprkind)
resultSpace = (char*)palloc(catlist->n_members * SPACE_PER_OP);
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple opertup = &catlist->members[i]->tuple;
+ HeapTuple opertup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_operator operform = (Form_pg_operator)GETSTRUCT(opertup);
int pathpos = 0;
FuncCandidateList newResult;
@@ -2127,6 +2346,7 @@ FuncCandidateList OpernameGetCandidates(List* names, char oprkind)
newResult->pathpos = pathpos;
newResult->oid = HeapTupleGetOid(opertup);
newResult->nargs = 2;
+ newResult->packageOid = InvalidOid;
newResult->nvargs = 0;
newResult->ndargs = 0;
newResult->argnumbers = NULL;
@@ -2950,7 +3170,7 @@ bool IsPackageFunction(List* funcname)
#endif
bool isFirstPackageFunction = false;
for (int i = 0; i < catlist->n_members; i++) {
- HeapTuple proctup = &catlist->members[i]->tuple;
+ HeapTuple proctup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_proc procform = (Form_pg_proc)GETSTRUCT(proctup);
Datum packageid_datum = SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_packageid, &isNull);
Oid packageid = InvalidOid;
@@ -2981,7 +3201,7 @@ bool IsPackageFunction(List* funcname)
}
/* package function and not package function can not overload */
- proctup = &catlist->members[i]->tuple;
+ proctup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Datum ispackage = SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_package, &isNull);
result = DatumGetBool(ispackage);
if (IsSystemObjOid(HeapTupleGetOid(proctup))) {
@@ -2996,16 +3216,16 @@ bool IsPackageFunction(List* funcname)
if (result && isFirstPackageFunction) {
continue;
} else if (!result) {
- ReleaseCatCacheList(catlist);
+ ReleaseSysCacheList(catlist);
return false;
}
} else if (OidIsValid(packageid)) {
- ReleaseCatCacheList(catlist);
+ ReleaseSysCacheList(catlist);
return true;
}
}
- ReleaseCatCacheList(catlist);
+ ReleaseSysCacheList(catlist);
if (isFirstPackageFunction) {
return true;
} else {
@@ -3190,7 +3410,6 @@ Oid QualifiedNameGetCreationNamespace(const List* names, char** objname_p)
/* deconstruct the name list */
DeconstructQualifiedName(names, &schemaname, objname_p);
- uint64 inval_count;
Oid nspid = InvalidOid;
Oid oldnspid = InvalidOid;
bool retry = false;
@@ -3200,9 +3419,13 @@ Oid QualifiedNameGetCreationNamespace(const List* names, char** objname_p)
* tracking whether any invalidation messages are processed
* while we're doing the name lookups and acquiring locks.
*/
+ uint64 sess_inval_count;
+ uint64 thrd_inval_count = 0;
for (;;) {
- inval_count = u_sess->inval_cxt.SharedInvalidMessageCounter;
-
+ sess_inval_count = u_sess->inval_cxt.SIMCounter;
+ if (EnableLocalSysCache()) {
+ thrd_inval_count = t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter;
+ }
/* Look up creation namespace. */
nspid = SchemaNameGetSchemaOid(schemaname);
Assert(OidIsValid(nspid));
@@ -3225,8 +3448,16 @@ Oid QualifiedNameGetCreationNamespace(const List* names, char** objname_p)
LockDatabaseObject(NamespaceRelationId, nspid, 0, AccessShareLock);
/* If no invalidation message were processed, we're done! */
- if (inval_count == u_sess->inval_cxt.SharedInvalidMessageCounter)
- break;
+ if (EnableLocalSysCache()) {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter &&
+ thrd_inval_count == t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter) {
+ break;
+ }
+ } else {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter) {
+ break;
+ }
+ }
/* Something may have changed, so recheck our work. */
retry = true;
@@ -3276,7 +3507,10 @@ Oid get_namespace_oid(const char* nspname, bool missing_ok)
if (!OidIsValid(oid) && !missing_ok) {
char message[MAXSTRLEN];
errno_t rc = sprintf_s(message, MAXSTRLEN, "schema \"%s\" does not exist", nspname);
- securec_check_ss_c(rc, "", "");
+ if (strlen(nspname) > MAXSTRLEN) {
+ ereport(ERROR, (errcode(ERRCODE_UNDEFINED_SCHEMA), errmsg("The schema name exceeds the maximum length.")));
+ }
+ securec_check_ss(rc, "", "");
InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc, true);
ereport(ERROR, (errcode(ERRCODE_UNDEFINED_SCHEMA), errmsg("schema \"%s\" does not exist", nspname)));
}
@@ -4558,7 +4792,7 @@ void InitializeSearchPath(void)
* In normal mode, arrange for a callback on any syscache invalidation
* of pg_namespace rows.
*/
- CacheRegisterSyscacheCallback(NAMESPACEOID, NamespaceCallback, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(NAMESPACEOID, NamespaceCallback, (Datum)0);
/* Force search path to be recomputed on next use */
u_sess->catalog_cxt.baseSearchPathValid = false;
}
@@ -4841,11 +5075,12 @@ void FetchDefaultArgumentPos(int** defpos, int2vector* adefpos, const char* argm
/*
* @Description: get the namespace's owner that has the same name as the namespace.
* @in nspid : namespace oid.
+ * @anyPriv : anyPriv is true, explain that the user has create any permission
* @in is_securityadmin : whether the is a security administrator doing this.
* @return : return InvalidOid if there is no appropriate role.
* return the owner's oid if the namespace has the same name as its owner.
*/
-Oid GetUserIdFromNspId(Oid nspid, bool is_securityadmin)
+Oid GetUserIdFromNspId(Oid nspid, bool is_securityadmin, bool anyPriv)
{
char* rolname = NULL;
Oid nspowner = InvalidOid;
@@ -4868,7 +5103,8 @@ Oid GetUserIdFromNspId(Oid nspid, bool is_securityadmin)
* return the owner's oid
*/
if (!strcmp(NameStr(nsptup->nspname), rolname)) {
- if (!is_securityadmin && (!superuser_arg(GetUserId()) && !has_privs_of_role(GetUserId(), nspowner) &&
+ if (!is_securityadmin && (!superuser_arg(GetUserId()) &&
+ !has_privs_of_role(GetUserId(), nspowner) && (!anyPriv) &&
!(isOperatoradmin(GetUserId()) && u_sess->attr.attr_security.operation_mode))) {
ReleaseSysCache(tuple);
ereport(ERROR,
diff --git a/src/common/backend/catalog/objectaddress.cpp b/src/common/backend/catalog/objectaddress.cpp
index 2b998e04f..60f75ed2e 100644
--- a/src/common/backend/catalog/objectaddress.cpp
+++ b/src/common/backend/catalog/objectaddress.cpp
@@ -161,9 +161,6 @@ static ObjectAddress get_object_address_attribute(
static ObjectAddress get_object_address_type(ObjectType objtype, List* objname, bool missing_ok);
static ObjectAddress get_object_address_opcf(ObjectType objtype, List* objname, List* objargs, bool missing_ok);
static const ObjectPropertyType* get_object_property_data(Oid class_id);
-static ObjectAddress get_object_address_publication_rel(List *objname, List *objargs,
- Relation *relation, bool missing_ok);
-
/*
* Translate an object name and arguments (as passed by the parser) to an
@@ -191,19 +188,23 @@ ObjectAddress get_object_address(
ObjectAddress address;
ObjectAddress old_address = {InvalidOid, InvalidOid, 0};
Relation relation = NULL;
- uint64 inval_count;
+ Relation old_relation = NULL;
List* objargs_agg = NULL;
/* Some kind of lock must be taken. */
Assert(lockmode != NoLock);
-
+ uint64 sess_inval_count;
+ uint64 thrd_inval_count = 0;
for (;;) {
/*
* Remember this value, so that, after looking up the object name and
* locking it, we can check whether any invalidation messages have
* been processed that might require a do-over.
*/
- inval_count = u_sess->inval_cxt.SharedInvalidMessageCounter;
+ sess_inval_count = u_sess->inval_cxt.SIMCounter;
+ if (EnableLocalSysCache()) {
+ thrd_inval_count = t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter;
+ }
/* Look up object address. */
switch (objtype) {
@@ -336,8 +337,6 @@ ObjectAddress get_object_address(
case OBJECT_DIRECTORY:
address = get_object_address_unqualified(objtype, objname, missing_ok);
break;
- case OBJECT_PUBLICATION_REL:
- address = get_object_address_publication_rel(objname, objargs, &relation, missing_ok);
default:
ereport(
ERROR, (errcode(ERRCODE_UNRECOGNIZED_NODE_TYPE), errmsg("unrecognized objtype: %d", (int)objtype)));
@@ -362,9 +361,21 @@ ObjectAddress get_object_address(
*/
if (OidIsValid(old_address.classId)) {
if (old_address.classId == address.classId && old_address.objectId == address.objectId &&
- old_address.objectSubId == address.objectSubId)
- break;
+ old_address.objectSubId == address.objectSubId) {
+ if (old_relation != NULL) {
+ Assert(old_relation == relation);
+ /* should be 2 */
+ Assert(old_relation->rd_refcnt > 1);
+ heap_close(old_relation, NoLock);
+ old_relation = NULL;
+ }
+ break;
+ }
if (old_address.classId != RelationRelationId) {
+ if (old_relation != NULL) {
+ heap_close(old_relation, NoLock);
+ old_relation = NULL;
+ }
if (IsSharedRelation(old_address.classId))
UnlockSharedObject(old_address.classId, old_address.objectId, 0, lockmode);
else
@@ -403,9 +414,18 @@ ObjectAddress get_object_address(
* up no longer refers to the object we locked, so we retry the lookup
* and see whether we get the same answer.
*/
- if (inval_count == u_sess->inval_cxt.SharedInvalidMessageCounter || relation != NULL)
- break;
+ if (EnableLocalSysCache()) {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter &&
+ thrd_inval_count == t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter) {
+ break;
+ }
+ } else {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter) {
+ break;
+ }
+ }
old_address = address;
+ old_relation = relation;
}
/* Return the object address and the relation. */
@@ -768,6 +788,8 @@ static ObjectAddress get_object_address_attribute(
(errcode(ERRCODE_UNDEFINED_COLUMN),
errmsg("column \"%s\" of relation \"%s\" does not exist", attname, NameListToString(relname))));
+ /* close but save lock */
+ heap_close(relation, NoLock);
address.classId = RelationRelationId;
address.objectId = InvalidOid;
address.objectSubId = InvalidAttrNumber;
@@ -829,47 +851,6 @@ static ObjectAddress get_object_address_type(ObjectType objtype, List* objname,
return address;
}
-/*
- * Find the ObjectAddress for a publication relation. The objname parameter
- * is the relation name; objargs contains the publication name.
- */
-static ObjectAddress get_object_address_publication_rel(List *objname, List *objargs, Relation *relation,
- bool missing_ok)
-{
- ObjectAddress address;
- char *pubname;
- Publication *pub;
-
- address.classId = PublicationRelRelationId;
- address.objectId = InvalidOid;
- address.objectSubId = InvalidOid;
-
- *relation = relation_openrv_extended(makeRangeVarFromNameList(objname), AccessShareLock, missing_ok);
- if (!relation)
- return address;
-
- /* fetch publication name from input list */
- pubname = strVal(linitial(objargs));
-
- /* Now look up the pg_publication tuple */
- pub = GetPublicationByName(pubname, missing_ok);
- if (!pub)
- return address;
-
- /* Find the publication relation mapping in syscache. */
- address.objectId =
- GetSysCacheOid2(PUBLICATIONRELMAP, ObjectIdGetDatum(RelationGetRelid(*relation)), ObjectIdGetDatum(pub->oid));
- if (!OidIsValid(address.objectId)) {
- if (!missing_ok)
- ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("publication relation \"%s\" in publication \"%s\" does not exist",
- RelationGetRelationName(*relation), pubname)));
- return address;
- }
-
- return address;
-}
-
/*
* Find the ObjectAddress for an opclass or opfamily.
*/
diff --git a/src/common/backend/catalog/performance_views.sql b/src/common/backend/catalog/performance_views.sql
index e84e81324..513280b98 100644
--- a/src/common/backend/catalog/performance_views.sql
+++ b/src/common/backend/catalog/performance_views.sql
@@ -115,13 +115,13 @@ CREATE VIEW dbe_perf.global_instance_time AS
CREATE VIEW dbe_perf.workload_sql_count AS
SELECT
pg_user.respool as workload,
- sum(S.select_count)::bigint AS select_count,
- sum(S.update_count)::bigint AS update_count,
- sum(S.insert_count)::bigint AS insert_count,
- sum(S.delete_count)::bigint AS delete_count,
- sum(S.ddl_count)::bigint AS ddl_count,
- sum(S.dml_count)::bigint AS dml_count,
- sum(S.dcl_count)::bigint AS dcl_count
+ pg_catalog.sum(S.select_count)::bigint AS select_count,
+ pg_catalog.sum(S.update_count)::bigint AS update_count,
+ pg_catalog.sum(S.insert_count)::bigint AS insert_count,
+ pg_catalog.sum(S.delete_count)::bigint AS delete_count,
+ pg_catalog.sum(S.ddl_count)::bigint AS ddl_count,
+ pg_catalog.sum(S.dml_count)::bigint AS dml_count,
+ pg_catalog.sum(S.dcl_count)::bigint AS dcl_count
FROM
pg_user left join pg_stat_get_sql_count() AS S on pg_user.usename = S.user_name
GROUP by pg_user.respool;
@@ -129,22 +129,22 @@ CREATE VIEW dbe_perf.workload_sql_count AS
CREATE VIEW dbe_perf.workload_sql_elapse_time AS
SELECT
pg_user.respool as workload,
- sum(S.total_select_elapse)::bigint AS total_select_elapse,
- MAX(S.max_select_elapse) AS max_select_elapse,
- MIN(S.min_select_elapse) AS min_select_elapse,
- ((sum(S.total_select_elapse) / greatest(sum(S.select_count), 1))::bigint) AS avg_select_elapse,
- sum(S.total_update_elapse)::bigint AS total_update_elapse,
- MAX(S.max_update_elapse) AS max_update_elapse,
- MIN(S.min_update_elapse) AS min_update_elapse,
- ((sum(S.total_update_elapse) / greatest(sum(S.update_count), 1))::bigint) AS avg_update_elapse,
- sum(S.total_insert_elapse)::bigint AS total_insert_elapse,
- MAX(S.max_insert_elapse) AS max_insert_elapse,
- MIN(S.min_insert_elapse) AS min_insert_elapse,
- ((sum(S.total_insert_elapse) / greatest(sum(S.insert_count), 1))::bigint) AS avg_insert_elapse,
- sum(S.total_delete_elapse)::bigint AS total_delete_elapse,
- MAX(S.max_delete_elapse) AS max_delete_elapse,
- MIN(S.min_delete_elapse) AS min_delete_elapse,
- ((sum(S.total_delete_elapse) / greatest(sum(S.delete_count), 1))::bigint) AS avg_delete_elapse
+ pg_catalog.sum(S.total_select_elapse)::bigint AS total_select_elapse,
+ pg_catalog.MAX(S.max_select_elapse) AS max_select_elapse,
+ pg_catalog.MIN(S.min_select_elapse) AS min_select_elapse,
+ ((pg_catalog.sum(S.total_select_elapse) / greatest(pg_catalog.sum(S.select_count), 1))::bigint) AS avg_select_elapse,
+ pg_catalog.sum(S.total_update_elapse)::bigint AS total_update_elapse,
+ pg_catalog.MAX(S.max_update_elapse) AS max_update_elapse,
+ pg_catalog.MIN(S.min_update_elapse) AS min_update_elapse,
+ ((pg_catalog.sum(S.total_update_elapse) / greatest(pg_catalog.sum(S.update_count), 1))::bigint) AS avg_update_elapse,
+ pg_catalog.sum(S.total_insert_elapse)::bigint AS total_insert_elapse,
+ pg_catalog.MAX(S.max_insert_elapse) AS max_insert_elapse,
+ pg_catalog.MIN(S.min_insert_elapse) AS min_insert_elapse,
+ ((pg_catalog.sum(S.total_insert_elapse) / greatest(pg_catalog.sum(S.insert_count), 1))::bigint) AS avg_insert_elapse,
+ pg_catalog.sum(S.total_delete_elapse)::bigint AS total_delete_elapse,
+ pg_catalog.MAX(S.max_delete_elapse) AS max_delete_elapse,
+ pg_catalog.MIN(S.min_delete_elapse) AS min_delete_elapse,
+ ((pg_catalog.sum(S.total_delete_elapse) / greatest(pg_catalog.sum(S.delete_count), 1))::bigint) AS avg_delete_elapse
FROM
pg_user left join pg_stat_get_sql_count() AS S on pg_user.usename = S.user_name
GROUP by pg_user.respool;
@@ -249,7 +249,7 @@ SELECT
giwi.bg_resp_avg as bg_resp_avg,
giwi.bg_resp_total as bg_resp_total
FROM
- pg_user left join get_instr_workload_info(0) AS giwi on pg_user.usesysid = giwi.user_oid;
+ pg_user left join pg_catalog.get_instr_workload_info(0) AS giwi on pg_user.usesysid = giwi.user_oid;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_user_transaction
(OUT node_name name, OUT usename name, OUT commit_counter bigint,
@@ -298,18 +298,18 @@ CREATE VIEW dbe_perf.global_user_transaction AS
CREATE VIEW dbe_perf.workload_transaction AS
select
pg_user.respool as workload,
- sum(W.commit_counter)::bigint as commit_counter,
- sum(W.rollback_counter)::bigint as rollback_counter,
- min(W.resp_min)::bigint as resp_min,
- max(W.resp_max)::bigint as resp_max,
- ((sum(W.resp_total) / greatest(sum(W.commit_counter), 1))::bigint) AS resp_avg,
- sum(W.resp_total)::bigint as resp_total,
- sum(W.bg_commit_counter)::bigint as bg_commit_counter,
- sum(W.bg_rollback_counter)::bigint as bg_rollback_counter,
- min(W.bg_resp_min)::bigint as bg_resp_min,
- max(W.bg_resp_max)::bigint as bg_resp_max,
- ((sum(W.bg_resp_total) / greatest(sum(W.bg_commit_counter), 1))::bigint) AS bg_resp_avg,
- sum(W.bg_resp_total)::bigint as bg_resp_total
+ pg_catalog.sum(W.commit_counter)::bigint as commit_counter,
+ pg_catalog.sum(W.rollback_counter)::bigint as rollback_counter,
+ pg_catalog.min(W.resp_min)::bigint as resp_min,
+ pg_catalog.max(W.resp_max)::bigint as resp_max,
+ ((pg_catalog.sum(W.resp_total) / greatest(pg_catalog.sum(W.commit_counter), 1))::bigint) AS resp_avg,
+ pg_catalog.sum(W.resp_total)::bigint as resp_total,
+ pg_catalog.sum(W.bg_commit_counter)::bigint as bg_commit_counter,
+ pg_catalog.sum(W.bg_rollback_counter)::bigint as bg_rollback_counter,
+ pg_catalog.min(W.bg_resp_min)::bigint as bg_resp_min,
+ pg_catalog.max(W.bg_resp_max)::bigint as bg_resp_max,
+ ((pg_catalog.sum(W.bg_resp_total) / greatest(pg_catalog.sum(W.bg_commit_counter), 1))::bigint) AS bg_resp_avg,
+ pg_catalog.sum(W.bg_resp_total)::bigint as bg_resp_total
from
pg_user left join dbe_perf.user_transaction AS W on pg_user.usename = W.usename
group by
@@ -361,18 +361,18 @@ CREATE VIEW dbe_perf.global_workload_transaction AS
CREATE VIEW dbe_perf.summary_workload_transaction AS
SELECT
W.workload AS workload,
- sum(W.commit_counter) AS commit_counter,
- sum(W.rollback_counter) AS rollback_counter,
- coalesce(min(NULLIF(W.resp_min, 0)), 0) AS resp_min,
- max(W.resp_max) AS resp_max,
- ((sum(W.resp_total) / greatest(sum(W.commit_counter), 1))::bigint) AS resp_avg,
- sum(W.resp_total) AS resp_total,
- sum(W.bg_commit_counter) AS bg_commit_counter,
- sum(W.bg_rollback_counter) AS bg_rollback_counter,
- coalesce(min(NULLIF(W.bg_resp_min, 0)), 0) AS bg_resp_min,
- max(W.bg_resp_max) AS bg_resp_max,
- ((sum(W.bg_resp_total) / greatest(sum(W.bg_commit_counter), 1))::bigint) AS bg_resp_avg,
- sum(W.bg_resp_total) AS bg_resp_total
+ pg_catalog.sum(W.commit_counter) AS commit_counter,
+ pg_catalog.sum(W.rollback_counter) AS rollback_counter,
+ coalesce(pg_catalog.min(NULLIF(W.resp_min, 0)), 0) AS resp_min,
+ pg_catalog.max(W.resp_max) AS resp_max,
+ ((pg_catalog.sum(W.resp_total) / greatest(pg_catalog.sum(W.commit_counter), 1))::bigint) AS resp_avg,
+ pg_catalog.sum(W.resp_total) AS resp_total,
+ pg_catalog.sum(W.bg_commit_counter) AS bg_commit_counter,
+ pg_catalog.sum(W.bg_rollback_counter) AS bg_rollback_counter,
+ coalesce(pg_catalog.min(NULLIF(W.bg_resp_min, 0)), 0) AS bg_resp_min,
+ pg_catalog.max(W.bg_resp_max) AS bg_resp_max,
+ ((pg_catalog.sum(W.bg_resp_total) / greatest(pg_catalog.sum(W.bg_commit_counter), 1))::bigint) AS bg_resp_avg,
+ pg_catalog.sum(W.bg_resp_total) AS bg_resp_total
FROM dbe_perf.get_global_workload_transaction() AS W
GROUP by W.workload;
@@ -527,7 +527,7 @@ CREATE VIEW dbe_perf.session_cpu_runtime AS
S.query,
S.node_group,
T.top_cpu_dn
- FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T
+ FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T
WHERE S.pid = T.threadid;
CREATE VIEW dbe_perf.session_memory_runtime AS
@@ -542,7 +542,7 @@ CREATE VIEW dbe_perf.session_memory_runtime AS
S.query,
S.node_group,
T.top_mem_dn
- FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T
+ FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T
WHERE S.pid = T.threadid;
CREATE OR REPLACE VIEW dbe_perf.session_stat_activity AS
@@ -568,8 +568,10 @@ CREATE OR REPLACE VIEW dbe_perf.session_stat_activity AS
ELSE S.srespool
END AS resource_pool,
S.query_id,
- S.query
- FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_authid U
+ S.query,
+ S.unique_sql_id,
+ S.trace_id
+ FROM pg_database D, pg_catalog.pg_stat_get_activity(NULL) AS S, pg_authid U
WHERE S.datid = D.oid AND
S.usesysid = U.oid;
@@ -579,7 +581,7 @@ CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_stat_activity
out client_hostname text, out client_port integer, out backend_start timestamptz,
out xact_start timestamptz, out query_start timestamptz, out state_change timestamptz,
out waiting boolean, out enqueue text, out state text, out resource_pool name,
- out query_id bigint, out query text)
+ out query_id bigint, out query text, out unique_sql_id bigint, out trace_id text)
RETURNS setof record
AS $$
DECLARE
@@ -614,6 +616,8 @@ DECLARE
resource_pool :=row_data.resource_pool;
query_id :=row_data.query_id;
query := row_data.query;
+ unique_sql_id := row_data.unique_sql_id;
+ trace_id := row_data.trace_id;
return next;
END LOOP;
END LOOP;
@@ -625,7 +629,7 @@ CREATE VIEW dbe_perf.global_session_stat_activity AS
SELECT * FROM dbe_perf.get_global_session_stat_activity();
CREATE VIEW dbe_perf.thread_wait_status AS
- SELECT * FROM pg_stat_get_status(NULL);
+ SELECT * FROM pg_catalog.pg_stat_get_status(NULL);
CREATE OR REPLACE FUNCTION dbe_perf.get_global_thread_wait_status()
RETURNS setof dbe_perf.thread_wait_status
@@ -665,7 +669,7 @@ CREATE VIEW DBE_PERF.wlm_user_resource_runtime AS
T.total_temp_space,
T.used_spill_space,
T.total_spill_space
- FROM (select usename, (gs_wlm_user_resource_info(usename::cstring)).* from pg_user) T;
+ FROM (select usename, (pg_catalog.gs_wlm_user_resource_info(usename::cstring)).* from pg_user) T;
CREATE VIEW dbe_perf.wlm_user_resource_config AS
SELECT
@@ -679,7 +683,7 @@ CREATE VIEW dbe_perf.wlm_user_resource_config AS
T.spacelimit,
T.childcount,
T.childlist
- FROM pg_authid AS S, gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R
+ FROM pg_authid AS S, pg_catalog.gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R
WHERE S.oid = T.userid AND T.rpoid = R.oid;
CREATE VIEW dbe_perf.operator_history_table AS
@@ -712,7 +716,7 @@ CREATE VIEW dbe_perf.global_operator_history_table AS
--history operator-level view for DM in single CN
CREATE VIEW dbe_perf.operator_history AS
- SELECT * FROM pg_stat_get_wlm_operator_info(0);
+ SELECT * FROM pg_catalog.pg_stat_get_wlm_operator_info(0);
CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_history()
RETURNS setof dbe_perf.operator_history
@@ -741,7 +745,7 @@ CREATE VIEW dbe_perf.global_operator_history AS
--real time operator-level view in single CN
CREATE VIEW dbe_perf.operator_runtime AS
SELECT t.*
- FROM dbe_perf.session_stat_activity AS s, pg_stat_get_wlm_realtime_operator_info(NULL) as t
+ FROM dbe_perf.session_stat_activity AS s, pg_catalog.pg_stat_get_wlm_realtime_operator_info(NULL) as t
WHERE s.query_id = t.queryid;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_runtime()
@@ -838,7 +842,7 @@ SELECT
S.mem_top5_value,
S.top_mem_dn,
S.top_cpu_dn
-FROM pg_stat_get_wlm_session_info(0) S;
+FROM pg_catalog.pg_stat_get_wlm_session_info(0) S;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_history()
RETURNS setof dbe_perf.statement_complex_history
@@ -941,7 +945,7 @@ CREATE VIEW dbe_perf.statement_complex_runtime AS
S.node_group,
T.top_cpu_dn,
T.top_mem_dn
- FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T
+ FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T
WHERE S.pid = T.threadid;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_runtime()
@@ -982,7 +986,7 @@ CREATE VIEW dbe_perf.statement_iostat_complex_runtime AS
S.query,
S.node_group,
T.curr_io_limits as curr_io_limits
- FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_session_iostat_info(0) AS T
+ FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_session_iostat_info(0) AS T
WHERE S.pid = T.threadid;
CREATE OR REPLACE VIEW dbe_perf.statement_wlmstat_complex_runtime AS
@@ -1013,7 +1017,7 @@ CREATE OR REPLACE VIEW dbe_perf.statement_wlmstat_complex_runtime AS
S.query,
S.is_plana,
S.node_group
- FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T
+ FROM pg_database D, pg_catalog.pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, pg_catalog.gs_wlm_session_respool(0) AS T
WHERE S.datid = D.oid AND
S.usesysid = U.oid AND
T.threadid = S.threadid;
@@ -1090,9 +1094,9 @@ CREATE VIEW dbe_perf.statio_all_indexes AS
N.nspname AS schemaname,
C.relname AS relname,
I.relname AS indexrelname,
- pg_stat_get_blocks_fetched(I.oid) -
- pg_stat_get_blocks_hit(I.oid) AS idx_blks_read,
- pg_stat_get_blocks_hit(I.oid) AS idx_blks_hit
+ pg_catalog.pg_stat_get_blocks_fetched(I.oid) -
+ pg_catalog.pg_stat_get_blocks_hit(I.oid) AS idx_blks_read,
+ pg_catalog.pg_stat_get_blocks_hit(I.oid) AS idx_blks_hit
FROM pg_class C JOIN
pg_index X ON C.oid = X.indrelid JOIN
pg_class I ON I.oid = X.indexrelid
@@ -1203,7 +1207,7 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_all_indexes AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
- SUM(Ti.idx_blks_read) idx_blks_read, SUM(Ti.idx_blks_hit) idx_blks_hit
+ pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit
FROM dbe_perf.get_summary_statio_all_indexes() as Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
@@ -1214,9 +1218,9 @@ CREATE VIEW dbe_perf.statio_all_sequences AS
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
- pg_stat_get_blocks_fetched(C.oid) -
- pg_stat_get_blocks_hit(C.oid) AS blks_read,
- pg_stat_get_blocks_hit(C.oid) AS blks_hit
+ pg_catalog.pg_stat_get_blocks_fetched(C.oid) -
+ pg_catalog.pg_stat_get_blocks_hit(C.oid) AS blks_read,
+ pg_catalog.pg_stat_get_blocks_hit(C.oid) AS blks_hit
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind = 'S' or C.relkind = 'L';
@@ -1255,7 +1259,7 @@ CREATE VIEW dbe_perf.global_statio_all_sequences AS
CREATE VIEW dbe_perf.summary_statio_all_sequences AS
SELECT schemaname, relname,
- SUM(blks_read) blks_read, SUM(blks_hit) blks_hit
+ pg_catalog.SUM(blks_read) blks_read, pg_catalog.SUM(blks_hit) blks_hit
FROM dbe_perf.get_global_statio_all_sequences()
GROUP BY (schemaname, relname);
@@ -1264,18 +1268,18 @@ CREATE VIEW dbe_perf.statio_all_tables AS
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
- pg_stat_get_blocks_fetched(C.oid) -
- pg_stat_get_blocks_hit(C.oid) AS heap_blks_read,
- pg_stat_get_blocks_hit(C.oid) AS heap_blks_hit,
- sum(pg_stat_get_blocks_fetched(I.indexrelid) -
- pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_read,
- sum(pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_hit,
- pg_stat_get_blocks_fetched(T.oid) -
- pg_stat_get_blocks_hit(T.oid) AS toast_blks_read,
- pg_stat_get_blocks_hit(T.oid) AS toast_blks_hit,
- pg_stat_get_blocks_fetched(X.oid) -
- pg_stat_get_blocks_hit(X.oid) AS tidx_blks_read,
- pg_stat_get_blocks_hit(X.oid) AS tidx_blks_hit
+ pg_catalog.pg_stat_get_blocks_fetched(C.oid) -
+ pg_catalog.pg_stat_get_blocks_hit(C.oid) AS heap_blks_read,
+ pg_catalog.pg_stat_get_blocks_hit(C.oid) AS heap_blks_hit,
+ pg_catalog.sum(pg_catalog.pg_stat_get_blocks_fetched(I.indexrelid) -
+ pg_catalog.pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_read,
+ pg_catalog.sum(pg_catalog.pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_hit,
+ pg_catalog.pg_stat_get_blocks_fetched(T.oid) -
+ pg_catalog.pg_stat_get_blocks_hit(T.oid) AS toast_blks_read,
+ pg_catalog.pg_stat_get_blocks_hit(T.oid) AS toast_blks_hit,
+ pg_catalog.pg_stat_get_blocks_fetched(X.oid) -
+ pg_catalog.pg_stat_get_blocks_hit(X.oid) AS tidx_blks_read,
+ pg_catalog.pg_stat_get_blocks_hit(X.oid) AS tidx_blks_hit
FROM pg_class C LEFT JOIN
pg_index I ON C.oid = I.indrelid LEFT JOIN
pg_class T ON C.reltoastrelid = T.oid LEFT JOIN
@@ -1399,10 +1403,10 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_all_tables AS
SELECT Ti.schemaname as schemaname, COALESCE(Ti.relname, Tn.toastname) as relname,
- SUM(Ti.heap_blks_read) heap_blks_read, SUM(Ti.heap_blks_hit) heap_blks_hit,
- SUM(Ti.idx_blks_read) idx_blks_read, SUM(Ti.idx_blks_hit) idx_blks_hit,
- SUM(Ti.toast_blks_read) toast_blks_read, SUM(Ti.toast_blks_hit) toast_blks_hit,
- SUM(Ti.tidx_blks_read) tidx_blks_read, SUM(Ti.tidx_blks_hit) tidx_blks_hit
+ pg_catalog.SUM(Ti.heap_blks_read) heap_blks_read, pg_catalog.SUM(Ti.heap_blks_hit) heap_blks_hit,
+ pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit,
+ pg_catalog.SUM(Ti.toast_blks_read) toast_blks_read, pg_catalog.SUM(Ti.toast_blks_hit) toast_blks_hit,
+ pg_catalog.SUM(Ti.tidx_blks_read) tidx_blks_read, pg_catalog.SUM(Ti.tidx_blks_hit) tidx_blks_hit
FROM dbe_perf.get_summary_statio_all_tables() Ti left join dbe_perf.get_local_toast_relation() Tn on Tn.shemaname = Ti.toastrelschemaname and Tn.relname = Ti.toastrelname
GROUP BY (1, 2);
@@ -1494,7 +1498,7 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_sys_indexes AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
- SUM(Ti.idx_blks_read) idx_blks_read, SUM(Ti.idx_blks_hit) idx_blks_hit
+ pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit
FROM dbe_perf.get_summary_statio_sys_indexes() AS Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
@@ -1539,7 +1543,7 @@ CREATE VIEW dbe_perf.global_statio_sys_sequences AS
CREATE VIEW dbe_perf.summary_statio_sys_sequences AS
SELECT schemaname, relname,
- SUM(blks_read) blks_read, SUM(blks_hit) blks_hit
+ pg_catalog.SUM(blks_read) blks_read, pg_catalog.SUM(blks_hit) blks_hit
FROM dbe_perf.get_global_statio_sys_sequences()
GROUP BY (schemaname, relname);
@@ -1649,10 +1653,10 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_sys_tables AS
SELECT
Ti.schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) as relname,
- SUM(Ti.heap_blks_read) heap_blks_read, SUM(Ti.heap_blks_hit) heap_blks_hit,
- SUM(Ti.idx_blks_read) idx_blks_read, SUM(Ti.idx_blks_hit) idx_blks_hit,
- SUM(Ti.toast_blks_read) toast_blks_read, SUM(Ti.toast_blks_hit) toast_blks_hit,
- SUM(Ti.tidx_blks_read) tidx_blks_read, SUM(Ti.tidx_blks_hit) tidx_blks_hit
+ pg_catalog.SUM(Ti.heap_blks_read) heap_blks_read, pg_catalog.SUM(Ti.heap_blks_hit) heap_blks_hit,
+ pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit,
+ pg_catalog.SUM(Ti.toast_blks_read) toast_blks_read, pg_catalog.SUM(Ti.toast_blks_hit) toast_blks_hit,
+ pg_catalog.SUM(Ti.tidx_blks_read) tidx_blks_read, pg_catalog.SUM(Ti.tidx_blks_hit) tidx_blks_hit
FROM dbe_perf.get_summary_statio_sys_tables() as Ti
LEFT JOIN dbe_perf.get_local_toast_relation() Tn
ON Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname
@@ -1747,7 +1751,7 @@ CREATE VIEW dbe_perf.summary_statio_user_indexes AS
SELECT
Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
- SUM(Ti.idx_blks_read) idx_blks_read, SUM(Ti.idx_blks_hit) idx_blks_hit
+ pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit
FROM dbe_perf.get_summary_statio_user_indexes() AS Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
@@ -1792,7 +1796,7 @@ CREATE VIEW dbe_perf.global_statio_user_sequences AS
CREATE VIEW dbe_perf.summary_statio_user_sequences AS
SELECT schemaname, relname,
- SUM(blks_read) blks_read, SUM(blks_hit) blks_hit
+ pg_catalog.SUM(blks_read) blks_read, pg_catalog.SUM(blks_hit) blks_hit
FROM dbe_perf.get_global_statio_user_sequences()
GROUP BY (schemaname, relname);
@@ -1901,10 +1905,10 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_user_tables AS
SELECT Ti.schemaname as schemaname, COALESCE(Ti.relname, Tn.toastname) as relname,
- SUM(Ti.heap_blks_read) heap_blks_read, SUM(Ti.heap_blks_hit) heap_blks_hit,
- SUM(Ti.idx_blks_read) idx_blks_read, SUM(Ti.idx_blks_hit) idx_blks_hit,
- SUM(Ti.toast_blks_read) toast_blks_read, SUM(Ti.toast_blks_hit) toast_blks_hit,
- SUM(Ti.tidx_blks_read) tidx_blks_read, SUM(Ti.tidx_blks_hit) tidx_blks_hit
+ pg_catalog.SUM(Ti.heap_blks_read) heap_blks_read, pg_catalog.SUM(Ti.heap_blks_hit) heap_blks_hit,
+ pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit,
+ pg_catalog.SUM(Ti.toast_blks_read) toast_blks_read, pg_catalog.SUM(Ti.toast_blks_hit) toast_blks_hit,
+ pg_catalog.SUM(Ti.tidx_blks_read) tidx_blks_read, pg_catalog.SUM(Ti.tidx_blks_hit) tidx_blks_hit
FROM dbe_perf.get_summary_statio_user_tables() AS Ti LEFT JOIN dbe_perf.get_local_toast_relation() Tn
ON Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname
GROUP BY (1, 2);
@@ -1924,9 +1928,9 @@ DECLARE
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT D.datname AS datname,
- pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit,
- pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read,
- pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read
+ pg_catalog.pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit,
+ pg_catalog.pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read,
+ pg_catalog.pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read
FROM pg_database D;';
FOR each_node_out IN EXECUTE(query_str) LOOP
node_name1 := row_name.node_name;
@@ -1953,25 +1957,25 @@ CREATE VIEW dbe_perf.stat_all_tables AS
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
- pg_stat_get_numscans(C.oid) AS seq_scan,
- pg_stat_get_tuples_returned(C.oid) AS seq_tup_read,
- sum(pg_stat_get_numscans(I.indexrelid))::bigint AS idx_scan,
- sum(pg_stat_get_tuples_fetched(I.indexrelid))::bigint +
- pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch,
- pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins,
- pg_stat_get_tuples_updated(C.oid) AS n_tup_upd,
- pg_stat_get_tuples_deleted(C.oid) AS n_tup_del,
- pg_stat_get_tuples_hot_updated(C.oid) AS n_tup_hot_upd,
- pg_stat_get_live_tuples(C.oid) AS n_live_tup,
- pg_stat_get_dead_tuples(C.oid) AS n_dead_tup,
- pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
- pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
- pg_stat_get_last_analyze_time(C.oid) as last_analyze,
- pg_stat_get_last_autoanalyze_time(C.oid) as last_autoanalyze,
- pg_stat_get_vacuum_count(C.oid) AS vacuum_count,
- pg_stat_get_autovacuum_count(C.oid) AS autovacuum_count,
- pg_stat_get_analyze_count(C.oid) AS analyze_count,
- pg_stat_get_autoanalyze_count(C.oid) AS autoanalyze_count
+ pg_catalog.pg_stat_get_numscans(C.oid) AS seq_scan,
+ pg_catalog.pg_stat_get_tuples_returned(C.oid) AS seq_tup_read,
+ pg_catalog.sum(pg_catalog.pg_stat_get_numscans(I.indexrelid))::bigint AS idx_scan,
+ pg_catalog.sum(pg_catalog.pg_stat_get_tuples_fetched(I.indexrelid))::bigint +
+ pg_catalog.pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch,
+ pg_catalog.pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins,
+ pg_catalog.pg_stat_get_tuples_updated(C.oid) AS n_tup_upd,
+ pg_catalog.pg_stat_get_tuples_deleted(C.oid) AS n_tup_del,
+ pg_catalog.pg_stat_get_tuples_hot_updated(C.oid) AS n_tup_hot_upd,
+ pg_catalog.pg_stat_get_live_tuples(C.oid) AS n_live_tup,
+ pg_catalog.pg_stat_get_dead_tuples(C.oid) AS n_dead_tup,
+ pg_catalog.pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
+ pg_catalog.pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
+ pg_catalog.pg_stat_get_last_analyze_time(C.oid) as last_analyze,
+ pg_catalog.pg_stat_get_last_autoanalyze_time(C.oid) as last_autoanalyze,
+ pg_catalog.pg_stat_get_vacuum_count(C.oid) AS vacuum_count,
+ pg_catalog.pg_stat_get_autovacuum_count(C.oid) AS autovacuum_count,
+ pg_catalog.pg_stat_get_analyze_count(C.oid) AS analyze_count,
+ pg_catalog.pg_stat_get_autoanalyze_count(C.oid) AS autoanalyze_count
FROM pg_class C LEFT JOIN
pg_index I ON C.oid = I.indrelid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
@@ -2112,15 +2116,15 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_all_tables AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) as relname,
- SUM(Ti.seq_scan) seq_scan, SUM(Ti.seq_tup_read) seq_tup_read,
- SUM(Ti.idx_scan) idx_scan, SUM(Ti.idx_tup_fetch) idx_tup_fetch,
- SUM(Ti.n_tup_ins) n_tup_ins, SUM(Ti.n_tup_upd) n_tup_upd,
- SUM(Ti.n_tup_del) n_tup_del, SUM(Ti.n_tup_hot_upd) n_tup_hot_upd,
- SUM(Ti.n_live_tup) n_live_tup, SUM(Ti.n_dead_tup) n_dead_tup,
- MAX(Ti.last_vacuum) last_vacuum, MAX(Ti.last_autovacuum) last_autovacuum,
- MAX(Ti.last_analyze) last_analyze, MAX(Ti.last_autoanalyze) last_autoanalyze,
- SUM(Ti.vacuum_count) vacuum_count, SUM(Ti.autovacuum_count) autovacuum_count,
- SUM(Ti.analyze_count) analyze_count, SUM(Ti.autoanalyze_count) autoanalyze_count
+ pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read,
+ pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch,
+ pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
+ pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd,
+ pg_catalog.SUM(Ti.n_live_tup) n_live_tup, pg_catalog.SUM(Ti.n_dead_tup) n_dead_tup,
+ pg_catalog.MAX(Ti.last_vacuum) last_vacuum, pg_catalog.MAX(Ti.last_autovacuum) last_autovacuum,
+ pg_catalog.MAX(Ti.last_analyze) last_analyze, pg_catalog.MAX(Ti.last_autoanalyze) last_autoanalyze,
+ pg_catalog.SUM(Ti.vacuum_count) vacuum_count, pg_catalog.SUM(Ti.autovacuum_count) autovacuum_count,
+ pg_catalog.SUM(Ti.analyze_count) analyze_count, pg_catalog.SUM(Ti.autoanalyze_count) autoanalyze_count
FROM (SELECT * FROM dbe_perf.get_summary_stat_all_tables()) AS Ti
LEFT JOIN dbe_perf.get_local_toast_relation() Tn
ON Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname
@@ -2133,9 +2137,9 @@ CREATE VIEW dbe_perf.stat_all_indexes AS
N.nspname AS schemaname,
C.relname AS relname,
I.relname AS indexrelname,
- pg_stat_get_numscans(I.oid) AS idx_scan,
- pg_stat_get_tuples_returned(I.oid) AS idx_tup_read,
- pg_stat_get_tuples_fetched(I.oid) AS idx_tup_fetch
+ pg_catalog.pg_stat_get_numscans(I.oid) AS idx_scan,
+ pg_catalog.pg_stat_get_tuples_returned(I.oid) AS idx_tup_read,
+ pg_catalog.pg_stat_get_tuples_fetched(I.oid) AS idx_tup_fetch
FROM pg_class C JOIN
pg_index X ON C.oid = X.indrelid JOIN
pg_class I ON I.oid = X.indexrelid
@@ -2229,7 +2233,7 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_all_indexes AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
- SUM(Ti.idx_scan) idx_scan, SUM(Ti.idx_tup_read) idx_tup_read, SUM(Ti.idx_tup_fetch) idx_tup_fetch
+ pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_read) idx_tup_read, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch
FROM dbe_perf.get_summary_stat_all_indexes() AS Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
@@ -2375,15 +2379,15 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_sys_tables AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) AS relname,
- SUM(Ti.seq_scan) seq_scan, SUM(Ti.seq_tup_read) seq_tup_read,
- SUM(Ti.idx_scan) idx_scan, SUM(Ti.idx_tup_fetch) idx_tup_fetch,
- SUM(Ti.n_tup_ins) n_tup_ins, SUM(Ti.n_tup_upd) n_tup_upd,
- SUM(Ti.n_tup_del) n_tup_del, SUM(Ti.n_tup_hot_upd) n_tup_hot_upd,
- SUM(Ti.n_live_tup) n_live_tup, SUM(Ti.n_dead_tup) n_dead_tup,
- MAX(Ti.last_vacuum) last_vacuum, MAX(Ti.last_autovacuum) last_autovacuum,
- MAX(Ti.last_analyze) last_analyze, MAX(Ti.last_autoanalyze) last_autoanalyze,
- SUM(Ti.vacuum_count) vacuum_count, SUM(Ti.autovacuum_count) autovacuum_count,
- SUM(Ti.analyze_count) analyze_count, SUM(Ti.autoanalyze_count) autoanalyze_count
+ pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read,
+ pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch,
+ pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
+ pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd,
+ pg_catalog.SUM(Ti.n_live_tup) n_live_tup, pg_catalog.SUM(Ti.n_dead_tup) n_dead_tup,
+ pg_catalog.MAX(Ti.last_vacuum) last_vacuum, pg_catalog.MAX(Ti.last_autovacuum) last_autovacuum,
+ pg_catalog.MAX(Ti.last_analyze) last_analyze, pg_catalog.MAX(Ti.last_autoanalyze) last_autoanalyze,
+ pg_catalog.SUM(Ti.vacuum_count) vacuum_count, pg_catalog.SUM(Ti.autovacuum_count) autovacuum_count,
+ pg_catalog.SUM(Ti.analyze_count) analyze_count, pg_catalog.SUM(Ti.autoanalyze_count) autoanalyze_count
FROM dbe_perf.get_summary_stat_sys_tables() as Ti LEFT JOIN dbe_perf.get_local_toast_relation() as Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2);
@@ -2480,7 +2484,7 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_sys_indexes AS
SELECT Ti.schemaname AS schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
- SUM(Ti.idx_scan) idx_scan, SUM(Ti.idx_tup_read) idx_tup_read, SUM(Ti.idx_tup_fetch) idx_tup_fetch
+ pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_read) idx_tup_read, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch
FROM dbe_perf.get_summary_stat_sys_indexes() AS Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
@@ -2626,15 +2630,15 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_user_tables AS
SELECT Ti.schemaname AS schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) AS relname,
- SUM(Ti.seq_scan) seq_scan, SUM(Ti.seq_tup_read) seq_tup_read,
- SUM(Ti.idx_scan) idx_scan, SUM(Ti.idx_tup_fetch) idx_tup_fetch,
- SUM(Ti.n_tup_ins) n_tup_ins, SUM(Ti.n_tup_upd) n_tup_upd,
- SUM(Ti.n_tup_del) n_tup_del, SUM(Ti.n_tup_hot_upd) n_tup_hot_upd,
- SUM(Ti.n_live_tup) n_live_tup, SUM(Ti.n_dead_tup) n_dead_tup,
- MAX(Ti.last_vacuum) last_vacuum, MAX(Ti.last_autovacuum) last_autovacuum,
- MAX(Ti.last_analyze) last_analyze, MAX(Ti.last_autoanalyze) last_autoanalyze,
- SUM(Ti.vacuum_count) vacuum_count, SUM(Ti.autovacuum_count) autovacuum_count,
- SUM(Ti.analyze_count) analyze_count, SUM(Ti.autoanalyze_count) autoanalyze_count
+ pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read,
+ pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch,
+ pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
+ pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd,
+ pg_catalog.SUM(Ti.n_live_tup) n_live_tup, pg_catalog.SUM(Ti.n_dead_tup) n_dead_tup,
+ pg_catalog.MAX(Ti.last_vacuum) last_vacuum, pg_catalog.MAX(Ti.last_autovacuum) last_autovacuum,
+ pg_catalog.MAX(Ti.last_analyze) last_analyze, pg_catalog.MAX(Ti.last_autoanalyze) last_autoanalyze,
+ pg_catalog.SUM(Ti.vacuum_count) vacuum_count, pg_catalog.SUM(Ti.autovacuum_count) autovacuum_count,
+ pg_catalog.SUM(Ti.analyze_count) analyze_count, pg_catalog.SUM(Ti.autoanalyze_count) autoanalyze_count
FROM dbe_perf.get_summary_stat_user_tables() AS Ti LEFT JOIN dbe_perf.get_local_toast_relation() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2);
@@ -2731,7 +2735,7 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_user_indexes AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
- SUM(Ti.idx_scan) idx_scan, SUM(Ti.idx_tup_read) idx_tup_read, SUM(Ti.idx_tup_fetch) idx_tup_fetch
+ pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_read) idx_tup_read, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch
FROM dbe_perf.get_summary_stat_user_indexes() as Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
@@ -2741,24 +2745,24 @@ CREATE VIEW dbe_perf.stat_database AS
SELECT
D.oid AS datid,
D.datname AS datname,
- pg_stat_get_db_numbackends(D.oid) AS numbackends,
- pg_stat_get_db_xact_commit(D.oid) AS xact_commit,
- pg_stat_get_db_xact_rollback(D.oid) AS xact_rollback,
- pg_stat_get_db_blocks_fetched(D.oid) -
- pg_stat_get_db_blocks_hit(D.oid) AS blks_read,
- pg_stat_get_db_blocks_hit(D.oid) AS blks_hit,
- pg_stat_get_db_tuples_returned(D.oid) AS tup_returned,
- pg_stat_get_db_tuples_fetched(D.oid) AS tup_fetched,
- pg_stat_get_db_tuples_inserted(D.oid) AS tup_inserted,
- pg_stat_get_db_tuples_updated(D.oid) AS tup_updated,
- pg_stat_get_db_tuples_deleted(D.oid) AS tup_deleted,
- pg_stat_get_db_conflict_all(D.oid) AS conflicts,
- pg_stat_get_db_temp_files(D.oid) AS temp_files,
- pg_stat_get_db_temp_bytes(D.oid) AS temp_bytes,
- pg_stat_get_db_deadlocks(D.oid) AS deadlocks,
- pg_stat_get_db_blk_read_time(D.oid) AS blk_read_time,
- pg_stat_get_db_blk_write_time(D.oid) AS blk_write_time,
- pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset
+ pg_catalog.pg_stat_get_db_numbackends(D.oid) AS numbackends,
+ pg_catalog.pg_stat_get_db_xact_commit(D.oid) AS xact_commit,
+ pg_catalog.pg_stat_get_db_xact_rollback(D.oid) AS xact_rollback,
+ pg_catalog.pg_stat_get_db_blocks_fetched(D.oid) -
+ pg_catalog.pg_stat_get_db_blocks_hit(D.oid) AS blks_read,
+ pg_catalog.pg_stat_get_db_blocks_hit(D.oid) AS blks_hit,
+ pg_catalog.pg_stat_get_db_tuples_returned(D.oid) AS tup_returned,
+ pg_catalog.pg_stat_get_db_tuples_fetched(D.oid) AS tup_fetched,
+ pg_catalog.pg_stat_get_db_tuples_inserted(D.oid) AS tup_inserted,
+ pg_catalog.pg_stat_get_db_tuples_updated(D.oid) AS tup_updated,
+ pg_catalog.pg_stat_get_db_tuples_deleted(D.oid) AS tup_deleted,
+ pg_catalog.pg_stat_get_db_conflict_all(D.oid) AS conflicts,
+ pg_catalog.pg_stat_get_db_temp_files(D.oid) AS temp_files,
+ pg_catalog.pg_stat_get_db_temp_bytes(D.oid) AS temp_bytes,
+ pg_catalog.pg_stat_get_db_deadlocks(D.oid) AS deadlocks,
+ pg_catalog.pg_stat_get_db_blk_read_time(D.oid) AS blk_read_time,
+ pg_catalog.pg_stat_get_db_blk_write_time(D.oid) AS blk_write_time,
+ pg_catalog.pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset
FROM pg_database D;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_database
@@ -2820,11 +2824,11 @@ CREATE VIEW dbe_perf.summary_stat_database AS
FROM
dbe_perf.stat_database AS SUMMARY_ITEM,
(SELECT datname,
- SUM(numbackends) numbackends, SUM(xact_commit) xact_commit, SUM(xact_rollback) xact_rollback,
- SUM(blks_read) blks_read, SUM(blks_hit) blks_hit, SUM(tup_returned) tup_returned,
- SUM(tup_fetched) tup_fetched, SUM(temp_files) temp_files,
- SUM(temp_bytes) temp_bytes, SUM(blk_read_time) blk_read_time,
- SUM(blk_write_time) blk_write_time, MAX(stats_reset) stats_reset
+ pg_catalog.SUM(numbackends) numbackends, pg_catalog.SUM(xact_commit) xact_commit, pg_catalog.SUM(xact_rollback) xact_rollback,
+ pg_catalog.SUM(blks_read) blks_read, pg_catalog.SUM(blks_hit) blks_hit, pg_catalog.SUM(tup_returned) tup_returned,
+ pg_catalog.SUM(tup_fetched) tup_fetched, pg_catalog.SUM(temp_files) temp_files,
+ pg_catalog.SUM(temp_bytes) temp_bytes, pg_catalog.SUM(blk_read_time) blk_read_time,
+ pg_catalog.SUM(blk_write_time) blk_write_time, pg_catalog.MAX(stats_reset) stats_reset
FROM dbe_perf.get_global_stat_database() GROUP BY (datname)) AS ALL_NODES
WHERE ALL_NODES.datname = SUMMARY_ITEM.datname;
@@ -2832,11 +2836,11 @@ CREATE VIEW dbe_perf.stat_database_conflicts AS
SELECT
D.oid AS datid,
D.datname AS datname,
- pg_stat_get_db_conflict_tablespace(D.oid) AS confl_tablespace,
- pg_stat_get_db_conflict_lock(D.oid) AS confl_lock,
- pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot,
- pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin,
- pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock
+ pg_catalog.pg_stat_get_db_conflict_tablespace(D.oid) AS confl_tablespace,
+ pg_catalog.pg_stat_get_db_conflict_lock(D.oid) AS confl_lock,
+ pg_catalog.pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot,
+ pg_catalog.pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin,
+ pg_catalog.pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock
FROM pg_database D;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_database_conflicts
@@ -2876,11 +2880,11 @@ CREATE VIEW dbe_perf.global_stat_database_conflicts AS
CREATE VIEW dbe_perf.summary_stat_database_conflicts AS
SELECT
D.datname AS datname,
- pg_stat_get_db_conflict_tablespace(D.oid) AS confl_tablespace,
- pg_stat_get_db_conflict_lock(D.oid) AS confl_lock,
- pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot,
- pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin,
- pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock
+ pg_catalog.pg_stat_get_db_conflict_tablespace(D.oid) AS confl_tablespace,
+ pg_catalog.pg_stat_get_db_conflict_lock(D.oid) AS confl_lock,
+ pg_catalog.pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot,
+ pg_catalog.pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin,
+ pg_catalog.pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock
FROM pg_database D;
CREATE VIEW dbe_perf.stat_xact_all_tables AS
@@ -2888,15 +2892,15 @@ CREATE VIEW dbe_perf.stat_xact_all_tables AS
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
- pg_stat_get_xact_numscans(C.oid) AS seq_scan,
- pg_stat_get_xact_tuples_returned(C.oid) AS seq_tup_read,
- sum(pg_stat_get_xact_numscans(I.indexrelid))::bigint AS idx_scan,
- sum(pg_stat_get_xact_tuples_fetched(I.indexrelid))::bigint +
- pg_stat_get_xact_tuples_fetched(C.oid) AS idx_tup_fetch,
- pg_stat_get_xact_tuples_inserted(C.oid) AS n_tup_ins,
- pg_stat_get_xact_tuples_updated(C.oid) AS n_tup_upd,
- pg_stat_get_xact_tuples_deleted(C.oid) AS n_tup_del,
- pg_stat_get_xact_tuples_hot_updated(C.oid) AS n_tup_hot_upd
+ pg_catalog.pg_stat_get_xact_numscans(C.oid) AS seq_scan,
+ pg_catalog.pg_stat_get_xact_tuples_returned(C.oid) AS seq_tup_read,
+ pg_catalog.sum(pg_catalog.pg_stat_get_xact_numscans(I.indexrelid))::bigint AS idx_scan,
+ pg_catalog.sum(pg_catalog.pg_stat_get_xact_tuples_fetched(I.indexrelid))::bigint +
+ pg_catalog.pg_stat_get_xact_tuples_fetched(C.oid) AS idx_tup_fetch,
+ pg_catalog.pg_stat_get_xact_tuples_inserted(C.oid) AS n_tup_ins,
+ pg_catalog.pg_stat_get_xact_tuples_updated(C.oid) AS n_tup_upd,
+ pg_catalog.pg_stat_get_xact_tuples_deleted(C.oid) AS n_tup_del,
+ pg_catalog.pg_stat_get_xact_tuples_hot_updated(C.oid) AS n_tup_hot_upd
FROM pg_class C LEFT JOIN
pg_index I ON C.oid = I.indrelid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
@@ -3021,9 +3025,9 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_xact_all_tables AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) AS relname,
- SUM(Ti.seq_scan) seq_scan, SUM(Ti.seq_tup_read) seq_tup_read, SUM(Ti.idx_scan) idx_scan,
- SUM(Ti.idx_tup_fetch) idx_tup_fetch, SUM(Ti.n_tup_ins) n_tup_ins, SUM(Ti.n_tup_upd) n_tup_upd,
- SUM(Ti.n_tup_del) n_tup_del, SUM(Ti.n_tup_hot_upd) n_tup_hot_upd
+ pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read, pg_catalog.SUM(Ti.idx_scan) idx_scan,
+ pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch, pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
+ pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd
FROM dbe_perf.get_summary_stat_xact_all_tables() as Ti LEFT JOIN dbe_perf.get_local_toast_relation() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2);
@@ -3132,9 +3136,9 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_xact_sys_tables AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
- SUM(Ti.seq_scan) seq_scan, SUM(Ti.seq_tup_read) seq_tup_read, SUM(Ti.idx_scan) idx_scan,
- SUM(Ti.idx_tup_fetch) idx_tup_fetch, SUM(Ti.n_tup_ins) n_tup_ins, SUM(Ti.n_tup_upd) n_tup_upd,
- SUM(Ti.n_tup_del) n_tup_del, SUM(Ti.n_tup_hot_upd) n_tup_hot_upd
+ pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read, pg_catalog.SUM(Ti.idx_scan) idx_scan,
+ pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch, pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
+ pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd
FROM dbe_perf.get_summary_stat_xact_sys_tables() as Ti LEFT JOIN dbe_perf.get_local_toast_relation() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2);
@@ -3243,9 +3247,9 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_xact_user_tables AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
- SUM(Ti.seq_scan) seq_scan, SUM(Ti.seq_tup_read) seq_tup_read, SUM(Ti.idx_scan) idx_scan,
- SUM(Ti.idx_tup_fetch) idx_tup_fetch, SUM(Ti.n_tup_ins) n_tup_ins, SUM(Ti.n_tup_upd) n_tup_upd,
- SUM(Ti.n_tup_del) n_tup_del, SUM(Ti.n_tup_hot_upd) n_tup_hot_upd
+ pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read, pg_catalog.SUM(Ti.idx_scan) idx_scan,
+ pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch, pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
+ pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd
FROM dbe_perf.get_summary_stat_xact_user_tables() AS Ti LEFT JOIN dbe_perf.get_local_toast_relation() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2);
@@ -3255,9 +3259,9 @@ CREATE VIEW dbe_perf.stat_user_functions AS
P.oid AS funcid,
N.nspname AS schemaname,
P.proname AS funcname,
- pg_stat_get_function_calls(P.oid) AS calls,
- pg_stat_get_function_total_time(P.oid) AS total_time,
- pg_stat_get_function_self_time(P.oid) AS self_time
+ pg_catalog.pg_stat_get_function_calls(P.oid) AS calls,
+ pg_catalog.pg_stat_get_function_total_time(P.oid) AS total_time,
+ pg_catalog.pg_stat_get_function_self_time(P.oid) AS self_time
FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace)
WHERE P.prolang != 12 -- fast check to eliminate built-in functions
AND pg_stat_get_function_calls(P.oid) IS NOT NULL;
@@ -3297,7 +3301,7 @@ CREATE VIEW dbe_perf.global_stat_user_functions AS
CREATE VIEW dbe_perf.summary_stat_user_functions AS
SELECT schemaname, funcname,
- SUM(calls) calls, SUM(total_time) total_time, SUM(self_time) self_time
+ pg_catalog.SUM(calls) calls, pg_catalog.SUM(total_time) total_time, pg_catalog.SUM(self_time) self_time
FROM dbe_perf.get_global_stat_user_functions()
GROUP BY (schemaname, funcname);
@@ -3306,12 +3310,12 @@ CREATE VIEW dbe_perf.stat_xact_user_functions AS
P.oid AS funcid,
N.nspname AS schemaname,
P.proname AS funcname,
- pg_stat_get_xact_function_calls(P.oid) AS calls,
- pg_stat_get_xact_function_total_time(P.oid) AS total_time,
- pg_stat_get_xact_function_self_time(P.oid) AS self_time
+ pg_catalog.pg_stat_get_xact_function_calls(P.oid) AS calls,
+ pg_catalog.pg_stat_get_xact_function_total_time(P.oid) AS total_time,
+ pg_catalog.pg_stat_get_xact_function_self_time(P.oid) AS self_time
FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace)
WHERE P.prolang != 12 -- fast check to eliminate built-in functions
- AND pg_stat_get_xact_function_calls(P.oid) IS NOT NULL;
+ AND pg_catalog.pg_stat_get_xact_function_calls(P.oid) IS NOT NULL;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_user_functions
(OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint,
@@ -3348,7 +3352,7 @@ CREATE VIEW dbe_perf.global_stat_xact_user_functions AS
CREATE VIEW dbe_perf.summary_stat_xact_user_functions AS
SELECT schemaname, funcname,
- SUM(calls) calls, SUM(total_time) total_time, SUM(self_time) self_time
+ pg_catalog.SUM(calls) calls, pg_catalog.SUM(total_time) total_time, pg_catalog.SUM(self_time) self_time
FROM dbe_perf.get_global_stat_xact_user_functions()
GROUP BY (schemaname, funcname);
@@ -3390,8 +3394,8 @@ CREATE VIEW dbe_perf.global_stat_bad_block AS
CREATE VIEW dbe_perf.summary_stat_bad_block AS
SELECT databaseid, tablespaceid, relfilenode,
- SUM(forknum) forknum, SUM(error_count) error_count,
- MIN(first_time) first_time, MAX(last_time) last_time
+ pg_catalog.SUM(forknum) forknum, pg_catalog.SUM(error_count) error_count,
+ pg_catalog.MIN(first_time) first_time, pg_catalog.MAX(last_time) last_time
FROM dbe_perf.get_global_stat_bad_block()
GROUP BY (databaseid, tablespaceid, relfilenode);
@@ -3435,13 +3439,13 @@ CREATE VIEW dbe_perf.global_file_redo_iostat AS
CREATE VIEW dbe_perf.summary_file_redo_iostat AS
SELECT
- sum(phywrts) AS phywrts,
- sum(phyblkwrt) AS phyblkwrt,
- sum(writetim) AS writetim,
- ((sum(writetim) / greatest(sum(phywrts), 1))::bigint) AS avgiotim,
- max(lstiotim) AS lstiotim,
- min(miniotim) AS miniotim,
- max(maxiowtm) AS maxiowtm
+ pg_catalog.sum(phywrts) AS phywrts,
+ pg_catalog.sum(phyblkwrt) AS phyblkwrt,
+ pg_catalog.sum(writetim) AS writetim,
+ ((pg_catalog.sum(writetim) / greatest(pg_catalog.sum(phywrts), 1))::bigint) AS avgiotim,
+ pg_catalog.max(lstiotim) AS lstiotim,
+ pg_catalog.min(miniotim) AS miniotim,
+ pg_catalog.max(maxiowtm) AS maxiowtm
FROM dbe_perf.get_global_file_redo_iostat();
CREATE VIEW dbe_perf.local_rel_iostat AS
@@ -3480,8 +3484,8 @@ CREATE VIEW dbe_perf.global_rel_iostat AS
CREATE VIEW dbe_perf.summary_rel_iostat AS
SELECT
- sum(phyrds) AS phyrds, sum(phywrts) AS phywrts, sum(phyblkrd) AS phyblkrd,
- sum(phyblkwrt) AS phyblkwrt
+ pg_catalog.sum(phyrds) AS phyrds, pg_catalog.sum(phywrts) AS phywrts, pg_catalog.sum(phyblkrd) AS phyblkrd,
+ pg_catalog.sum(phyblkwrt) AS phyblkwrt
FROM dbe_perf.get_global_rel_iostat();
@@ -3532,10 +3536,10 @@ CREATE VIEW dbe_perf.global_file_iostat AS
CREATE VIEW dbe_perf.summary_file_iostat AS
SELECT
filenum, dbid, spcid,
- sum(phyrds) AS phyrds, sum(phywrts) AS phywrts, sum(phyblkrd) AS phyblkrd,
- sum(phyblkwrt) AS phyblkwrt, sum(readtim) AS readtim, sum(writetim) AS writetim,
- ((sum(readtim + writetim) / greatest(sum(phyrds + phywrts), 1))::bigint) AS avgiotim,
- max(lstiotim) AS lstiotim, min(miniotim) AS miniotim, max(maxiowtm) AS maxiowtm
+ pg_catalog.sum(phyrds) AS phyrds, pg_catalog.sum(phywrts) AS phywrts, pg_catalog.sum(phyblkrd) AS phyblkrd,
+ pg_catalog.sum(phyblkwrt) AS phyblkwrt, pg_catalog.sum(readtim) AS readtim, pg_catalog.sum(writetim) AS writetim,
+ ((pg_catalog.sum(readtim + writetim) / greatest(pg_catalog.sum(phyrds + phywrts), 1))::bigint) AS avgiotim,
+ pg_catalog.max(lstiotim) AS lstiotim, pg_catalog.min(miniotim) AS miniotim, pg_catalog.max(maxiowtm) AS maxiowtm
FROM dbe_perf.get_global_file_iostat()
GROUP by (filenum, dbid, spcid);
@@ -3740,7 +3744,7 @@ CREATE VIEW dbe_perf.replication_stat AS
W.receiver_replay_location,
W.sync_priority,
W.sync_state
- FROM pg_stat_get_activity(NULL) AS S, pg_authid U,
+ FROM pg_catalog.pg_stat_get_activity(NULL) AS S, pg_authid U,
pg_stat_get_wal_senders() AS W
WHERE S.usesysid = U.oid AND
S.pid = W.pid;
@@ -3988,7 +3992,8 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_full_sql_by_timestamp
OUT lwlock_time bigint,
OUT lwlock_wait_time bigint,
OUT details bytea,
- OUT is_slow_sql bool)
+ OUT is_slow_sql bool,
+ OUT trace_id text)
RETURNS setof record
AS $$
DECLARE
@@ -4055,6 +4060,7 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_full_sql_by_timestamp
lwlock_wait_time := row_data.lwlock_wait_time;
details := row_data.details;
is_slow_sql := row_data.is_slow_sql;
+ trace_id := row_data.trace_id;
return next;
END LOOP;
END LOOP;
@@ -4116,7 +4122,8 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_slow_sql_by_timestamp
OUT lwlock_time bigint,
OUT lwlock_wait_time bigint,
OUT details bytea,
- OUT is_slow_sql bool)
+ OUT is_slow_sql bool,
+ OUT trace_id text)
RETURNS setof record
AS $$
DECLARE
@@ -4183,6 +4190,7 @@ CREATE OR REPLACE FUNCTION DBE_PERF.get_global_slow_sql_by_timestamp
lwlock_wait_time := row_data.lwlock_wait_time;
details := row_data.details;
is_slow_sql := row_data.is_slow_sql;
+ trace_id := row_data.trace_id;
return next;
END LOOP;
END LOOP;
@@ -4250,22 +4258,22 @@ CREATE VIEW dbe_perf.global_statement_count AS
CREATE VIEW dbe_perf.summary_statement_count AS
SELECT
user_name,
- SUM(select_count) AS select_count, SUM(update_count) AS update_count,
- SUM(insert_count) AS insert_count, SUM(delete_count) AS delete_count,
- SUM(mergeinto_count) AS mergeinto_count, SUM(ddl_count) AS ddl_count,
- SUM(dml_count) AS dml_count, SUM(dcl_count) AS dcl_count,
- SUM(total_select_elapse) AS total_select_elapse,
- ((SUM(total_select_elapse) / greatest(SUM(select_count), 1))::bigint) AS avg_select_elapse,
- MAX(max_select_elapse) AS max_select_elapse, MIN(min_select_elapse) AS min_select_elapse,
- SUM(total_update_elapse) AS total_update_elapse,
- ((SUM(total_update_elapse) / greatest(SUM(update_count), 1))::bigint) AS avg_update_elapse,
- MAX(max_update_elapse) AS max_update_elapse, MIN(min_update_elapse) AS min_update_elapse,
- SUM(total_insert_elapse) AS total_insert_elapse,
- ((SUM(total_insert_elapse) / greatest(SUM(insert_count), 1))::bigint) AS avg_insert_elapse,
- MAX(max_insert_elapse) AS max_insert_elapse, MIN(min_insert_elapse) AS min_insert_elapse,
- SUM(total_delete_elapse) AS total_delete_elapse,
- ((SUM(total_delete_elapse) / greatest(SUM(delete_count), 1))::bigint) AS avg_delete_elapse,
- MAX(max_delete_elapse) AS max_delete_elapse, MIN(min_delete_elapse) AS min_delete_elapse
+ pg_catalog.SUM(select_count) AS select_count, pg_catalog.SUM(update_count) AS update_count,
+ pg_catalog.SUM(insert_count) AS insert_count, pg_catalog.SUM(delete_count) AS delete_count,
+ pg_catalog.SUM(mergeinto_count) AS mergeinto_count, pg_catalog.SUM(ddl_count) AS ddl_count,
+ pg_catalog.SUM(dml_count) AS dml_count, pg_catalog.SUM(dcl_count) AS dcl_count,
+ pg_catalog.SUM(total_select_elapse) AS total_select_elapse,
+ ((pg_catalog.SUM(total_select_elapse) / greatest(pg_catalog.SUM(select_count), 1))::bigint) AS avg_select_elapse,
+ pg_catalog.MAX(max_select_elapse) AS max_select_elapse, pg_catalog.MIN(min_select_elapse) AS min_select_elapse,
+ pg_catalog.SUM(total_update_elapse) AS total_update_elapse,
+ ((pg_catalog.SUM(total_update_elapse) / greatest(pg_catalog.SUM(update_count), 1))::bigint) AS avg_update_elapse,
+ pg_catalog.MAX(max_update_elapse) AS max_update_elapse, pg_catalog.MIN(min_update_elapse) AS min_update_elapse,
+ pg_catalog.SUM(total_insert_elapse) AS total_insert_elapse,
+ ((pg_catalog.SUM(total_insert_elapse) / greatest(pg_catalog.SUM(insert_count), 1))::bigint) AS avg_insert_elapse,
+ pg_catalog.MAX(max_insert_elapse) AS max_insert_elapse, pg_catalog.MIN(min_insert_elapse) AS min_insert_elapse,
+ pg_catalog.SUM(total_delete_elapse) AS total_delete_elapse,
+ ((pg_catalog.SUM(total_delete_elapse) / greatest(pg_catalog.SUM(delete_count), 1))::bigint) AS avg_delete_elapse,
+ pg_catalog.MAX(max_delete_elapse) AS max_delete_elapse, pg_catalog.MIN(min_delete_elapse) AS min_delete_elapse
FROM dbe_perf.get_global_statement_count() GROUP by (user_name);
/* configuration */
@@ -4331,7 +4339,7 @@ CREATE VIEW dbe_perf.global_config_settings AS
/* waits*/
CREATE VIEW dbe_perf.wait_events AS
- SELECT * FROM get_instr_wait_event(NULL);
+ SELECT * FROM pg_catalog.get_instr_wait_event(NULL);
CREATE OR REPLACE FUNCTION dbe_perf.get_global_wait_events()
RETURNS setof dbe_perf.wait_events
@@ -4368,7 +4376,7 @@ DECLARE
BEGIN
QUERY_STR_NODES := 'select * from dbe_perf.node_name';
FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP
- QUERY_STR := 'SELECT * FROM get_instr_rt_percentile(0)';
+ QUERY_STR := 'SELECT * FROM pg_catalog.get_instr_rt_percentile(0)';
FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP
p80 = ROW_DATA."P80";
p95 = ROW_DATA."P95";
@@ -4451,7 +4459,7 @@ CREATE VIEW dbe_perf.global_ckpt_status AS
CREATE OR REPLACE VIEW dbe_perf.global_double_write_status AS
SELECT node_name, curr_dwn, curr_start_page, file_trunc_num, file_reset_num,
total_writes, low_threshold_writes, high_threshold_writes,
- total_pages, low_threshold_pages, high_threshold_pages
+ total_pages, low_threshold_pages, high_threshold_pages, file_id
FROM pg_catalog.local_double_write_stat();
CREATE OR REPLACE VIEW DBE_PERF.global_single_flush_dw_status AS
@@ -4479,7 +4487,7 @@ SELECT node_name, rto_info
FROM pg_catalog.local_rto_stat();
CREATE OR REPLACE VIEW dbe_perf.global_streaming_hadr_rto_and_rpo_stat AS
-SELECT hadr_sender_node_name, hadr_receiver_node_name, current_rto, target_rto, current_rpo, target_rpo, current_sleep_time
+SELECT hadr_sender_node_name, hadr_receiver_node_name, current_rto, target_rto, current_rpo, target_rpo, rto_sleep_time, rpo_sleep_time
FROM pg_catalog.gs_hadr_local_rto_and_rpo_stat();
CREATE OR REPLACE VIEW dbe_perf.global_recovery_status AS
@@ -4574,7 +4582,7 @@ SELECT
S.pl_compilation_time,
S.net_send_time,
S.data_io_time
-FROM pg_stat_get_wlm_session_info(0) S where S.is_slow_query = 1;
+FROM pg_catalog.pg_stat_get_wlm_session_info(0) S where S.is_slow_query = 1;
CREATE OR REPLACE FUNCTION dbe_perf.global_slow_query_history
RETURNS setof dbe_perf.gs_slow_query_history
@@ -4667,17 +4675,17 @@ CREATE OR REPLACE VIEW DBE_PERF.local_active_session AS
tt(sampleid, sample_time, need_flush_sample, databaseid, thread_id, sessionid, start_time, event, lwtid, psessionid,
tlevel, smpid, userid, application_name, client_addr, client_hostname, client_port, query_id, unique_query_id,
user_id, cn_id, unique_query, locktag, lockmode, block_sessionid, wait_status, global_sessionid, final_block_sessionid, level, head)
- AS(SELECT las.*, las.block_sessionid AS final_block_sessionid, 1 AS level, array_append('{}', las.sessionid) AS head FROM las
+ AS(SELECT las.*, las.block_sessionid AS final_block_sessionid, 1 AS level, pg_catalog.array_append('{}', las.sessionid) AS head FROM las
UNION ALL
SELECT tt.sampleid, tt.sample_time, tt.need_flush_sample, tt.databaseid, tt.thread_id, tt.sessionid, tt.start_time, tt.event, tt.lwtid, tt.psessionid,
tt.tlevel, tt.smpid, tt.userid, tt.application_name, tt.client_addr, tt.client_hostname, tt.client_port, tt.query_id, tt.unique_query_id,
- tt.user_id, tt.cn_id, tt.unique_query, tt.locktag, tt.lockmode, tt.block_sessionid, tt.wait_status, tt.global_sessionid, las.block_sessionid AS final_block_sessionid, tt.level + 1 AS level, array_append(tt.head, las.sessionid) AS head
+ tt.user_id, tt.cn_id, tt.unique_query, tt.locktag, tt.lockmode, tt.block_sessionid, tt.wait_status, tt.global_sessionid, las.block_sessionid AS final_block_sessionid, tt.level + 1 AS level, pg_catalog.array_append(tt.head, las.sessionid) AS head
FROM tt INNER JOIN las ON tt.final_block_sessionid = las.sessionid
WHERE las.sampleid = tt.sampleid AND (las.block_sessionid IS NOT NULL OR las.block_sessionid != 0)
AND las.sessionid != all(head) AND las.sessionid != las.block_sessionid)
SELECT sampleid, sample_time, need_flush_sample, databaseid, thread_id, sessionid, start_time, event, lwtid, psessionid,
tlevel, smpid, userid, application_name, client_addr, client_hostname, client_port, query_id, unique_query_id,
user_id, cn_id, unique_query, locktag, lockmode, block_sessionid, final_block_sessionid, wait_status, global_sessionid FROM tt
- WHERE level = (SELECT MAX(level) FROM tt t1 WHERE t1.sampleid = tt.sampleid AND t1.sessionid = tt.sessionid);
+ WHERE level = (SELECT pg_catalog.MAX(level) FROM tt t1 WHERE t1.sampleid = tt.sampleid AND t1.sessionid = tt.sessionid);
grant select on all tables in schema dbe_perf to public;
diff --git a/src/common/backend/catalog/pg_builtin_proc.cpp b/src/common/backend/catalog/pg_builtin_proc.cpp
index 8bbce7618..c7b525d28 100755
--- a/src/common/backend/catalog/pg_builtin_proc.cpp
+++ b/src/common/backend/catalog/pg_builtin_proc.cpp
@@ -28,6 +28,7 @@
#include "catalog/pg_namespace.h"
#include "catalog/pg_proc.h"
#include "db4ai/predict_by.h"
+#include "db4ai/explain_model.h"
#include "access/transam.h"
#include "storage/smgr/segment.h"
#include "utils/fmgroids.h"
diff --git a/src/common/backend/catalog/pg_conversion.cpp b/src/common/backend/catalog/pg_conversion.cpp
index 568cadaf1..dba951ed2 100644
--- a/src/common/backend/catalog/pg_conversion.cpp
+++ b/src/common/backend/catalog/pg_conversion.cpp
@@ -182,7 +182,7 @@ Oid FindDefaultConversion(Oid name_space, int32 for_encoding, int32 to_encoding)
CONDEFAULT, ObjectIdGetDatum(name_space), Int32GetDatum(for_encoding), Int32GetDatum(to_encoding));
for (i = 0; i < catlist->n_members; i++) {
- tuple = &catlist->members[i]->tuple;
+ tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
body = (Form_pg_conversion)GETSTRUCT(tuple);
if (body->condefault) {
proc = body->conproc;
diff --git a/src/common/backend/catalog/pg_enum.cpp b/src/common/backend/catalog/pg_enum.cpp
index 525bdb449..73188a7cd 100644
--- a/src/common/backend/catalog/pg_enum.cpp
+++ b/src/common/backend/catalog/pg_enum.cpp
@@ -220,7 +220,7 @@ restart:
existing = (HeapTuple*)palloc(nelems * sizeof(HeapTuple));
for (i = 0; i < nelems; i++) {
/* Sort the existing enum lable */
- existing[i] = &(list->members[i]->tuple);
+ existing[i] = t_thrd.lsc_cxt.FetchTupleFromCatCList(list, i);
}
qsort(existing, nelems, sizeof(HeapTuple), sort_order_cmp);
}
@@ -294,7 +294,7 @@ restart:
RenumberEnumType(pg_enum, existing, nelems);
/* Clean up and start over */
pfree_ext(existing);
- ReleaseCatCacheList(list);
+ ReleaseSysCacheList(list);
goto restart;
}
@@ -396,7 +396,7 @@ restart:
/* Done with info about existing members */
pfree_ext(existing);
- ReleaseCatCacheList(list);
+ ReleaseSysCacheList(list);
/* Create the new pg_enum entry */
errno_t rc = memset_s(nulls, sizeof(nulls), false, sizeof(nulls));
@@ -454,7 +454,7 @@ void RenameEnumLabel(Oid enumTypeOid, const char* oldVal, const char* newVal)
* prefer a friendlier error message.)
*/
for (i = 0; i < nelems; i++) {
- enum_tup = &(list->members[i]->tuple);
+ enum_tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(list, i);
en = (Form_pg_enum)GETSTRUCT(enum_tup);
if (strcmp(NameStr(en->enumlabel), oldVal) == 0)
@@ -464,7 +464,7 @@ void RenameEnumLabel(Oid enumTypeOid, const char* oldVal, const char* newVal)
}
if (!old_tup) {
- ReleaseCatCacheList(list);
+ ReleaseSysCacheList(list);
heap_close(pg_enum, RowExclusiveLock);
ereport(
@@ -472,7 +472,7 @@ void RenameEnumLabel(Oid enumTypeOid, const char* oldVal, const char* newVal)
}
if (found_new) {
- ReleaseCatCacheList(list);
+ ReleaseSysCacheList(list);
heap_close(pg_enum, RowExclusiveLock);
ereport(ERROR, (errcode(ERRCODE_DUPLICATE_OBJECT), errmsg("enum label \"%s\" already exists", newVal)));
@@ -482,7 +482,7 @@ void RenameEnumLabel(Oid enumTypeOid, const char* oldVal, const char* newVal)
enum_tup = heap_copytuple(old_tup);
en = (Form_pg_enum)GETSTRUCT(enum_tup);
- ReleaseCatCacheList(list);
+ ReleaseSysCacheList(list);
/* Update the pg_enum entry */
(void)namestrcpy(&en->enumlabel, newVal);
diff --git a/src/common/backend/catalog/pg_hashbucket.cpp b/src/common/backend/catalog/pg_hashbucket.cpp
index cdb2b26f2..29b260432 100755
--- a/src/common/backend/catalog/pg_hashbucket.cpp
+++ b/src/common/backend/catalog/pg_hashbucket.cpp
@@ -497,7 +497,9 @@ Partition bucketGetPartition(Partition part, int2 bucketid)
Partition bucket = NULL;
MemoryContext oldcxt;
errno_t rc;
-
+ if (!IsBootstrapProcessingMode()) {
+ ResourceOwnerEnlargeFakepartRefs(t_thrd.utils_cxt.CurrentResourceOwner);
+ }
oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
bucket = (Partition)palloc0(sizeof(PartitionData));
diff --git a/src/common/backend/catalog/pg_job.cpp b/src/common/backend/catalog/pg_job.cpp
index b6b6207d6..dddee626c 100644
--- a/src/common/backend/catalog/pg_job.cpp
+++ b/src/common/backend/catalog/pg_job.cpp
@@ -439,6 +439,46 @@ void update_pg_job_dbname(Oid jobid, const char* dbname)
heap_close(job_relation, RowExclusiveLock);
}
+void update_pg_job_username(Oid jobid, const char* username)
+{
+ Relation job_relation = NULL;
+ HeapTuple tup = NULL;
+ HeapTuple newtuple = NULL;
+ Datum values[Natts_pg_job];
+ bool nulls[Natts_pg_job];
+ bool replaces[Natts_pg_job];
+ errno_t rc = 0;
+
+ rc = memset_s(values, sizeof(values), 0, sizeof(values));
+ securec_check(rc, "\0", "\0");
+
+ rc = memset_s(nulls, sizeof(nulls), false, sizeof(nulls));
+ securec_check_c(rc, "\0", "\0");
+
+ rc = memset_s(replaces, sizeof(replaces), false, sizeof(replaces));
+ securec_check_c(rc, "\0", "\0");
+
+ replaces[Anum_pg_job_log_user - 1] = true;
+ values[Anum_pg_job_log_user - 1] = CStringGetDatum(username);
+
+ replaces[Anum_pg_job_nspname - 1] = true;
+ values[Anum_pg_job_nspname - 1] = CStringGetDatum(username);
+
+ job_relation = heap_open(PgJobRelationId, RowExclusiveLock);
+
+ tup = get_job_tup(jobid);
+
+ newtuple = heap_modify_tuple(tup, RelationGetDescr(job_relation), values, nulls, replaces);
+
+ simple_heap_update(job_relation, &newtuple->t_self, newtuple);
+
+ CatalogUpdateIndexes(job_relation, newtuple);
+ ReleaseSysCache(tup);
+ heap_freetuple_ext(newtuple);
+
+ heap_close(job_relation, RowExclusiveLock);
+}
+
/*
* Description: Update job info to pg_job according to job execute status.
*
diff --git a/src/common/backend/catalog/pg_job_proc.cpp b/src/common/backend/catalog/pg_job_proc.cpp
index a3a6e04a8..d4a2546f0 100644
--- a/src/common/backend/catalog/pg_job_proc.cpp
+++ b/src/common/backend/catalog/pg_job_proc.cpp
@@ -57,6 +57,7 @@
#include "catalog/pg_authid.h"
#include "catalog/pg_database.h"
#include "catalog/gs_job_argument.h"
+#include "catalog/gs_job_attribute.h"
#include "fmgr.h"
#include "utils/syscache.h"
#include "utils/timestamp.h"
@@ -135,6 +136,21 @@ Datum dbe_insert_pg_job_proc(Datum job_id, Datum job_action, const Datum job_nam
return job_id;
}
+int4 get_job_id_from_pg_job(Datum job_name)
+{
+ Relation pg_job_rel = heap_open(PgJobRelationId, AccessShareLock);
+ HeapTuple tuple = search_from_pg_job(pg_job_rel, job_name);
+ int4 job_id = 0;
+ if (tuple != NULL) {
+ bool isnull = false;
+ job_id = heap_getattr(tuple, Anum_pg_job_job_id, pg_job_rel->rd_att, &isnull);
+ heap_freetuple_ext(tuple);
+ }
+
+ heap_close(pg_job_rel, AccessShareLock);
+ return job_id;
+}
+
/*
* @brief search_from_pg_job_proc_no_exception
*
@@ -142,14 +158,23 @@ Datum dbe_insert_pg_job_proc(Datum job_id, Datum job_action, const Datum job_nam
* @param job_name
* @return HeapTuple
*/
-static HeapTuple search_from_pg_job_proc_no_exception(Relation rel, Datum job_name)
+HeapTuple search_from_pg_job_proc_no_exception(Relation rel, Datum job_name)
{
- ScanKeyInfo scan_key_info;
- scan_key_info.attribute_value = job_name;
- scan_key_info.attribute_number = Anum_pg_job_proc_job_name;
- scan_key_info.procedure = F_TEXTEQ;
- List *tuples = search_by_sysscan_1(rel, &scan_key_info);
+ int4 job_id = get_job_id_from_pg_job(job_name);
+ ScanKeyInfo scan_key_info1;
+ scan_key_info1.attribute_value = job_name;
+ scan_key_info1.attribute_number = Anum_pg_job_proc_job_name;
+ scan_key_info1.procedure = F_TEXTEQ;
+ ScanKeyInfo scan_key_info2;
+ scan_key_info2.attribute_value = job_id;
+ scan_key_info2.attribute_number = Anum_pg_job_proc_job_id;
+ scan_key_info2.procedure = F_INT4EQ;
+ List *tuples = search_by_sysscan_2(rel, &scan_key_info1, &scan_key_info2);
+ if (tuples == NIL) {
+ return NULL;
+ }
if (list_length(tuples) != 1) {
+ list_free_deep(tuples);
return NULL;
}
HeapTuple tuple = (HeapTuple)linitial(tuples);
@@ -187,6 +212,7 @@ void lookup_pg_job_proc(Datum name, Datum *job_id, Datum *job_action)
bool isnull = false;
Relation rel = heap_open(PgJobProcRelationId, AccessShareLock);
HeapTuple tuple = search_from_pg_job_proc(rel, name);
+
/* integer job id */
if (job_id != NULL) {
*job_id = heap_getattr(tuple, Anum_pg_job_proc_job_id, rel->rd_att, &isnull);
@@ -204,6 +230,7 @@ void lookup_pg_job_proc(Datum name, Datum *job_id, Datum *job_action)
*job_action = PointerGetDatum(PG_DETOAST_DATUM_COPY(job_action_src));
}
}
+ heap_freetuple_ext(tuple);
heap_close(rel, AccessShareLock);
}
diff --git a/src/common/backend/catalog/pg_object.cpp b/src/common/backend/catalog/pg_object.cpp
index b933653eb..7f90f0bfd 100644
--- a/src/common/backend/catalog/pg_object.cpp
+++ b/src/common/backend/catalog/pg_object.cpp
@@ -36,6 +36,7 @@
#include "utils/rel.h"
#include "miscadmin.h"
#include "catalog/index.h"
+#include "utils/knl_relcache.h"
/*
* @Description: Insert a new record to pg_object.
@@ -94,13 +95,13 @@ void CreatePgObject(Oid objectOid, PgObjectType objectType, Oid creator, const P
nulls[Anum_pg_object_mtime - 1] = true;
}
- if (objectOpt.hasCreatecsn && (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM)) {
+ if (objectOpt.hasCreatecsn && (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM)) {
values[Anum_pg_object_createcsn - 1] = UInt64GetDatum(csn);
} else {
nulls[Anum_pg_object_createcsn - 1] = true;
}
- if (objectOpt.hasChangecsn && (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM)) {
+ if (objectOpt.hasChangecsn && (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM)) {
values[Anum_pg_object_changecsn - 1] = UInt64GetDatum(csn);
} else {
nulls[Anum_pg_object_changecsn - 1] = true;
@@ -159,7 +160,7 @@ void DeletePgObject(Oid objectOid, PgObjectType objectType)
* @in relationChangecsn: the changecsn of table recorded in pg_object.
* Returns: CommitSeqNo
*/
-static CommitSeqNo GetMaxChangecsn(List* indexIds, CommitSeqNo relationChangecsn)
+static CommitSeqNo GetMaxChangecsn(Relation rel, List* indexIds, CommitSeqNo relationChangecsn)
{
HeapTuple tup = NULL;
TupleDesc tupdesc = NULL;
@@ -213,7 +214,7 @@ void GetObjectCSN(Oid objectOid, Relation userRel, PgObjectType objectType, Obje
The pg_object system table does not hold objects generated during the database init
process,so the object's createcsn and changecsn is zero during the process.
*/
- if (IsInitdb || !(t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM)) {
+ if (IsInitdb || !(t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM)) {
return;
}
/*
@@ -248,7 +249,7 @@ void GetObjectCSN(Oid objectOid, Relation userRel, PgObjectType objectType, Obje
bool hasindex = userRel->rd_rel->relhasindex;
if (hasindex) {
List* indexIds = RelationGetIndexList(userRel);
- csnInfo->changecsn = GetMaxChangecsn(indexIds, csnInfo->changecsn);
+ csnInfo->changecsn = GetMaxChangecsn(userRel, indexIds, csnInfo->changecsn);
}
}
ReleaseSysCache(tup);
@@ -281,6 +282,9 @@ bool CheckObjectExist(Oid objectOid, PgObjectType objectType)
case OBJECT_TYPE_PROC:
tup = SearchSysCache1(PROCOID, ObjectIdGetDatum(objectOid));
break;
+ case OBJECT_TYPE_PKGSPEC:
+ tup = SearchSysCache1(PACKAGEOID, ObjectIdGetDatum(objectOid));
+ break;
default:
return false;
}
@@ -331,7 +335,7 @@ void UpdatePgObjectMtime(Oid objectOid, PgObjectType objectType)
securec_check(rc, "\0", "\0");
replaces[Anum_pg_object_mtime - 1] = true;
values[Anum_pg_object_mtime - 1] = nowtime;
- if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) {
+ if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) {
if (!u_sess->exec_cxt.isExecTrunc) {
replaces[Anum_pg_object_changecsn - 1] = true;
values[Anum_pg_object_changecsn - 1] = UInt64GetDatum(csn);
@@ -342,7 +346,7 @@ void UpdatePgObjectMtime(Oid objectOid, PgObjectType objectType)
CatalogUpdateIndexes(relation, newtuple);
ReleaseSysCache(tup);
heap_freetuple_ext(newtuple);
- if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) {
+ if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) {
if (!u_sess->exec_cxt.isExecTrunc &&
(objectType == OBJECT_TYPE_RELATION || objectType == OBJECT_TYPE_INDEX)) {
Relation userRel = RelationIdGetRelation(objectOid);
@@ -367,7 +371,7 @@ void UpdatePgObjectChangecsn(Oid objectOid, PgObjectType objectType)
Relation relation = NULL;
HeapTuple tup = NULL;
CommitSeqNo csn = t_thrd.xact_cxt.ShmemVariableCache->nextCommitSeqNo;
- if (!(t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) || IsInitdb) {
+ if (!(t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) || IsInitdb) {
return;
}
if (!CheckObjectExist(objectOid, objectType)) {
diff --git a/src/common/backend/catalog/pg_partition.cpp b/src/common/backend/catalog/pg_partition.cpp
index ef5ddb688..dc9747fa2 100644
--- a/src/common/backend/catalog/pg_partition.cpp
+++ b/src/common/backend/catalog/pg_partition.cpp
@@ -203,8 +203,6 @@ void ExceptionHandlerForPartition(GetPartitionOidArgs *args, Oid partitionOid, b
*/
static Oid partitionGetPartitionOid(GetPartitionOidArgs* args, LOCKMODE lockMode, bool missingOk, bool noWait)
{
- /* remember SharedInvalidMessageCounter */
- uint64 invalCount = 0;
Oid partitionOid = InvalidOid;
Oid partitionOldOid = InvalidOid;
bool retry = false;
@@ -225,13 +223,18 @@ static Oid partitionGetPartitionOid(GetPartitionOidArgs* args, LOCKMODE lockMode
* by calling AcceptInvalidationMessages() before beginning this loop, but
* that would add a significant amount overhead, so for now we don't.
*/
+ uint64 sess_inval_count;
+ uint64 thrd_inval_count = 0;
for (;;) {
/*
* Remember this value, so that, after looking up the partition name
* and locking its OID, we can check whether any invalidation messages
* have been processed that might require a do-over.
*/
- invalCount = u_sess->inval_cxt.SharedInvalidMessageCounter;
+ sess_inval_count = u_sess->inval_cxt.SIMCounter;
+ if (EnableLocalSysCache()) {
+ thrd_inval_count = t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter;
+ }
/* get partition oid */
if (args->givenPartitionName) {
@@ -318,8 +321,15 @@ static Oid partitionGetPartitionOid(GetPartitionOidArgs* args, LOCKMODE lockMode
/*
* If no invalidation message were processed, we're done!
*/
- if (u_sess->inval_cxt.SharedInvalidMessageCounter == invalCount) {
- break;
+ if (EnableLocalSysCache()) {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter &&
+ thrd_inval_count == t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter) {
+ break;
+ }
+ } else {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter) {
+ break;
+ }
}
/*
@@ -427,8 +437,8 @@ Oid partitionNameGetPartitionOid(Oid partitionedRelationOid, const char* partiti
* @Return: partition oid
* @See also: partitionNameGetPartitionOid()
*/
-Oid partitionValuesGetPartitionOid(
- Relation rel, List* partKeyValueList, LOCKMODE lockMode, bool topClosed, bool missingOk, bool noWait)
+Oid partitionValuesGetPartitionOid(Relation rel, List *partKeyValueList, LOCKMODE lockMode, bool topClosed,
+ bool missingOk, bool noWait)
{
GetPartitionOidArgs args;
/* get partition oid from given values */
@@ -448,6 +458,41 @@ Oid partitionValuesGetPartitionOid(
return partitionGetPartitionOid(&args, lockMode, missingOk, noWait);
}
+Oid subpartitionValuesGetSubpartitionOid(Relation rel, List *partKeyValueList, List *subpartKeyValueList,
+ LOCKMODE lockMode, bool topClosed, bool missingOk, bool noWait, Oid *partOidForSubPart)
+{
+ GetPartitionOidArgs args;
+ /* get partition oid from given values */
+ args.givenPartitionName = false;
+ args.partitionedRel = rel;
+ args.partKeyValueList = partKeyValueList;
+ args.partitionedRelOid = rel->rd_id;
+ args.topClosed = topClosed;
+ /* the following arguments is not used. */
+ args.partitionName = NULL;
+ args.objectType = PART_OBJ_TYPE_TABLE_PARTITION;
+ args.callback = NULL;
+ args.callbackArgs = NULL;
+ args.callbackObjLockMode = NoLock;
+
+ *partOidForSubPart = partitionGetPartitionOid(&args, lockMode, missingOk, noWait);
+ if (!OidIsValid(*partOidForSubPart)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("The partition which owns the subpartition is missing"),
+ errdetail("N/A"),
+ errcause("Maybe the subpartition table is dropped"),
+ erraction("Check system table 'pg_partition' for more information")));
+ }
+
+ Partition part = partitionOpen(rel, *partOidForSubPart, lockMode);
+ Relation partrel = partitionGetRelation(rel, part);
+ Oid subpartOid = partitionValuesGetPartitionOid(partrel, subpartKeyValueList, lockMode, true, true, false);
+ releaseDummyRelation(&partrel);
+ partitionClose(rel, part, NoLock);
+
+ return subpartOid;
+}
+
/*
* @@GaussDB@@
* Target : data partition
@@ -647,7 +692,7 @@ static Oid getPartitionIndexFormData(Oid indexid, Oid partitionid, Form_pg_parti
errhint("In redistribution, local parititon index maybe not exists.")));
return InvalidOid;
}
- tuple = &catlist->members[0]->tuple;
+ tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, 0);
partitionForm = (Form_pg_partition)GETSTRUCT(tuple);
result = HeapTupleGetOid(tuple);
if (!onlyOid) {
@@ -698,6 +743,34 @@ Oid getPartitionIndexTblspcOid(Oid indexid, Oid partitionid)
return tblspcOid;
}
+/*
+ * @Description: Given OIDs of index relation and heap partition, get relname of index partition.
+ * @IN indexid: given index relation's OID
+ * @IN partitionid: given partition's OID
+ * @Return: relname Oid of index partition.
+ * @See also:
+ */
+char* getPartitionIndexName(Oid indexid, Oid partitionid)
+{
+ FormData_pg_partition indexPartFormData;
+ Oid indexPartOid = InvalidOid;
+ char* name = NULL;
+
+ errno_t rc = memset_s(&indexPartFormData, PARTITION_TUPLE_SIZE, 0, PARTITION_TUPLE_SIZE);
+ securec_check(rc, "\0", "\0");
+
+ indexPartOid = getPartitionIndexFormData(indexid, partitionid, &indexPartFormData);
+ if (OidIsValid(indexPartOid)) {
+ name = pstrdup(NameStr(indexPartFormData.relname));
+ } else {
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("Invalid Oid of local index %u on the partition %u.", indexid, partitionid)));
+ }
+
+ return name;
+}
+
/*
* from index partition oid, get heap partition oid.
*/
@@ -949,6 +1022,125 @@ List* RelationGetSubPartitionList(Relation relation, LOCKMODE lockmode)
return subPartList;
}
+/* give one partitioned relation, return a list, consisting of relname of all its partition and subpartition */
+List* RelationGetPartitionNameList(Relation relation)
+{
+ List* partnameList = NIL;
+ List *partTupleList = NIL;
+ if (!RelationIsPartitioned(relation)) {
+ return partnameList;
+ }
+
+ if (RelationIsPartitionOfSubPartitionTable(relation)) { /* a partition of subpartition */
+ partTupleList = searchPgPartitionByParentId(PART_OBJ_TYPE_TABLE_SUB_PARTITION, relation->rd_id);
+ Assert(PointerIsValid(partTupleList));
+
+ ListCell *partCell = NULL;
+ Form_pg_partition partitionTuple = NULL;
+ foreach (partCell, partTupleList) {
+ partitionTuple = (Form_pg_partition)GETSTRUCT((HeapTuple)lfirst(partCell));
+ partnameList = lappend(partnameList, pstrdup(partitionTuple->relname.data));
+ }
+ list_free_deep(partTupleList);
+ } else { /* a relation */
+ partTupleList = searchPgPartitionByParentId(PART_OBJ_TYPE_TABLE_PARTITION, relation->rd_id);
+ Assert(PointerIsValid(partTupleList));
+
+ ListCell *partCell = NULL;
+ Form_pg_partition partitionTuple = NULL;
+ foreach (partCell, partTupleList) {
+ partitionTuple = (Form_pg_partition)GETSTRUCT((HeapTuple)lfirst(partCell));
+ partnameList = lappend(partnameList, pstrdup(partitionTuple->relname.data));
+ if (RelationIsSubPartitioned(relation)) {
+ List *subpartTupleList = searchPgPartitionByParentId(PART_OBJ_TYPE_TABLE_SUB_PARTITION,
+ HeapTupleGetOid((HeapTuple)lfirst(partCell)));
+
+ ListCell *subpartCell = NULL;
+ Form_pg_partition subpartitionTuple = NULL;
+ foreach (subpartCell, subpartTupleList) {
+ subpartitionTuple = (Form_pg_partition)GETSTRUCT((HeapTuple)lfirst(subpartCell));
+ partnameList = lappend(partnameList, pstrdup(subpartitionTuple->relname.data));
+ }
+ list_free_deep(subpartTupleList);
+ }
+ }
+ list_free_deep(partTupleList);
+ }
+
+ return partnameList;
+}
+
+void RelationGetSubpartitionInfo(Relation relation, char *subparttype, List **subpartKeyPosList,
+ int2vector **subpartitionKey)
+{
+ if (!RelationIsSubPartitioned(relation)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("Un-support feature"),
+ errdetail("Can not get subpartition information for NON-SUBPARTITIONED table"),
+ errcause("Try get the subpartition information on a NON-SUBPARTITIONED object"),
+ erraction("Check system table 'pg_partition' for more information")));
+ }
+
+ Oid partid = InvalidOid;
+ ArrayType* pos_array = NULL;
+ Datum pos_raw = (Datum)0;
+ bool isNull = false;
+
+ Relation pg_partition = heap_open(PartitionRelationId, AccessShareLock);
+ ScanKeyData key[2];
+ SysScanDesc scan = NULL;
+ HeapTuple tuple = NULL;
+ ScanKeyInit(&key[0], Anum_pg_partition_parttype, BTEqualStrategyNumber, F_CHAREQ,
+ CharGetDatum(PART_OBJ_TYPE_TABLE_PARTITION));
+ ScanKeyInit(&key[1], Anum_pg_partition_parentid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(relation->rd_id));
+ scan = systable_beginscan(pg_partition, PartitionParentOidIndexId, true, NULL, 2, key);
+ if (HeapTupleIsValid((tuple = systable_getnext(scan)))) {
+ partid = HeapTupleGetOid(tuple);
+ pos_raw = heap_getattr(tuple, Anum_pg_partition_partkey, RelationGetDescr(pg_partition), &isNull);
+ }
+ systable_endscan(scan);
+
+ if (isNull) {
+ heap_close(pg_partition, AccessShareLock);
+ ereport(ERROR,
+ (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+ errmsg("Null partition key value for relation \"%s\"", RelationGetRelationName(relation)),
+ errdetail("N/A"),
+ errcause("Unexpected partition tuple in pg_partition for this relation"),
+ erraction("Check system table 'pg_partition' for more information")));
+ }
+ pos_array = DatumGetArrayTypeP(pos_raw);
+ int ncolumn = ARR_DIMS(pos_array)[0];
+ int16* attnums = (int16*)ARR_DATA_PTR(pos_array);
+ Assert(ncolumn > 0);
+ if (PointerIsValid(subpartitionKey)) {
+ *subpartitionKey = buildint2vector(attnums, ncolumn);
+ }
+ if (PointerIsValid(subpartKeyPosList)) {
+ for (int i = 0; i < ncolumn; i++) {
+ *subpartKeyPosList = lappend_int(*subpartKeyPosList, (int)(attnums[i]) - 1);
+ }
+ }
+
+ if (PointerIsValid(subparttype)) {
+ ScanKeyData subkey[2];
+ SysScanDesc subscan = NULL;
+ HeapTuple subtuple = NULL;
+ ScanKeyInit(&subkey[0], Anum_pg_partition_parttype, BTEqualStrategyNumber, F_CHAREQ,
+ CharGetDatum(PART_OBJ_TYPE_TABLE_SUB_PARTITION));
+ ScanKeyInit(&subkey[1], Anum_pg_partition_parentid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(partid));
+ subscan = systable_beginscan(pg_partition, PartitionParentOidIndexId, true, NULL, 2, subkey);
+ if (HeapTupleIsValid((subtuple = systable_getnext(subscan)))) {
+ *subparttype = ((Form_pg_partition)GETSTRUCT(subtuple))->partstrategy;
+ } else {
+ *subparttype = PART_STRATEGY_INVALID;
+ }
+ systable_endscan(subscan);
+ }
+
+ heap_close(pg_partition, AccessShareLock);
+}
+
// give one partitioned index relation,
// return a list, consisting of oid of all its index partition
List* indexGetPartitionOidList(Relation indexRelation)
@@ -1006,6 +1198,18 @@ Relation SubPartitionGetRelation(Relation heap, Partition subPart, LOCKMODE lock
return subPartRel;
}
+Partition SubPartitionOidGetPartition(Relation rel, Oid subPartOid, LOCKMODE lockmode)
+{
+ Oid parentOid = partid_get_parentid(subPartOid);
+ Partition part = partitionOpen(rel, parentOid, lockmode);
+ Relation partRel = partitionGetRelation(rel, part);
+ Partition subPart = partitionOpen(partRel, subPartOid, lockmode);
+ releaseDummyRelation(&partRel);
+ partitionClose(rel, part, NoLock);
+
+ return subPart;
+}
+
Relation SubPartitionOidGetParentRelation(Relation rel, Oid subPartOid, LOCKMODE lockmode)
{
Oid parentOid = partid_get_parentid(subPartOid);
@@ -1200,3 +1404,24 @@ HeapTuple searchPgPartitionByParentIdCopy(char parttype, Oid parentId)
return tuple;
}
+
+/*
+ * @@GaussDB@@
+ * Target : GetBaseRelOid
+ * Brief :
+ * Description : For partition, return parentId, For indexpartition, return parentId,
+ * For subpartition, return grandparentId, For indexsubpartition, return parentId,
+ *
+ * Notes :
+ */
+Oid GetBaseRelOidOfParition(Relation relation)
+{
+ Assert(RelationIsPartition(relation));
+
+ if (RelationIsSubPartitionOfSubPartitionTable(relation)) {
+ return relation->grandparentId;
+ }
+
+ return relation->parentId;
+}
+
diff --git a/src/common/backend/catalog/pg_proc.cpp b/src/common/backend/catalog/pg_proc.cpp
index 76735029d..49efdcc5e 100644
--- a/src/common/backend/catalog/pg_proc.cpp
+++ b/src/common/backend/catalog/pg_proc.cpp
@@ -1,7 +1,7 @@
/* -------------------------------------------------------------------------
*
* pg_proc.cpp
- * routines to support manipulation of the pg_proc relation
+ * routines to support manipulation of the pg_proc relation
*
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * src/common/backend/catalog/pg_proc.cpp
+ * src/common/backend/catalog/pg_proc.cpp
*
* -------------------------------------------------------------------------
*/
@@ -19,6 +19,7 @@
#include "access/transam.h"
#include "access/xact.h"
#include "catalog/dependency.h"
+#include "catalog/gs_encrypted_proc.h"
#include "catalog/indexing.h"
#include "catalog/namespace.h"
#include "catalog/objectaccess.h"
@@ -30,6 +31,7 @@
#include "catalog/gs_encrypted_proc.h"
#include "catalog/pg_proc_fn.h"
#include "catalog/pg_type.h"
+#include "client_logic/client_logic_proc.h"
#include "commands/defrem.h"
#include "commands/user.h"
#include "commands/trigger.h"
@@ -40,6 +42,7 @@
#include "miscadmin.h"
#include "nodes/nodeFuncs.h"
#include "parser/parse_type.h"
+#include "parser/parse_coerce.h"
#include "tcop/pquery.h"
#include "tcop/tcopprot.h"
#include "utils/acl.h"
@@ -117,29 +120,23 @@ static void checkFunctionConflicts(HeapTuple oldtup, const char* procedureName,
bool isAgg, bool isWindowFunc);
static bool user_define_func_check(Oid languageId, const char* probin, char** absolutePath, CFunType* function_type);
static const char* get_file_name(const char* filePath, CFunType function_type);
-static int get_decimal_from_hex(char hex);
+
+#ifndef ENABLE_MULTIPLE_NODES
+static void CheckInParameterConflicts(CatCList* catlist, const char* procedureName, oidvector* inpara_type,
+ oidvector* proc_para_type, Oid languageId, bool isOraStyle, bool replace);
+#endif
static Acl* ProcAclDefault(Oid ownerId)
{
- AclMode world_default;
AclMode owner_default;
int nacl = 0;
Acl* acl = NULL;
AclItem* aip = NULL;
- world_default = ACL_NO_RIGHTS;
owner_default = ACL_ALL_RIGHTS_FUNCTION;
- if (world_default != ACL_NO_RIGHTS)
- nacl++;
if (owner_default != ACL_NO_RIGHTS)
nacl++;
acl = allocacl(nacl);
aip = ACL_DAT(acl);
- if (world_default != ACL_NO_RIGHTS) {
- aip->ai_grantee = ACL_ID_PUBLIC;
- aip->ai_grantor = ownerId;
- ACLITEM_SET_PRIVS_GOPTIONS(*aip, world_default, ACL_NO_RIGHTS);
- aip++;
- }
if (owner_default != ACL_NO_RIGHTS) {
aip->ai_grantee = ownerId;
@@ -244,14 +241,12 @@ static char* get_temp_library(bool absolute_path)
"%s/pg_plugin/%ld%lu",
t_thrd.proc_cxt.pkglib_path,
GetCurrentTransactionStartTimestamp(),
- (GTM_MODE) ? (GetCurrentTransactionId()) :
- (isExecCN ? GetCurrentTransactionId() : t_thrd.xact_cxt.cn_xid));
+ (isExecCN ? GetCurrentTransactionId() : t_thrd.xact_cxt.cn_xid));
} else {
appendStringInfo(&temp_file_strinfo,
"$libdir/pg_plugin/%ld%lu",
GetCurrentTransactionStartTimestamp(),
- (GTM_MODE) ? (GetCurrentTransactionId()) :
- (isExecCN ? GetCurrentTransactionId() : t_thrd.xact_cxt.cn_xid));
+ (isExecCN ? GetCurrentTransactionId() : t_thrd.xact_cxt.cn_xid));
}
return temp_file_strinfo.data;
@@ -561,10 +556,12 @@ static char* getCFunProbin(const char* probin, Oid procNamespace, Oid proowner,
* @in procNamespace - function's namespace oid
* @in package - is a package function or not
* @in packageid - is package oid
+ * @in isOraStyle: Is A db style.
* @return - new function conflicts old functions or not
*/
-static bool checkPackageFunctionConflicts(
- const char* procedureName, Datum allParameterTypes, oidvector* parameterTypes, Oid procNamespace, bool package, Oid propackageid)
+static bool checkPackageFunctionConflicts(const char* procedureName,
+ Datum allParameterTypes, oidvector* parameterTypes, Datum parameterModes,
+ Oid procNamespace, bool package, Oid propackageid, Oid languageId, bool isOraStyle, bool replace)
{
int inpara_count;
int allpara_count = 0;
@@ -574,6 +571,9 @@ static bool checkPackageFunctionConflicts(
oidvector* inpara_type = NULL;
Oid* p_argtypes = NULL;
HeapTuple proctup = NULL;
+#ifndef ENABLE_MULTIPLE_NODES
+ bool enable_outparam_override = enable_out_param_override();
+#endif
errno_t rc = EOK;
if (allParameterTypes != PointerGetDatum(NULL)) {
arr = DatumGetArrayTypeP(allParameterTypes);
@@ -594,7 +594,7 @@ static bool checkPackageFunctionConflicts(
/* search the function */
/* Search syscache by name only */
- CatCList *catlist = NULL;
+ CatCList *catlist = NULL;
#ifndef ENABLE_MULTIPLE_NODES
if (t_thrd.proc->workingVersionNum < 92470) {
catlist = SearchSysCacheList1(PROCNAMEARGSNSP, CStringGetDatum(procedureName));
@@ -604,8 +604,9 @@ static bool checkPackageFunctionConflicts(
#else
catlist = SearchSysCacheList1(PROCNAMEARGSNSP, CStringGetDatum(procedureName));
#endif
+
for (int i = 0; i < catlist->n_members; i++) {
- proctup = &catlist->members[i]->tuple;
+ proctup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Oid* argtypes = NULL;
Datum proallargtypes;
bool isNull = false;
@@ -613,8 +614,9 @@ static bool checkPackageFunctionConflicts(
Form_pg_proc pform = NULL;
oidvector* proc_allpara_type = NULL;
oidvector* proc_para_type = NULL;
+ Datum pro_arg_modes = 0;
bool result1 = false;
- bool result3 = false;
+ bool result2 = false;
if (HeapTupleIsValid(proctup)) {
pform = (Form_pg_proc)GETSTRUCT(proctup);
/* compare function's namespace */
@@ -630,7 +632,7 @@ static bool checkPackageFunctionConflicts(
ispackage = DatumGetBool(propackage);
/* only check package function */
if (ispackage != package) {
- ReleaseCatCacheList(catlist);
+ ReleaseSysCacheList(catlist);
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("Do not allow package function overload not package function.")));
@@ -644,7 +646,7 @@ static bool checkPackageFunctionConflicts(
arr = DatumGetArrayTypeP(proallargtypes); /* ensure not toasted */
allnumargs = ARR_DIMS(arr)[0];
if (ARR_NDIM(arr) != 1 || allnumargs < 0 || ARR_HASNULL(arr) || ARR_ELEMTYPE(arr) != OIDOID) {
- ReleaseCatCacheList(catlist);
+ ReleaseSysCacheList(catlist);
ereport(ERROR,
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("proallargtypes is not a 1-D Oid array")));
}
@@ -657,6 +659,12 @@ static bool checkPackageFunctionConflicts(
pfree_ext(argtypes);
}
+ proc_para_type = ProcedureGetArgTypes(proctup);
+#ifndef ENABLE_MULTIPLE_NODES
+ CheckInParameterConflicts(catlist, procedureName, inpara_type, proc_para_type, languageId, isOraStyle,
+ replace);
+#endif
+
/* No need to compare param type if param count is not same */
if (pform->pronargs != allpara_count && pform->pronargs != inpara_count && allnumargs != allpara_count &&
allnumargs != inpara_count) {
@@ -666,23 +674,33 @@ static bool checkPackageFunctionConflicts(
continue;
}
- proc_para_type = ProcedureGetArgTypes(proctup);
-
- /* old function in param type compare new function all param type */
- if (allpara_type != NULL) {
+ pro_arg_modes = SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_proargmodes, &isNull);
+#ifndef ENABLE_MULTIPLE_NODES
+ if (!enable_outparam_override) {
result1 = DatumGetBool(
- DirectFunctionCall2(oidvectoreq, PointerGetDatum(proc_para_type), PointerGetDatum(allpara_type)));
+ DirectFunctionCall2(oidvectoreq, PointerGetDatum(proc_para_type), PointerGetDatum(inpara_type)));
+ }
+#endif
+
+ if (proc_allpara_type != NULL && allpara_type != NULL) {
+ /* old function all param type compare new function all param type */
+ result2 = DatumGetBool(DirectFunctionCall2(
+ oidvectoreq, PointerGetDatum(allpara_type), PointerGetDatum(proc_allpara_type)));
}
- if (proc_allpara_type != NULL) {
- if (allpara_type != NULL) {
- /* old function all param type compare new function all param type */
- result3 = DatumGetBool(DirectFunctionCall2(
- oidvectoreq, PointerGetDatum(allpara_type), PointerGetDatum(proc_allpara_type)));
+ result = result1 || result2;
+#ifndef ENABLE_MULTIPLE_NODES
+ if (result && IsPlpgsqlLanguageOid(languageId) && !OidIsValid(propackageid) && !isOraStyle) {
+ if (DatumGetPointer(pro_arg_modes) == NULL) {
+ result &= (DatumGetPointer(parameterModes) == NULL);
+ } else if (DatumGetPointer(parameterModes) == NULL) {
+ result = false;
+ } else {
+ result &= IsProArgModesEqual(parameterModes, pro_arg_modes);
}
}
+#endif
- result = result1 || result3;
if (proc_allpara_type != NULL) {
pfree_ext(proc_allpara_type);
}
@@ -698,7 +716,7 @@ static bool checkPackageFunctionConflicts(
pfree_ext(allpara_type);
}
- ReleaseCatCacheList(catlist);
+ ReleaseSysCacheList(catlist);
return result;
}
@@ -723,6 +741,7 @@ static void checkFunctionConflicts(HeapTuple oldtup, const char* procedureName,
{
Datum proargnames;
bool isnull = false;
+ Oid origin_return_type;
if (!replace) {
ereport(ERROR,
(errcode(ERRCODE_DUPLICATE_FUNCTION),
@@ -749,9 +768,13 @@ static void checkFunctionConflicts(HeapTuple oldtup, const char* procedureName,
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
errmsg("function \"%s\" is a masking function,it can not be changed", procedureName)));
}
- Oid origin_return_type = oldproc->prorettype;
+ origin_return_type = oldproc->prorettype;
/* A db donot check function return type when replace */
if (!isOraStyle) {
+ /*
+ * For client logic type use original return type from gs_cl_proc
+ * and remove all data from gs_cl_proc
+ */
if(IsClientLogicType(oldproc->prorettype)) {
Oid functionId = HeapTupleGetOid(oldtup);
HeapTuple gs_oldtup = SearchSysCache1(GSCLPROCID, functionId);
@@ -759,14 +782,15 @@ static void checkFunctionConflicts(HeapTuple oldtup, const char* procedureName,
if (HeapTupleIsValid(gs_oldtup)) {
Datum gs_ret_orig =
SysCacheGetAttr(GSCLPROCID, gs_oldtup, Anum_gs_encrypted_proc_prorettype_orig, &isNull);
- if(!isNull) {
- origin_return_type = DatumGetObjectId(gs_ret_orig);
+ /* never should happen, since if the function return type was
+ client logic we must insert its original type on creation, but
+ since some old code might create by error functions that its
+ original return type is not saved, and for avoid undefined behaviour,
+ it is checked again. */
+ if (!isNull) {
+ origin_return_type = ObjectIdGetDatum(gs_ret_orig);
}
- Relation gs_rel = heap_open(ClientLogicProcId, RowExclusiveLock);
- deleteDependencyRecordsFor(ClientLogicProcId, HeapTupleGetOid(gs_oldtup), true);
- simple_heap_delete(gs_rel, &gs_oldtup->t_self);
- heap_close(gs_rel, RowExclusiveLock);
- ReleaseSysCache(gs_oldtup);
+ delete_proc_client_info(gs_oldtup);
}
}
/*
@@ -1000,7 +1024,7 @@ static bool user_define_func_check(Oid languageId, const char* probin, char** ab
}
/* ----------------------------------------------------------------
- * ProcedureCreate
+ * ProcedureCreate
*
* Note: allParameterTypes, parameterModes, parameterNames, and proconfig
* are either arrays of the proper types or NULL. We declare them Datum,
@@ -1118,8 +1142,12 @@ Oid ProcedureCreate(const char* procedureName, Oid procNamespace, Oid propackage
}
}
+ bool existOutParam = false;
if (allParameterTypes != PointerGetDatum(NULL)) {
for (i = 0; i < allParamCount; i++) {
+ if (paramModes[i] == PROARGMODE_OUT || paramModes[i] == PROARGMODE_INOUT) {
+ existOutParam = true;
+ }
if (paramModes == NULL || paramModes[i] == PROARGMODE_IN || paramModes[i] == PROARGMODE_VARIADIC)
continue; /* ignore input-only params */
@@ -1145,7 +1173,7 @@ Oid ProcedureCreate(const char* procedureName, Oid procNamespace, Oid propackage
/*
* Do not allow polymorphic return type unless at least one input argument
- * is polymorphic. ANYRANGE return type is even stricter: must have an
+ * is polymorphic. ANYRANGE return type is even stricter: must have an
* ANYRANGE input (since we can't deduce the specific range type from
* ANYELEMENT). Also, do not allow return type INTERNAL unless at least
* one input argument is INTERNAL.
@@ -1307,7 +1335,7 @@ Oid ProcedureCreate(const char* procedureName, Oid procNamespace, Oid propackage
* generic arrays, but they support only one-dimensional arrays with no
* nulls (and no null bitmap).
*/
- oidvector* dummy = MakeMd5HashArgTypes((oidvector*)allParameterTypes);
+ oidvector* dummy = MakeMd5HashOids((oidvector*)allParameterTypes);
values[Anum_pg_proc_allargtypes - 1] = PointerGetDatum(dummy);
values[Anum_pg_proc_allargtypesext - 1] = PointerGetDatum(allParameterTypes);
@@ -1418,18 +1446,9 @@ Oid ProcedureCreate(const char* procedureName, Oid procNamespace, Oid propackage
} else {
/* Check for pre-existing definition */
#ifndef ENABLE_MULTIPLE_NODES
- if (t_thrd.proc->workingVersionNum < 92470) {
- oldtup = SearchSysCache3(PROCNAMEARGSNSP,
- PointerGetDatum(procedureName),
- values[Anum_pg_proc_proargtypes - 1],
- ObjectIdGetDatum(procNamespace));
- } else {
- oldtup = SearchSysCache4(PROCALLARGS,
- PointerGetDatum(procedureName),
- values[Anum_pg_proc_allargtypes - 1],
- ObjectIdGetDatum(procNamespace),
- ObjectIdGetDatum(propackageid));
- }
+ Oid oldTupleOid = GetOldTupleOid(procedureName, parameterTypes, procNamespace,
+ propackageid, values, parameterModes);
+ oldtup = SearchSysCache1(PROCOID, ObjectIdGetDatum(oldTupleOid));
#else
oldtup = SearchSysCache3(PROCNAMEARGSNSP,
PointerGetDatum(procedureName),
@@ -1437,7 +1456,49 @@ Oid ProcedureCreate(const char* procedureName, Oid procNamespace, Oid propackage
ObjectIdGetDatum(procNamespace));
#endif
}
+#ifndef ENABLE_MULTIPLE_NODES
+ if (enable_out_param_override() && !u_sess->attr.attr_common.IsInplaceUpgrade && !IsInitdb && !proIsProcedure &&
+ IsPlpgsqlLanguageOid(languageObjectId)) {
+ bool findOutParamFunc = false;
+ CatCList *catlist = NULL;
+ if (t_thrd.proc->workingVersionNum < 92470) {
+ catlist = SearchSysCacheList1(PROCNAMEARGSNSP, CStringGetDatum(procedureName));
+ } else {
+ catlist = SearchSysCacheList1(PROCALLARGS, CStringGetDatum(procedureName));
+ }
+ for (int i = 0; i < catlist->n_members; ++i) {
+ HeapTuple proctup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
+ Form_pg_proc procform = (Form_pg_proc)GETSTRUCT(proctup);
+ bool isNull = false;
+ Datum packageOidDatum = SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_packageid, &isNull);
+ Oid packageOid = InvalidOid;
+ if (!isNull) {
+ packageOid = DatumGetObjectId(packageOidDatum);
+ }
+ if (packageOid == propackageid && procform->pronamespace == procNamespace) {
+ isNull = false;
+ (void)SysCacheGetAttr(PROCOID, proctup, Anum_pg_proc_proallargtypes, &isNull);
+ if (!isNull) {
+ findOutParamFunc = true;
+ break;
+ }
+ }
+ }
+ ReleaseSysCacheList(catlist);
+ if (existOutParam) {
+ if (!HeapTupleIsValid(oldtup) && findOutParamFunc) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
+ (errmsg("\"%s\" functions with plpgsql language and out params are not supported Overloaded.",
+ procedureName),
+ errdetail("N/A."),
+ errcause("functions with plpgsql language and out params are not supported Overloaded."),
+ erraction("Drop function before create function."))));
+ }
+ }
+ }
+#endif
if (HeapTupleIsValid(oldtup)) {
/* There is one; okay to replace it? */
bool isNull = false;
@@ -1491,7 +1552,8 @@ Oid ProcedureCreate(const char* procedureName, Oid procNamespace, Oid propackage
} else {
/* checking for package function */
bool conflicts =
- checkPackageFunctionConflicts(procedureName, allParameterTypes, parameterTypes, procNamespace, package , propackageid);
+ checkPackageFunctionConflicts(procedureName, allParameterTypes, parameterTypes, parameterModes,
+ procNamespace, package, propackageid, languageObjectId, isOraStyle, replace);
if (conflicts) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
@@ -1502,7 +1564,7 @@ Oid ProcedureCreate(const char* procedureName, Oid procNamespace, Oid propackage
proacl = get_user_default_acl(ACL_OBJECT_FUNCTION, proowner, procNamespace);
if (proacl != NULL)
values[Anum_pg_proc_proacl - 1] = PointerGetDatum(proacl);
- else if (PLSQL_SECURITY_DEFINER){
+ else if (PLSQL_SECURITY_DEFINER && u_sess->attr.attr_common.upgrade_mode == 0){
values[Anum_pg_proc_proacl - 1] = PointerGetDatum(ProcAclDefault(proowner));
} else {
nulls[Anum_pg_proc_proacl - 1] = true;
@@ -1539,6 +1601,7 @@ Oid ProcedureCreate(const char* procedureName, Oid procNamespace, Oid propackage
/* the 'shared dependencies' also change when update. */
deleteSharedDependencyRecordsFor(ProcedureRelationId, retval, 0);
+ (void) deleteDependencyRecordsFor(ClientLogicProcId, retval, true);
/* send invalid message for for relation holding replaced function as trigger */
InvalidRelcacheForTriggerFunction(retval, ((Form_pg_proc)GETSTRUCT(tup))->prorettype);
@@ -1774,9 +1837,9 @@ Datum fmgr_c_validator(PG_FUNCTION_ARGS)
* @param[IN] pstate - parce state
* @param[IN] left node
* @param[IN] right node
- * param[IN] ltypeid: left node type id
- * param[IN] rtypeid : right node type id
- * @return: void
+ * @param[IN] ltypeid: left node type id
+ * @param[IN] rtypeid : right node type id
+ * @return: NULL (to match signature of hook)
*/
Node *sql_create_proc_operator_ref(ParseState *pstate, Node *left, Node *right, Oid *ltypeid, Oid *rtypeid)
{
@@ -1806,7 +1869,8 @@ Node *sql_create_proc_operator_ref(ParseState *pstate, Node *left, Node *right,
* we need to support type casting because the type may be downgraded (for example from double to int and
* it will be truncated)
*/
- if (var->vartypmod == (int)*type) {
+ if (var->vartypmod == (int)*type ||
+ can_coerce_type(1, (Oid*)&(var->vartypmod), (Oid*)type, COERCION_ASSIGNMENT)) {
/* update the parameter data type to the column data type */
*type = var->vartype;
/* update the data types in the parser info structure */
@@ -1850,8 +1914,8 @@ Datum fmgr_sql_validator(PG_FUNCTION_ARGS)
bool replace = false;
/*
- * 3 means the number of arguments of function fmgr_sql_validator, while 'is_place' is the third one,
- * and 2 is the postion of 'is_place' in PG_FUNCTION_ARGS
+ * 3 means the number of arguments of function fmgr_sql_validator, while 'is_replace' is the third one,
+ * and 2 is the position of 'is_replace' in PG_FUNCTION_ARGS
*/
if (PG_NARGS() >= 3) {
replace = PG_GETARG_BOOL(2);
@@ -1997,7 +2061,7 @@ static void sql_function_parse_error_callback(void* arg)
/*
* Adjust a syntax error occurring inside the function body of a CREATE
- * FUNCTION or DO command. This can be used by any function validator or
+ * FUNCTION or DO command. This can be used by any function validator or
* anonymous-block handler, not only for SQL-language functions.
* It is assumed that the syntax error position is initially relative to the
* function body string (as passed in). If possible, we adjust the position
@@ -2115,7 +2179,7 @@ static bool match_prosrc_to_literal(const char* prosrc, const char* literal, int
/*
* This implementation handles backslashes and doubled quotes in the
- * string literal. It does not handle the SQL syntax for literals
+ * string literal. It does not handle the SQL syntax for literals
* continued across line boundaries.
*
* We do the comparison a character at a time, not a byte at a time, so
@@ -2361,90 +2425,6 @@ bool isSameParameterList(List* parameterList1, List* parameterList2)
}
return true;
}
-/*
- * judage the two arglis is same or not
- */
-bool isSameArgList(CreateFunctionStmt* stmt1, CreateFunctionStmt* stmt2)
-{
- List* argList1 = stmt1->parameters;
- List* argList2 = stmt2->parameters;
- ListCell* cell = NULL;
- int length1 = list_length(argList1);
- int length2 = list_length(argList2);
-
- if (length1 != length2) {
- return false;
- }
- FunctionParameter** arr1 = (FunctionParameter**)palloc0(length1 * sizeof(FunctionParameter*));
- FunctionParameter** arr2 = (FunctionParameter**)palloc0(length2 * sizeof(FunctionParameter*));
- int length = 0;
- foreach(cell, argList1) {
- arr1[length] = (FunctionParameter*)lfirst(cell);
- length = length + 1;
- }
- length = 0;
- foreach(cell, argList2) {
- arr2[length] = (FunctionParameter*)lfirst(cell);
- length = length + 1;
- }
- for (int i = 0; i < length1; i++) {
- FunctionParameter* fp1 = arr1[i];
- FunctionParameter* fp2 = arr2[i];
- TypeName* t1 = fp1->argType;
- TypeName* t2 = fp2->argType;
- Oid toid1;
- Oid toid2;
- Type typtup1;
- Type typtup2;
- errno_t rc;
- typtup1 = LookupTypeName(NULL, t1, NULL);
- typtup2 = LookupTypeName(NULL, t2, NULL);
- if (HeapTupleIsValid(typtup1)) {
- toid1 = typeTypeId(typtup1);
- ReleaseSysCache(typtup1);
- } else {
- toid1 = findPackageParameter(strVal(linitial(t1->names)));
- if (!OidIsValid(toid1)) {
- char message[MAXSTRLEN];
- rc = sprintf_s(message, MAXSTRLEN, "type is not exists %s.", fp1->name);
- securec_check_ss_c(rc, "", "");
- InsertErrorMessage(message, stmt1->startLineNumber);
- ereport(ERROR,
- (errmodule(MOD_PLSQL), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("type is not exists %s.", fp1->name),
- errdetail("CommandType: %s", fp1->name),
- errcause("System error."),
- erraction("Contact Huawei Engineer.")));
- }
- }
- if (HeapTupleIsValid(typtup2)) {
- toid2 = typeTypeId(typtup2);
- ReleaseSysCache(typtup2);
- } else {
- toid2 = findPackageParameter(strVal(linitial(t2->names)));
- if (!OidIsValid(toid2)) {
- char message[MAXSTRLEN];
- rc = sprintf_s(message, MAXSTRLEN, "type is not exists %s.", fp2->name);
- securec_check_ss_c(rc, "", "");
- InsertErrorMessage(message, stmt1->startLineNumber);
- ereport(ERROR,
- (errmodule(MOD_PLSQL), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("type is not exists %s.", fp2->name),
- errdetail("CommandType: %s", fp2->name),
- errcause("System error."),
- erraction("Contact Huawei Engineer.")));
- }
- }
- if (toid1 != toid2 || fp1->mode != fp2->mode) {
- pfree(arr1);
- pfree(arr2);
- return false;
- }
- }
- pfree(arr1);
- pfree(arr2);
- return true;
-}
char* getFuncName(List* funcNameList) {
char* schemaname = NULL;
@@ -2454,6 +2434,30 @@ char* getFuncName(List* funcNameList) {
return funcname;
}
+bool isDefinerACL()
+{
+ /*
+ * if in upgrade mode,we can't set package function as definer right.
+ */
+ if (PLSQL_SECURITY_DEFINER && (u_sess->attr.attr_common.upgrade_mode == 0 ||
+ (!OidIsValid(u_sess->upg_cxt.Inplace_upgrade_next_pg_proc_oid) &&
+ u_sess->attr.attr_common.upgrade_mode != 0))) {
+ return true;
+ }
+ return false;
+}
+
+/* make str md5 hash */
+static void make_md5_hash(char* in_str, char* res_hash)
+{
+ text* in_text = cstring_to_text(in_str);
+ size_t len = VARSIZE_ANY_EXHDR(in_text);
+ if (!pg_md5_hash(VARDATA_ANY(in_text), len, res_hash)) {
+ ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of memory")));
+ }
+ pfree_ext(in_text);
+}
+
/* Return decimal value for a hexadecimal digit */
static int get_decimal_from_hex(char hex)
{
@@ -2465,9 +2469,9 @@ static int get_decimal_from_hex(char hex)
}
}
-oidvector* MakeMd5HashArgTypes(oidvector* paramterTypes)
+oidvector* MakeMd5HashOids(oidvector* paramterTypes)
{
- char hex[MD5_HASH_LEN + 1];
+ char* hexarr = (char*)palloc0(sizeof(char) * (MD5_HASH_LEN + 1));
Oid* oidvec = paramterTypes->values;
int parameterCount = paramterTypes->dim1;
@@ -2480,19 +2484,10 @@ oidvector* MakeMd5HashArgTypes(oidvector* paramterTypes)
appendStringInfoSpaces(&oidvec2str, 1);
}
appendStringInfo(&oidvec2str, "%d", oidvec[parameterCount - 1]);
+ /* convert oidvector to text and make md5 hash */
+ make_md5_hash(oidvec2str.data, hexarr);
- /*
- * convert oidvector to text and make md5 hash
- */
- text* in_text = cstring_to_text(oidvec2str.data);
- size_t len = VARSIZE_ANY_EXHDR(in_text);
- if (!pg_md5_hash(VARDATA_ANY(in_text), len, hex)) {
- ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of memory")));
- }
-
pfree_ext(oidvec2str.data);
- pfree_ext(in_text);
- in_text = NULL;
/*
* hex: an MD5 sum is 16 bytes long.
@@ -2500,9 +2495,11 @@ oidvector* MakeMd5HashArgTypes(oidvector* paramterTypes)
*/
Oid hex2oid[MD5_HASH_LEN];
for (i = 0; i < MD5_HASH_LEN; i++) {
- hex2oid[i] = get_decimal_from_hex(hex[i]);
+ hex2oid[i] = get_decimal_from_hex(hexarr[i]);
}
+ pfree_ext(hexarr);
+
/* Build a oidvector using the hash value and use it as allargtypes field value. */
return buildoidvector(hex2oid, MD5_HASH_LEN);
}
@@ -2541,3 +2538,129 @@ Datum ProcedureGetAllArgTypes(HeapTuple tuple, bool* isNull)
}
return allargtypes;
}
+
+#ifndef ENABLE_MULTIPLE_NODES
+char* ConvertArgModesToString(Datum proArgModes)
+{
+ Assert(DatumGetPointer(proArgModes) != NULL);
+
+ ArrayType* arr = DatumGetArrayTypeP(proArgModes);
+ Datum* arrdatum = NULL;
+ int ndatums;
+ deconstruct_array(arr, CHAROID, 1, true, 'c', &arrdatum, NULL, &ndatums);
+ char* str = (char*) palloc0(sizeof(char) * (ndatums + 1));
+ int i;
+ int left = 0;
+ int right = ndatums - 1;
+ char ch;
+ for (i = 0; i < ndatums; i++) {
+ ch = DatumGetChar(arrdatum[i]);
+ if (ch == 'i') {
+ str[left] = 'i';
+ left++;
+ } else if (ch == 'b') {
+ str[right] = 'b';
+ right--;
+ }
+ }
+ for (i = left; i <= right; i++) {
+ str[i] = 'o';
+ }
+ str[ndatums] = '\0';
+ pfree_ext(arrdatum);
+ return str;
+}
+
+bool IsProArgModesEqual(Datum argModes1, Datum argModes2)
+{
+ bool isEqual = false;
+ if (DatumGetPointer(argModes1) == NULL && DatumGetPointer(argModes2) == NULL) {
+ isEqual = true;
+ } else if (DatumGetPointer(argModes1) != NULL && DatumGetPointer(argModes2) != NULL) {
+ char* str1 = ConvertArgModesToString(argModes1);
+ char* str2 = ConvertArgModesToString(argModes2);
+ if (strcmp(str1, str2) == 0) {
+ isEqual = true;
+ }
+ pfree_ext(str1);
+ pfree_ext(str2);
+ }
+ return isEqual;
+}
+
+bool IsProArgModesEqualByTuple(HeapTuple tup, TupleDesc desc, oidvector* argModes)
+{
+ bool isNull = false;
+ Datum argmodes = heap_getattr(tup, Anum_pg_proc_proargmodes, desc, &isNull);
+ oidvector* oriArgModesVec = ConvertArgModesToMd5Vector(argmodes);
+
+ bool isEqual = DatumGetBool(
+ DirectFunctionCall2(oidvectoreq, PointerGetDatum(oriArgModesVec), PointerGetDatum(argModes)));
+
+ pfree_ext(oriArgModesVec);
+ return isEqual;
+}
+
+oidvector* ConvertArgModesToMd5Vector(Datum proArgModes)
+{
+ char* modesStr = NULL;
+ char* hexarr = (char*)palloc0(sizeof(char) * (MD5_HASH_LEN + 1));
+ int i;
+ if (proArgModes != PointerGetDatum(NULL)) {
+ modesStr = ConvertArgModesToString(proArgModes);
+ } else {
+ modesStr = (char*)palloc0(sizeof(char));
+ modesStr[0] = '\0';
+ }
+ make_md5_hash(modesStr, hexarr);
+
+ pfree_ext(modesStr);
+
+ Oid hex2oid[MD5_HASH_LEN];
+ for (i = 0; i < MD5_HASH_LEN; i++) {
+ hex2oid[i] = get_decimal_from_hex(hexarr[i]);
+ }
+
+ pfree_ext(hexarr);
+
+ return buildoidvector(hex2oid, MD5_HASH_LEN);
+}
+
+oidvector* MergeOidVector(oidvector* allArgTypes, oidvector* argModes)
+{
+ Assert(allArgTypes != NULL);
+ Assert(argModes != NULL);
+
+ oidvector* res = NULL;
+
+ int len1 = allArgTypes->dim1;
+ int len2 = argModes->dim1;
+
+ errno_t rc = EOK;
+ Oid* oids = (Oid*)palloc0(sizeof(Oid) * (len1 + len2));
+ rc = memcpy_s(oids, (len1 + len2) * sizeof(Oid), allArgTypes->values, len1 * sizeof(Oid));
+ securec_check(rc, "\0", "\0");
+ rc = memcpy_s(&oids[len1], len2 * sizeof(Oid), argModes->values, len2 * sizeof(Oid));
+ securec_check(rc, "\0", "\0");
+
+ res = buildoidvector(oids, len1 + len2);
+
+ pfree_ext(oids);
+
+ return res;
+}
+
+static void CheckInParameterConflicts(CatCList* catlist, const char* procedureName, oidvector* inpara_type,
+ oidvector* proc_para_type, Oid languageId, bool isOraStyle, bool replace)
+{
+ if (IsPlpgsqlLanguageOid(languageId) && !isOraStyle) {
+ bool same = DatumGetBool(
+ DirectFunctionCall2(oidvectoreq, PointerGetDatum(inpara_type), PointerGetDatum(proc_para_type)));
+ if (same && !replace) {
+ ReleaseSysCacheList(catlist);
+ ereport(ERROR, (errcode(ERRCODE_DUPLICATE_FUNCTION),
+ errmsg("function \"%s\" already exists with same argument types", procedureName)));
+ }
+ }
+}
+#endif
diff --git a/src/common/backend/catalog/pg_publication.cpp b/src/common/backend/catalog/pg_publication.cpp
index d3a85932d..9900f25bd 100644
--- a/src/common/backend/catalog/pg_publication.cpp
+++ b/src/common/backend/catalog/pg_publication.cpp
@@ -107,6 +107,16 @@ static Publication *GetPublication(Oid pubid)
*/
static bool is_publishable_class(Oid relid, Form_pg_class reltuple)
{
+ /* internal namespace, doesn't need to publish */
+ if (reltuple->relnamespace == CSTORE_NAMESPACE || reltuple->relnamespace == PG_PKG_SERVICE_NAMESPACE ||
+#ifndef ENABLE_MULTIPLE_NODES
+ reltuple->relnamespace == DBE_PLDEVELOPER_NAMESPACE ||
+#endif
+ reltuple->relnamespace == PG_SNAPSHOT_NAMESPACE || reltuple->relnamespace == PG_SQLADVISOR_NAMESPACE ||
+ reltuple->relnamespace == PG_BLOCKCHAIN_NAMESPACE || reltuple->relnamespace == PG_DB4AI_NAMESPACE ||
+ reltuple->relnamespace == PG_PLDEBUG_NAMESPACE) {
+ return false;
+ }
return reltuple->relkind == RELKIND_RELATION && !IsCatalogClass(relid, reltuple) &&
reltuple->relpersistence == RELPERSISTENCE_PERMANENT &&
/*
@@ -210,7 +220,7 @@ List *GetRelationPublications(Oid relid)
/* Find all publications associated with the relation. */
pubrellist = SearchSysCacheList1(PUBLICATIONRELMAP, ObjectIdGetDatum(relid));
for (i = 0; i < pubrellist->n_members; i++) {
- HeapTuple tup = &pubrellist->members[i]->tuple;
+ HeapTuple tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(pubrellist, i);
Oid pubid = ((Form_pg_publication_rel)GETSTRUCT(tup))->prpubid;
result = lappend_oid(result, pubid);
diff --git a/src/common/backend/catalog/pg_shdepend.cpp b/src/common/backend/catalog/pg_shdepend.cpp
index c39d4264a..f56445846 100644
--- a/src/common/backend/catalog/pg_shdepend.cpp
+++ b/src/common/backend/catalog/pg_shdepend.cpp
@@ -22,6 +22,7 @@
#include "catalog/catalog.h"
#include "catalog/dependency.h"
#include "catalog/indexing.h"
+#include "catalog/gs_db_privilege.h"
#include "catalog/gs_package.h"
#include "catalog/pg_authid.h"
#include "catalog/pg_collation.h"
@@ -1092,6 +1093,8 @@ static void storeObjectDescription(
appendStringInfo(descs, _("privileges for %s"), objdesc);
else if (deptype == SHARED_DEPENDENCY_RLSPOLICY)
appendStringInfo(descs, _("target of %s"), objdesc);
+ else if (deptype == SHARED_DEPENDENCY_DBPRIV)
+ appendStringInfo(descs, _("privileges for %s"), objdesc);
else
ereport(ERROR,
(errcode(ERRCODE_UNRECOGNIZED_NODE_TYPE),
@@ -1243,6 +1246,14 @@ void shdepDropOwned(List* roleids, DropBehavior behavior)
add_exact_object_address(&obj, deleteobjs);
}
break;
+ case SHARED_DEPENDENCY_DBPRIV:
+ if (sdepForm->dbid == u_sess->proc_cxt.MyDatabaseId) {
+ obj.classId = sdepForm->classid;
+ obj.objectId = sdepForm->objid;
+ obj.objectSubId = sdepForm->objsubid;
+ add_exact_object_address(&obj, deleteobjs);
+ }
+ break;
default:
break;
}
diff --git a/src/common/backend/catalog/pg_subscription.cpp b/src/common/backend/catalog/pg_subscription.cpp
index 03e5f92cb..3d1d6833e 100644
--- a/src/common/backend/catalog/pg_subscription.cpp
+++ b/src/common/backend/catalog/pg_subscription.cpp
@@ -28,7 +28,7 @@
#include "utils/builtins.h"
#include "utils/fmgroids.h"
#include "utils/syscache.h"
-
+#include "replication/worker_internal.h"
static List *textarray_to_stringlist(ArrayType *textarray);
@@ -62,7 +62,9 @@ Subscription *GetSubscription(Oid subid, bool missing_ok)
/* Get conninfo */
datum = SysCacheGetAttr(SUBSCRIPTIONOID, tup, Anum_pg_subscription_subconninfo, &isnull);
- Assert(!isnull);
+ if (unlikely(isnull)) {
+ ereport(ERROR, (errcode(ERRCODE_UNEXPECTED_NULL_VALUE), errmsg("null conninfo for subscription %u", subid)));
+ }
sub->conninfo = TextDatumGetCString(datum);
/* Get slotname */
@@ -75,12 +77,18 @@ Subscription *GetSubscription(Oid subid, bool missing_ok)
/* Get synccommit */
datum = SysCacheGetAttr(SUBSCRIPTIONOID, tup, Anum_pg_subscription_subsynccommit, &isnull);
- Assert(!isnull);
+ if (unlikely(isnull)) {
+ ereport(ERROR, (errcode(ERRCODE_UNEXPECTED_NULL_VALUE),
+ errmsg("null synccommit for subscription %u", subid)));
+ }
sub->synccommit = TextDatumGetCString(datum);
/* Get publications */
datum = SysCacheGetAttr(SUBSCRIPTIONOID, tup, Anum_pg_subscription_subpublications, &isnull);
- Assert(!isnull);
+ if (unlikely(isnull)) {
+ ereport(ERROR, (errcode(ERRCODE_UNEXPECTED_NULL_VALUE),
+ errmsg("null publications for subscription %u", subid)));
+ }
sub->publications = textarray_to_stringlist(DatumGetArrayTypeP(datum));
ReleaseSysCache(tup);
@@ -121,6 +129,7 @@ int CountDBSubscriptions(Oid dbid)
*/
void FreeSubscription(Subscription *sub)
{
+ pfree(sub->synccommit);
pfree(sub->name);
pfree(sub->conninfo);
if (sub->slotname) {
@@ -173,6 +182,46 @@ char *get_subscription_name(Oid subid, bool missing_ok)
return subname;
}
+/* Clear the list content, only deal with DefElem and string content */
+static void ClearListContent(List *list)
+{
+ ListCell *cell = NULL;
+ foreach(cell, list) {
+ DefElem* def = (DefElem*)lfirst(cell);
+ if (def->arg == NULL || !IsA(def->arg, String)) {
+ continue;
+ }
+
+ char *str = strVal(def->arg);
+ if (str == NULL || str[0] == '\0') {
+ continue;
+ }
+
+ size_t len = strlen(str);
+ errno_t errCode = memset_s(str, len, 0, len);
+ securec_check(errCode, "\0", "\0");
+ }
+}
+
+/*
+ * Decrypt conninfo for subscription.
+ * IMPORTANT: caller should clear and free the memory after using it immediately
+ */
+char *DecryptConninfo(char *encryptConninfo)
+{
+ const char* sensitiveOptionsArray[] = {"password"};
+ const int sensitiveArrayLength = lengthof(sensitiveOptionsArray);
+ List *defList = ConninfoToDefList(encryptConninfo);
+ DecryptOptions(defList, sensitiveOptionsArray, sensitiveArrayLength, SUBSCRIPTION_MODE);
+ char *decryptConninfo = DefListToString(defList);
+
+ /* defList has plain content, clear it before free */
+ ClearListContent(defList);
+ list_free_ext(defList);
+ /* IMPORTANT: caller should clear and free the memory after using it immediately */
+ return decryptConninfo;
+}
+
/*
* Convert text array to list of strings.
*
diff --git a/src/common/backend/catalog/pg_synonym.cpp b/src/common/backend/catalog/pg_synonym.cpp
index 73e22ecdc..8bcac70c3 100644
--- a/src/common/backend/catalog/pg_synonym.cpp
+++ b/src/common/backend/catalog/pg_synonym.cpp
@@ -326,6 +326,44 @@ void AlterSynonymOwner(List* name, Oid newOwnerId)
heap_close(rel, RowExclusiveLock);
}
+/*
+ * AlterSynonymOwnerByOid - ALTER Synonym OWNER TO newowner by Oid
+ * This is currently only used to propagate ALTER PACKAGE OWNER to a
+ * package. Package will build Synonym for ref cursor type.
+ * It assumes the caller has done all needed checks.
+ */
+void AlterSynonymOwnerByOid(Oid synonymOid, Oid newOwnerId)
+{
+ HeapTuple tuple = NULL;
+ Relation rel = NULL;
+
+ rel = heap_open(PgSynonymRelationId, RowExclusiveLock);
+ tuple = SearchSysCache1(SYNOID, ObjectIdGetDatum(synonymOid));
+ if (!HeapTupleIsValid(tuple)) {
+ ereport(
+ ERROR, (errcode(ERRCODE_CACHE_LOOKUP_FAILED), errmsg("cache lookup failed for synonym %u", synonymOid)));
+ }
+ Form_pg_synonym synForm = (Form_pg_synonym)GETSTRUCT(tuple);
+
+ /*
+ * If the new owner is the same as the existing owner, consider the command to have succeeded.
+ * ps. This is for dump restoration purposes.
+ */
+ if (synForm->synowner != newOwnerId) {
+ /* Change its owner */
+ synForm->synowner = newOwnerId;
+
+ simple_heap_update(rel, &tuple->t_self, tuple);
+ CatalogUpdateIndexes(rel, tuple);
+
+ /* Update owner dependency reference. */
+ changeDependencyOnOwner(PgSynonymRelationId, HeapTupleGetOid(tuple), newOwnerId);
+ }
+
+ ReleaseSysCache(tuple);
+ heap_close(rel, NoLock);
+}
+
/*
* RemoveSynonymById
* Given synonym oid, remove the synonym tuple.
diff --git a/src/common/backend/catalog/pg_uid.cpp b/src/common/backend/catalog/pg_uid.cpp
new file mode 100644
index 000000000..1b157d105
--- /dev/null
+++ b/src/common/backend/catalog/pg_uid.cpp
@@ -0,0 +1,272 @@
+/*
+ * Copyright (c) Huawei Technologies Co.,Ltd. 2021-2023. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * -------------------------------------------------------------------------
+ *
+ * pg_uid.cpp
+ *
+ * IDENTIFICATION
+ * src/common/backend/catalog/pg_uid.cpp
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "catalog/namespace.h"
+#include "catalog/pg_uid.h"
+#include "catalog/pg_uid_fn.h"
+#include "catalog/storage.h"
+#include "utils/rel.h"
+#include "utils/inval.h"
+#include "utils/builtins.h"
+#include "catalog/indexing.h"
+#include "catalog/pgxc_class.h"
+#include "pgxc/redistrib.h"
+#include "storage/lock/lock.h"
+#include "tcop/utility.h"
+#include "utils/syscache.h"
+#include "utils/fmgroids.h"
+#include "access/heapam.h"
+#include "utils/snapmgr.h"
+#include "access/xact.h"
+#include "access/hash.h"
+#include "pgxc/groupmgr.h"
+#include "pgxc/pgxc.h"
+#include "access/reloptions.h"
+#include "access/hbucket_am.h"
+#include "executor/node/nodeModifyTable.h"
+#include "nodes/makefuncs.h"
+
+static UidHashValue* FindUidHashCache(Oid dbOid, Oid relOid);
+
+void DeleteDatabaseUidEntry(Oid dbOid)
+{
+ HASH_SEQ_STATUS status;
+ UidHashValue* entry;
+ LWLockAcquire(HashUidLock, LW_EXCLUSIVE);
+ hash_seq_init(&status, t_thrd.storage_cxt.uidHashCache);
+ while ((entry = (UidHashValue *) hash_seq_search(&status)) != NULL) {
+ if (entry->key.dbOid != dbOid) {
+ continue;
+ }
+ if (hash_search(t_thrd.storage_cxt.uidHashCache, &entry->key, HASH_REMOVE, NULL) == NULL) {
+ ereport(ERROR, (errmsg("uid hash cache corrupted")));
+ }
+ }
+ LWLockRelease(HashUidLock);
+}
+
+/* Delete uid entry in gs_uid, only drop table call this function. */
+void DeleteUidEntry(Oid relid)
+{
+ HeapTuple tuple = SearchSysCache1(UIDRELID, relid);
+ if (!HeapTupleIsValid(tuple)) {
+ return;
+ }
+
+ /* remove hash table fisrt */
+ UidHashKey key = {.dbOid = u_sess->proc_cxt.MyDatabaseId, .relOid = relid};
+ LWLockAcquire(HashUidLock, LW_EXCLUSIVE);
+ (void)hash_search(t_thrd.storage_cxt.uidHashCache, (void*)&key, HASH_REMOVE, NULL);
+ LWLockRelease(HashUidLock);
+
+ Relation gs_uid = heap_open(UidRelationId, RowExclusiveLock);
+ simple_heap_delete(gs_uid, &tuple->t_self);
+ ReleaseSysCache(tuple);
+ heap_close(gs_uid, RowExclusiveLock);
+ return;
+}
+
+void InsertUidEntry(Oid relid)
+{
+ Datum values[Natts_gs_uid];
+ bool nulls[Natts_gs_uid];
+ errno_t errorno = EOK;
+
+ HeapTuple tuple = SearchSysCache1(UIDRELID, relid);
+ /* already inserted one */
+ if (HeapTupleIsValid(tuple)) {
+ ReleaseSysCache(tuple);
+ return;
+ }
+
+ /* This is a tad tedious, but way cleaner than what we used to do... */
+ errorno = memset_s(values, sizeof(values), 0, sizeof(values));
+ securec_check_c(errorno, "\0", "\0");
+
+ errorno = memset_s(nulls, sizeof(nulls), 0, sizeof(nulls));
+ securec_check_c(errorno, "\0", "\0");
+
+ Relation gs_uid = heap_open(UidRelationId, RowExclusiveLock);
+ values[Anum_gs_uid_relid - 1] = ObjectIdGetDatum(relid);
+ values[Anum_gs_uid_backup - 1] = UInt64GetDatum(0);
+ HeapTuple newTuple = heap_form_tuple(RelationGetDescr(gs_uid), values, nulls);
+ (void)simple_heap_insert(gs_uid, newTuple);
+ CatalogUpdateIndexes(gs_uid, newTuple);
+
+ heap_freetuple_ext(newTuple);
+ heap_close(gs_uid, RowExclusiveLock);
+ return;
+}
+static void UpdateUidEntryInternal(Oid relOid, uint64 &backupUid, bool init)
+{
+ Relation gs_uid = heap_open(UidRelationId, RowExclusiveLock);
+ HeapTuple tuple = SearchSysCacheCopy1(UIDRELID, relOid);
+ Assert(HeapTupleIsValid(tuple));
+ Form_gs_uid relUid = (Form_gs_uid)GETSTRUCT(tuple);
+ if (init) {
+ backupUid = relUid->uid_backup + UID_RESTORE_DURATION;
+ }
+ if ((uint64)relUid->uid_backup < backupUid) { /* check again */
+ relUid->uid_backup = backupUid;
+ heap_inplace_update(gs_uid, tuple, true);
+ }
+ heap_freetuple_ext(tuple);
+ heap_close(gs_uid, RowExclusiveLock);
+}
+
+static bool UidEntryExist(Oid relOid)
+{
+ HeapTuple tuple = SearchSysCache1(UIDRELID, relOid);
+ if (!HeapTupleIsValid(tuple)) {
+ return false;
+ } else {
+ ReleaseSysCache(tuple);
+ return true;
+ }
+}
+
+static bool UpdateUidEntry(Relation relation, uint64 backupUid, UidHashValue* value)
+{
+ uint32 expected = BACKUP_NO_START;
+ bool backup = pg_atomic_compare_exchange_u32(&value->backUpState,
+ &expected, BACKUP_IN_PROGRESS);
+ if (!backup) {
+ return false; /* other one is doing the same thing */
+ }
+ Assert(value);
+ /* recheck again, quick bypass */
+ if (value->backupUidRange >= backupUid) { /* safe to compare if hold uidBackup flag */
+ pg_atomic_write_u32(&value->backUpState, BACKUP_NO_START);
+ return false;
+ }
+ PG_TRY();
+ {
+ UpdateUidEntryInternal(RelationGetRelid(relation), backupUid, false);
+ }
+ PG_CATCH();
+ {
+ ereport(LOG, (errmsg("Update uid hash cache failed.")));
+ pg_atomic_write_u32(&value->backUpState, BACKUP_NO_START);
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+ value->backupUidRange = backupUid; /* safe to write if hold uidBackup flag */
+ pg_atomic_write_u32(&value->backUpState, BACKUP_NO_START);
+ return true;
+}
+
+void InitUidCache(void)
+{
+ int rc = 0;
+ HASHCTL ctl;
+ rc = memset_s(&ctl, sizeof(ctl), 0, sizeof(ctl));
+ securec_check(rc, "\0", "\0");
+
+ ctl.keysize = sizeof(UidHashKey);
+ ctl.entrysize = sizeof(UidHashValue);
+ ctl.hash = tag_hash;
+ t_thrd.storage_cxt.uidHashCache = HeapMemInitHash(
+ "Shared Uid hash by request", 64, 256, &ctl, HASH_ELEM | HASH_FUNCTION);
+ if (!t_thrd.storage_cxt.uidHashCache)
+ ereport(FATAL, (errmsg("could not initialize shared uid hash table")));
+}
+
+static UidHashValue* FindUidHashCache(Oid dbOid, Oid relOid)
+{
+ UidHashKey key = {.dbOid = dbOid, .relOid = relOid};
+ UidHashValue* value = NULL;
+ LWLockAcquire(HashUidLock, LW_SHARED);
+ value = (UidHashValue*)hash_search(t_thrd.storage_cxt.uidHashCache,
+ (void*)&key, HASH_FIND, NULL);
+ LWLockRelease(HashUidLock);
+ return value;
+}
+
+void BuildUidHashCache(Oid dbOid, Oid relOid)
+{
+ if (FindUidHashCache(dbOid, relOid) || !UidEntryExist(relOid) || RecoveryInProgress()) {
+ return;
+ }
+ UidHashKey key = {.dbOid = dbOid, .relOid = relOid};
+ UidHashValue* value = NULL;
+ bool found = false;
+ LWLockAcquire(HashUidLock, LW_EXCLUSIVE);
+ value = (UidHashValue*)hash_search(t_thrd.storage_cxt.uidHashCache,
+ (void*)&key, HASH_ENTER, &found);
+ if (!found) {
+ PG_TRY();
+ {
+ uint64 backupUid = 0;
+ UpdateUidEntryInternal(relOid, backupUid, true);
+ Assert(backupUid - UID_RESTORE_DURATION >= 0);
+ value->currentUid = (backupUid - UID_RESTORE_DURATION) + 1;
+ value->backupUidRange = backupUid;
+ value->backUpState = BACKUP_NO_START;
+ }
+ PG_CATCH();
+ {
+ ereport(LOG, (errmsg("Build uid hash cache failed.")));
+ hash_search(t_thrd.storage_cxt.uidHashCache, (void*)&key, HASH_REMOVE, NULL);
+ LWLockRelease(HashUidLock);
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+ }
+ LWLockRelease(HashUidLock);
+}
+
+#define FetchCurState(curBackupUid, curUid, value) \
+ do { \
+ curBackupUid = pg_atomic_read_u64(&value->backupUidRange); \
+ curUid = pg_atomic_read_u64(&value->currentUid); \
+ } while (0)
+
+#define TRIGGER_FACTOR (4)
+uint64 GetNewUidForTuple(Relation relation)
+{
+ Assert(RELATION_HAS_UIDS(relation));
+ Oid dbOid = relation->rd_node.dbNode;
+ Oid relOid = RelationGetRelid(relation);
+ UidHashValue* value = (UidHashValue*)FindUidHashCache(dbOid, relOid);
+ if (value == NULL) {
+ BuildUidHashCache(dbOid, relOid);
+ value = (UidHashValue*)FindUidHashCache(dbOid, relOid);
+ }
+ Assert(value);
+ uint64 res;
+ uint64 curBackupUid;
+ uint64 curUid;
+ FetchCurState(curBackupUid, curUid, value);
+ if (curUid + (uint64)UID_RESTORE_DURATION / TRIGGER_FACTOR > curBackupUid) {
+ (void)UpdateUidEntry(relation, curBackupUid + UID_RESTORE_DURATION, value);
+ }
+ res = pg_atomic_fetch_add_u64(&value->currentUid, 1);
+ FetchCurState(curBackupUid, curUid, value);
+ while (res > curBackupUid) {
+ (void)UpdateUidEntry(relation, curBackupUid + UID_RESTORE_DURATION, value);
+ pg_usleep(10000L); /* 10ms delay */
+ FetchCurState(curBackupUid, curUid, value);
+ }
+ return res;
+}
+
diff --git a/src/common/backend/catalog/pgxc_slice.cpp b/src/common/backend/catalog/pgxc_slice.cpp
index d7f886f1c..7eeeef904 100644
--- a/src/common/backend/catalog/pgxc_slice.cpp
+++ b/src/common/backend/catalog/pgxc_slice.cpp
@@ -77,7 +77,7 @@ static void AddReferencedSlices(Oid relid, DistributeBy *distributeby)
relation = heap_open(PgxcSliceRelationId, RowExclusiveLock);
for (i = 0; i < slicelist->n_members; i++) {
- tup = &slicelist->members[i]->tuple;
+ tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(slicelist, i);
bool isnull = false;
Datum val = fastgetattr(tup, Anum_pgxc_slice_type, RelationGetDescr(relation), &isnull);
if (DatumGetChar(val) == PGXC_SLICE_TYPE_TABLE) {
@@ -299,7 +299,7 @@ void RemovePgxcSlice(Oid relid)
CatCList *slicelist = SearchSysCacheList1(PGXCSLICERELID, ObjectIdGetDatum(relid));
for (int i = 0; i < slicelist->n_members; i++) {
- tup = &slicelist->members[i]->tuple;
+ tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(slicelist, i);
simple_heap_delete(relation, &tup->t_self);
}
ReleaseSysCacheList(slicelist);
diff --git a/src/common/backend/catalog/storage.cpp b/src/common/backend/catalog/storage.cpp
index 02c4a420d..d5f6f52be 100644
--- a/src/common/backend/catalog/storage.cpp
+++ b/src/common/backend/catalog/storage.cpp
@@ -40,6 +40,7 @@
#include "catalog/pg_hashbucket_fn.h"
#include "catalog/pg_tablespace.h"
#include "commands/tablespace.h"
+#include "commands/verify.h"
#include "pgxc/pgxc.h"
#include "storage/freespace.h"
#include "storage/lmgr.h"
@@ -318,30 +319,17 @@ void log_smgrcreate(RelFileNode* rnode, ForkNumber forkNum)
if (IsSegmentFileNode(*rnode)) {
return;
}
-
- xl_smgr_create_compress xlrec;
- uint size;
- uint8 info = XLOG_SMGR_CREATE | XLR_SPECIAL_REL_UPDATE;
- /*
- * compressOptions Copy
- */
- if (rnode->opt != 0) {
- xlrec.pageCompressOpts = rnode->opt;
- size = sizeof(xl_smgr_create_compress);
- info |= XLR_REL_COMPRESS;
- } else {
- size = sizeof(xl_smgr_create);
- }
-
+
/*
* Make an XLOG entry reporting the file creation.
*/
- xlrec.xlrec.forkNum = forkNum;
- RelFileNodeRelCopy(xlrec.xlrec.rnode, *rnode);
+ xl_smgr_create xlrec;
+ xlrec.forkNum = forkNum;
+ RelFileNodeRelCopy(xlrec.rnode, *rnode);
XLogBeginInsert();
- XLogRegisterData((char*)&xlrec, size);
- XLogInsert(RM_SMGR_ID, info, false, rnode->bucketNode);
+ XLogRegisterData((char*)&xlrec, sizeof(xlrec));
+ XLogInsert(RM_SMGR_ID, XLOG_SMGR_CREATE | XLR_SPECIAL_REL_UPDATE, rnode->bucketNode);
}
static void CStoreRelDropStorage(Relation rel, RelFileNode* rnode, Oid ownerid)
@@ -703,26 +691,15 @@ void RelationTruncate(Relation rel, BlockNumber nblocks)
* Make an XLOG entry reporting the file truncation.
*/
XLogRecPtr lsn;
- xl_smgr_truncate_compress xlrec;
- uint size;
- uint8 info = XLOG_SMGR_TRUNCATE | XLR_SPECIAL_REL_UPDATE;
+ xl_smgr_truncate xlrec;
- xlrec.xlrec.blkno = nblocks;
-
- if (rel->rd_node.opt != 0) {
- xlrec.pageCompressOpts = rel->rd_node.opt;
- size = sizeof(xl_smgr_truncate_compress);
- info |= XLR_REL_COMPRESS;
- } else {
- size = sizeof(xl_smgr_truncate);
- }
-
- RelFileNodeRelCopy(xlrec.xlrec.rnode, rel->rd_node);
+ xlrec.blkno = nblocks;
+ RelFileNodeRelCopy(xlrec.rnode, rel->rd_node);
XLogBeginInsert();
- XLogRegisterData((char*)&xlrec, size);
+ XLogRegisterData((char*)&xlrec, sizeof(xlrec));
- lsn = XLogInsert(RM_SMGR_ID, info, false, rel->rd_node.bucketNode);
+ lsn = XLogInsert(RM_SMGR_ID, XLOG_SMGR_TRUNCATE | XLR_SPECIAL_REL_UPDATE, rel->rd_node.bucketNode);
/*
* Flush, because otherwise the truncation of the main relation might
@@ -742,6 +719,7 @@ void RelationTruncate(Relation rel, BlockNumber nblocks)
/* Do the real work */
smgrtruncate(rel->rd_smgr, MAIN_FORKNUM, nblocks);
+ BatchClearBadBlock(rel->rd_node, MAIN_FORKNUM, nblocks);
}
void PartitionTruncate(Relation parent, Partition part, BlockNumber nblocks)
@@ -799,7 +777,7 @@ void PartitionTruncate(Relation parent, Partition part, BlockNumber nblocks)
XLogBeginInsert();
XLogRegisterData((char*)&xlrec, sizeof(xlrec));
- lsn = XLogInsert(RM_SMGR_ID, XLOG_SMGR_TRUNCATE | XLR_SPECIAL_REL_UPDATE, false, part->pd_node.bucketNode);
+ lsn = XLogInsert(RM_SMGR_ID, XLOG_SMGR_TRUNCATE | XLR_SPECIAL_REL_UPDATE, part->pd_node.bucketNode);
/*
* Flush, because otherwise the truncation of the main relation might
@@ -817,6 +795,7 @@ void PartitionTruncate(Relation parent, Partition part, BlockNumber nblocks)
/* Do the real work */
smgrtruncate(rel->rd_smgr, MAIN_FORKNUM, nblocks);
+ BatchClearBadBlock(rel->rd_node, MAIN_FORKNUM, nblocks);
/* release fake relation */
releaseDummyRelation(&rel);
@@ -967,6 +946,7 @@ void push_del_rel_to_hashtbl(bool isCommit)
entry->rnode.bucketNode = pending->relnode.bucketNode;
entry->maxSegNo = -1;
}
+ BatchClearBadBlock(pending->relnode, pending->forknum, 0);
}
}
}
@@ -1233,7 +1213,7 @@ void smgr_redo(XLogReaderState* record)
{
XLogRecPtr lsn = record->EndRecPtr;
uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
- bool compress = XLogRecGetInfo(record) & XLR_REL_COMPRESS;
+
/* Backup blocks are not used in smgr records */
Assert(!XLogRecHasAnyBlockRefs(record));
@@ -1242,14 +1222,14 @@ void smgr_redo(XLogReaderState* record)
RelFileNode rnode;
RelFileNodeCopy(rnode, xlrec->rnode, XLogRecGetBucketId(record));
- rnode.opt = compress ? ((xl_smgr_create_compress*)XLogRecGetData(record))->pageCompressOpts : 0;
- smgr_redo_create(rnode, xlrec->forkNum, (char *)xlrec);
- /* Redo column file, attid is hidden in forkNum */
+ smgr_redo_create(rnode, xlrec->forkNum, (char *)xlrec);
+ /* Redo column file, attid is hidden in forkNum */
+
} else if (info == XLOG_SMGR_TRUNCATE) {
xl_smgr_truncate* xlrec = (xl_smgr_truncate*)XLogRecGetData(record);
RelFileNode rnode;
RelFileNodeCopy(rnode, xlrec->rnode, XLogRecGetBucketId(record));
- rnode.opt = compress ? ((xl_smgr_truncate_compress*)XLogRecGetData(record))->pageCompressOpts : 0;
+
/*
* Forcibly create relation if it doesn't exist (which suggests that
* it was dropped somewhere later in the WAL sequence). As in
@@ -1290,7 +1270,7 @@ void smgrApplyXLogTruncateRelation(XLogReaderState* record)
smgrclosenode(rbnode);
- XLogTruncateRelation(record, rbnode.node, MAIN_FORKNUM, xlrec->blkno);
+ XLogTruncateRelation(rbnode.node, MAIN_FORKNUM, xlrec->blkno);
}
/*
@@ -2192,13 +2172,6 @@ void ColMainFileNodesAppend(RelFileNode* bcmFileNode, BackendId backend)
u_sess->catalog_cxt.ColMainFileNodes[u_sess->catalog_cxt.ColMainFileNodesCurNum].node = *bcmFileNode;
u_sess->catalog_cxt.ColMainFileNodes[u_sess->catalog_cxt.ColMainFileNodesCurNum].backend = backend;
++u_sess->catalog_cxt.ColMainFileNodesCurNum;
-
- ereport(DEBUG1,
- (errmsg("Row[MAIN] relation dropped: %u/%u/%u backend(%d)",
- bcmFileNode->spcNode,
- bcmFileNode->dbNode,
- bcmFileNode->relNode,
- backend)));
}
/* search some one in Column Heap Main file list.
diff --git a/src/common/backend/catalog/system_views.sql b/src/common/backend/catalog/system_views.sql
index 883bdb3ff..10bee9baf 100644
--- a/src/common/backend/catalog/system_views.sql
+++ b/src/common/backend/catalog/system_views.sql
@@ -111,7 +111,7 @@ CREATE VIEW pg_rules AS
N.nspname AS schemaname,
C.relname AS tablename,
R.rulename AS rulename,
- pg_get_ruledef(R.oid) AS definition
+ pg_catalog.pg_get_ruledef(R.oid) AS definition
FROM (pg_rewrite R JOIN pg_class C ON (C.oid = R.ev_class))
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE R.rulename != '_RETURN';
@@ -140,7 +140,7 @@ SELECT labelname
WHEN 'column' THEN relcolumn
ELSE ''
END AS columnname
-FROM gs_policy_label WHERE length(fqdntype)>0 ORDER BY labelname, labeltype ,fqdntype;
+FROM gs_policy_label WHERE pg_catalog.length(fqdntype)>0 ORDER BY labelname, labeltype ,fqdntype;
REVOKE ALL on pg_catalog.gs_labels FROM public;
--for audit
@@ -168,7 +168,7 @@ create view pg_catalog.gs_auditing_access as
from gs_auditing_policy p
left join gs_auditing_policy_access a ON (a.policyoid=p.Oid)
left join gs_labels l ON (a.labelname=l.labelname)
- where length(a.accesstype) > 0 order by 1,3;
+ where pg_catalog.length(a.accesstype) > 0 order by 1,3;
REVOKE ALL on pg_catalog.gs_auditing_access FROM public;
@@ -196,7 +196,7 @@ create view pg_catalog.gs_auditing_privilege as
from gs_auditing_policy p
left join gs_auditing_policy_privileges priv ON (priv.policyoid=p.Oid)
left join gs_labels l ON (priv.labelname=l.labelname)
- where length(priv.privilegetype) > 0 order by 1,3;
+ where pg_catalog.length(priv.privilegetype) > 0 order by 1,3;
REVOKE ALL on pg_catalog.gs_auditing_privilege FROM public;
@@ -272,8 +272,8 @@ CREATE VIEW pg_views AS
SELECT
N.nspname AS schemaname,
C.relname AS viewname,
- pg_get_userbyid(C.relowner) AS viewowner,
- pg_get_viewdef(C.oid) AS definition
+ pg_catalog.pg_get_userbyid(C.relowner) AS viewowner,
+ pg_catalog.pg_get_viewdef(C.oid) AS definition
FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind = 'v';
@@ -281,13 +281,13 @@ CREATE VIEW pg_tables AS
SELECT
N.nspname AS schemaname,
C.relname AS tablename,
- pg_get_userbyid(C.relowner) AS tableowner,
+ pg_catalog.pg_get_userbyid(C.relowner) AS tableowner,
T.spcname AS tablespace,
C.relhasindex AS hasindexes,
C.relhasrules AS hasrules,
C.relhastriggers AS hastriggers,
case
- when pg_check_authid(po.creator) then pg_get_userbyid(po.creator)
+ when pg_catalog.pg_check_authid(po.creator) then pg_catalog.pg_get_userbyid(po.creator)
else CAST(NULL AS name)
end as tablecreator,
po.ctime AS created,
@@ -301,10 +301,10 @@ CREATE VIEW pg_catalog.gs_matviews AS
SELECT
N.nspname AS schemaname,
C.relname AS matviewname,
- pg_get_userbyid(C.relowner) AS matviewowner,
+ pg_catalog.pg_get_userbyid(C.relowner) AS matviewowner,
T.spcname AS tablespace,
C.relhasindex AS hasindexes,
- pg_get_viewdef(C.oid) AS definition
+ pg_catalog.pg_get_viewdef(C.oid) AS definition
FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
LEFT JOIN pg_tablespace T ON (T.oid = C.reltablespace)
WHERE C.relkind = 'm';
@@ -315,7 +315,7 @@ CREATE VIEW pg_indexes AS
C.relname AS tablename,
I.relname AS indexname,
T.spcname AS tablespace,
- pg_get_indexdef(I.oid) AS indexdef
+ pg_catalog.pg_get_indexdef(I.oid) AS indexdef
FROM pg_index X JOIN pg_class C ON (C.oid = X.indrelid)
JOIN pg_class I ON (I.oid = X.indexrelid)
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
@@ -326,12 +326,12 @@ CREATE VIEW pg_indexes AS
CREATE VIEW pg_catalog.pg_gtt_relstats WITH (security_barrier) AS
SELECT n.nspname AS schemaname,
c.relname AS tablename,
- (select relfilenode from pg_get_gtt_relstats(c.oid)),
- (select relpages from pg_get_gtt_relstats(c.oid)),
- (select reltuples from pg_get_gtt_relstats(c.oid)),
- (select relallvisible from pg_get_gtt_relstats(c.oid)),
- (select relfrozenxid from pg_get_gtt_relstats(c.oid)),
- (select relminmxid from pg_get_gtt_relstats(c.oid))
+ (select relfilenode from pg_catalog.pg_get_gtt_relstats(c.oid)),
+ (select relpages from pg_catalog.pg_get_gtt_relstats(c.oid)),
+ (select reltuples from pg_catalog.pg_get_gtt_relstats(c.oid)),
+ (select relallvisible from pg_catalog.pg_get_gtt_relstats(c.oid)),
+ (select relfrozenxid from pg_catalog.pg_get_gtt_relstats(c.oid)),
+ (select relminmxid from pg_catalog.pg_get_gtt_relstats(c.oid))
FROM
pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
@@ -341,7 +341,7 @@ CREATE VIEW pg_catalog.pg_gtt_attached_pids WITH (security_barrier) AS
SELECT n.nspname AS schemaname,
c.relname AS tablename,
c.oid AS relid,
- array(select pid from pg_gtt_attached_pid(c.oid)) AS pids
+ array(select pid from pg_catalog.pg_gtt_attached_pid(c.oid)) AS pids
FROM
pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
@@ -408,30 +408,30 @@ SELECT s.nspname AS schemaname,
(SELECT n.nspname,
c.relname,
a.attname,
- (select stainherit from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stainherit,
- (select stanullfrac from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanullfrac,
- (select stawidth from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stawidth,
- (select stadistinct from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stadistinct,
- (select stakind1 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stakind1,
- (select stakind2 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stakind2,
- (select stakind3 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stakind3,
- (select stakind4 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stakind4,
- (select stakind5 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stakind5,
- (select stanumbers1 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanumbers1,
- (select stanumbers2 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanumbers2,
- (select stanumbers3 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanumbers3,
- (select stanumbers4 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanumbers4,
- (select stanumbers5 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanumbers5,
- (select stavalues1 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stavalues1,
- (select stavalues2 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stavalues2,
- (select stavalues3 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stavalues3,
- (select stavalues4 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stavalues4,
- (select stavalues5 from pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stavalues5
+ (select stainherit from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stainherit,
+ (select stanullfrac from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanullfrac,
+ (select stawidth from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stawidth,
+ (select stadistinct from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stadistinct,
+ (select stakind1 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stakind1,
+ (select stakind2 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stakind2,
+ (select stakind3 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stakind3,
+ (select stakind4 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stakind4,
+ (select stakind5 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stakind5,
+ (select stanumbers1 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanumbers1,
+ (select stanumbers2 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanumbers2,
+ (select stanumbers3 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanumbers3,
+ (select stanumbers4 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanumbers4,
+ (select stanumbers5 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stanumbers5,
+ (select stavalues1 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stavalues1,
+ (select stavalues2 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stavalues2,
+ (select stavalues3 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stavalues3,
+ (select stavalues4 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stavalues4,
+ (select stavalues5 from pg_catalog.pg_get_gtt_statistics(c.oid, a.attnum, ''::text)) as stavalues5
FROM
pg_class c
JOIN pg_attribute a ON c.oid = a.attrelid
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
- WHERE c.relpersistence='g' AND c.relkind in('r','p','i','t') and a.attnum > 0 and NOT a.attisdropped AND has_column_privilege(c.oid, a.attnum, 'select'::text)) s;
+ WHERE c.relpersistence='g' AND c.relkind in('r','p','i','t') and a.attnum > 0 and NOT a.attisdropped AND pg_catalog.has_column_privilege(c.oid, a.attnum, 'select'::text)) s;
CREATE VIEW pg_stats AS
SELECT
@@ -495,7 +495,7 @@ CREATE VIEW pg_stats AS
FROM pg_statistic s JOIN pg_class c ON (c.oid = s.starelid AND s.starelkind='c')
JOIN pg_attribute a ON (c.oid = attrelid AND attnum = s.staattnum)
LEFT JOIN pg_namespace n ON (n.oid = c.relnamespace)
- WHERE NOT attisdropped AND has_column_privilege(c.oid, a.attnum, 'select');
+ WHERE NOT attisdropped AND pg_catalog.has_column_privilege(c.oid, a.attnum, 'select');
CREATE VIEW pg_catalog.pg_ext_stats AS
SELECT
@@ -587,9 +587,9 @@ SELECT
WHEN rel.relkind = 'L' THEN 'large sequence'::text
WHEN rel.relkind = 'f' THEN 'foreign table'::text END AS objtype,
rel.relnamespace AS objnamespace,
- CASE WHEN pg_table_is_visible(rel.oid)
- THEN quote_ident(rel.relname)
- ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname)
+ CASE WHEN pg_catalog.pg_table_is_visible(rel.oid)
+ THEN pg_catalog.quote_ident(rel.relname)
+ ELSE pg_catalog.quote_ident(nsp.nspname) || '.' || pg_catalog.quote_ident(rel.relname)
END AS objname,
l.provider, l.label
FROM
@@ -603,9 +603,9 @@ SELECT
l.objoid, l.classoid, l.objsubid,
'column'::text AS objtype,
rel.relnamespace AS objnamespace,
- CASE WHEN pg_table_is_visible(rel.oid)
- THEN quote_ident(rel.relname)
- ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname)
+ CASE WHEN pg_catalog.pg_table_is_visible(rel.oid)
+ THEN pg_catalog.quote_ident(rel.relname)
+ ELSE pg_catalog.quote_ident(nsp.nspname) || '.' || pg_catalog.quote_ident(rel.relname)
END || '.' || att.attname AS objname,
l.provider, l.label
FROM
@@ -623,9 +623,9 @@ SELECT
WHEN pro.proisagg = false THEN 'function'::text
END AS objtype,
pro.pronamespace AS objnamespace,
- CASE WHEN pg_function_is_visible(pro.oid)
- THEN quote_ident(pro.proname)
- ELSE quote_ident(nsp.nspname) || '.' || quote_ident(pro.proname)
+ CASE WHEN pg_catalog.pg_function_is_visible(pro.oid)
+ THEN pg_catalog.quote_ident(pro.proname)
+ ELSE pg_catalog.quote_ident(nsp.nspname) || '.' || pg_catalog.quote_ident(pro.proname)
END || '(' || pg_catalog.pg_get_function_arguments(pro.oid) || ')' AS objname,
l.provider, l.label
FROM
@@ -640,9 +640,9 @@ SELECT
CASE WHEN typ.typtype = 'd' THEN 'domain'::text
ELSE 'type'::text END AS objtype,
typ.typnamespace AS objnamespace,
- CASE WHEN pg_type_is_visible(typ.oid)
- THEN quote_ident(typ.typname)
- ELSE quote_ident(nsp.nspname) || '.' || quote_ident(typ.typname)
+ CASE WHEN pg_catalog.pg_type_is_visible(typ.oid)
+ THEN pg_catalog.quote_ident(typ.typname)
+ ELSE pg_catalog.quote_ident(nsp.nspname) || '.' || pg_catalog.quote_ident(typ.typname)
END AS objname,
l.provider, l.label
FROM
@@ -668,7 +668,7 @@ SELECT
l.objoid, l.classoid, l.objsubid,
'language'::text AS objtype,
NULL::oid AS objnamespace,
- quote_ident(lan.lanname) AS objname,
+ pg_catalog.quote_ident(lan.lanname) AS objname,
l.provider, l.label
FROM
pg_seclabel l
@@ -680,7 +680,7 @@ SELECT
l.objoid, l.classoid, l.objsubid,
'schema'::text AS objtype,
nsp.oid AS objnamespace,
- quote_ident(nsp.nspname) AS objname,
+ pg_catalog.quote_ident(nsp.nspname) AS objname,
l.provider, l.label
FROM
pg_seclabel l
@@ -692,7 +692,7 @@ SELECT
l.objoid, l.classoid, 0::int4 AS objsubid,
'database'::text AS objtype,
NULL::oid AS objnamespace,
- quote_ident(dat.datname) AS objname,
+ pg_catalog.quote_ident(dat.datname) AS objname,
l.provider, l.label
FROM
pg_shseclabel l
@@ -702,7 +702,7 @@ SELECT
l.objoid, l.classoid, 0::int4 AS objsubid,
'tablespace'::text AS objtype,
NULL::oid AS objnamespace,
- quote_ident(spc.spcname) AS objname,
+ pg_catalog.quote_ident(spc.spcname) AS objname,
l.provider, l.label
FROM
pg_shseclabel l
@@ -712,7 +712,7 @@ SELECT
l.objoid, l.classoid, 0::int4 AS objsubid,
'role'::text AS objtype,
NULL::oid AS objnamespace,
- quote_ident(rol.rolname) AS objname,
+ pg_catalog.quote_ident(rol.rolname) AS objname,
l.provider, l.label
FROM
pg_shseclabel l
@@ -724,7 +724,7 @@ CREATE VIEW pg_settings AS
CREATE RULE pg_settings_u AS
ON UPDATE TO pg_settings
WHERE new.name = old.name DO
- SELECT set_config(old.name, new.setting, 'f');
+ SELECT pg_catalog.set_config(old.name, new.setting, 'f');
CREATE RULE pg_settings_n AS
ON UPDATE TO pg_settings
@@ -748,26 +748,26 @@ CREATE VIEW pg_stat_all_tables AS
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
- pg_stat_get_numscans(C.oid) AS seq_scan,
- pg_stat_get_tuples_returned(C.oid) AS seq_tup_read,
- sum(pg_stat_get_numscans(I.indexrelid))::bigint AS idx_scan,
- sum(pg_stat_get_tuples_fetched(I.indexrelid))::bigint +
- pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch,
- pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins,
- pg_stat_get_tuples_updated(C.oid) AS n_tup_upd,
- pg_stat_get_tuples_deleted(C.oid) AS n_tup_del,
- pg_stat_get_tuples_hot_updated(C.oid) AS n_tup_hot_upd,
- pg_stat_get_live_tuples(C.oid) AS n_live_tup,
- pg_stat_get_dead_tuples(C.oid) AS n_dead_tup,
- pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
- pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
- pg_stat_get_last_analyze_time(C.oid) as last_analyze,
- pg_stat_get_last_autoanalyze_time(C.oid) as last_autoanalyze,
- pg_stat_get_vacuum_count(C.oid) AS vacuum_count,
- pg_stat_get_autovacuum_count(C.oid) AS autovacuum_count,
- pg_stat_get_analyze_count(C.oid) AS analyze_count,
- pg_stat_get_autoanalyze_count(C.oid) AS autoanalyze_count,
- pg_stat_get_last_data_changed_time(C.oid) AS last_data_changed
+ pg_catalog.pg_stat_get_numscans(C.oid) AS seq_scan,
+ pg_catalog.pg_stat_get_tuples_returned(C.oid) AS seq_tup_read,
+ pg_catalog.sum(pg_catalog.pg_stat_get_numscans(I.indexrelid))::bigint AS idx_scan,
+ pg_catalog.sum(pg_catalog.pg_stat_get_tuples_fetched(I.indexrelid))::bigint +
+ pg_catalog.pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch,
+ pg_catalog.pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins,
+ pg_catalog.pg_stat_get_tuples_updated(C.oid) AS n_tup_upd,
+ pg_catalog.pg_stat_get_tuples_deleted(C.oid) AS n_tup_del,
+ pg_catalog.pg_stat_get_tuples_hot_updated(C.oid) AS n_tup_hot_upd,
+ pg_catalog.pg_stat_get_live_tuples(C.oid) AS n_live_tup,
+ pg_catalog.pg_stat_get_dead_tuples(C.oid) AS n_dead_tup,
+ pg_catalog.pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
+ pg_catalog.pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
+ pg_catalog.pg_stat_get_last_analyze_time(C.oid) as last_analyze,
+ pg_catalog.pg_stat_get_last_autoanalyze_time(C.oid) as last_autoanalyze,
+ pg_catalog.pg_stat_get_vacuum_count(C.oid) AS vacuum_count,
+ pg_catalog.pg_stat_get_autovacuum_count(C.oid) AS autovacuum_count,
+ pg_catalog.pg_stat_get_analyze_count(C.oid) AS analyze_count,
+ pg_catalog.pg_stat_get_autoanalyze_count(C.oid) AS autoanalyze_count,
+ pg_catalog.pg_stat_get_last_data_changed_time(C.oid) AS last_data_changed
FROM pg_class C LEFT JOIN
pg_index I ON C.oid = I.indrelid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
@@ -779,15 +779,15 @@ CREATE VIEW pg_stat_xact_all_tables AS
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
- pg_stat_get_xact_numscans(C.oid) AS seq_scan,
- pg_stat_get_xact_tuples_returned(C.oid) AS seq_tup_read,
- sum(pg_stat_get_xact_numscans(I.indexrelid))::bigint AS idx_scan,
- sum(pg_stat_get_xact_tuples_fetched(I.indexrelid))::bigint +
- pg_stat_get_xact_tuples_fetched(C.oid) AS idx_tup_fetch,
- pg_stat_get_xact_tuples_inserted(C.oid) AS n_tup_ins,
- pg_stat_get_xact_tuples_updated(C.oid) AS n_tup_upd,
- pg_stat_get_xact_tuples_deleted(C.oid) AS n_tup_del,
- pg_stat_get_xact_tuples_hot_updated(C.oid) AS n_tup_hot_upd
+ pg_catalog.pg_stat_get_xact_numscans(C.oid) AS seq_scan,
+ pg_catalog.pg_stat_get_xact_tuples_returned(C.oid) AS seq_tup_read,
+ pg_catalog.sum(pg_catalog.pg_stat_get_xact_numscans(I.indexrelid))::bigint AS idx_scan,
+ pg_catalog.sum(pg_catalog.pg_stat_get_xact_tuples_fetched(I.indexrelid))::bigint +
+ pg_catalog.pg_stat_get_xact_tuples_fetched(C.oid) AS idx_tup_fetch,
+ pg_catalog.pg_stat_get_xact_tuples_inserted(C.oid) AS n_tup_ins,
+ pg_catalog.pg_stat_get_xact_tuples_updated(C.oid) AS n_tup_upd,
+ pg_catalog.pg_stat_get_xact_tuples_deleted(C.oid) AS n_tup_del,
+ pg_catalog.pg_stat_get_xact_tuples_hot_updated(C.oid) AS n_tup_hot_upd
FROM pg_class C LEFT JOIN
pg_index I ON C.oid = I.indrelid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
@@ -819,18 +819,18 @@ CREATE VIEW pg_statio_all_tables AS
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
- pg_stat_get_blocks_fetched(C.oid) -
- pg_stat_get_blocks_hit(C.oid) AS heap_blks_read,
- pg_stat_get_blocks_hit(C.oid) AS heap_blks_hit,
- sum(pg_stat_get_blocks_fetched(I.indexrelid) -
- pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_read,
- sum(pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_hit,
- pg_stat_get_blocks_fetched(T.oid) -
- pg_stat_get_blocks_hit(T.oid) AS toast_blks_read,
- pg_stat_get_blocks_hit(T.oid) AS toast_blks_hit,
- pg_stat_get_blocks_fetched(X.oid) -
- pg_stat_get_blocks_hit(X.oid) AS tidx_blks_read,
- pg_stat_get_blocks_hit(X.oid) AS tidx_blks_hit
+ pg_catalog.pg_stat_get_blocks_fetched(C.oid) -
+ pg_catalog.pg_stat_get_blocks_hit(C.oid) AS heap_blks_read,
+ pg_catalog.pg_stat_get_blocks_hit(C.oid) AS heap_blks_hit,
+ pg_catalog.sum(pg_catalog.pg_stat_get_blocks_fetched(I.indexrelid) -
+ pg_catalog.pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_read,
+ pg_catalog.sum(pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_hit,
+ pg_catalog.pg_stat_get_blocks_fetched(T.oid) -
+ pg_catalog.pg_stat_get_blocks_hit(T.oid) AS toast_blks_read,
+ pg_catalog.pg_stat_get_blocks_hit(T.oid) AS toast_blks_hit,
+ pg_catalog.pg_stat_get_blocks_fetched(X.oid) -
+ pg_catalog.pg_stat_get_blocks_hit(X.oid) AS tidx_blks_read,
+ pg_catalog.pg_stat_get_blocks_hit(X.oid) AS tidx_blks_hit
FROM pg_class C LEFT JOIN
pg_index I ON C.oid = I.indrelid LEFT JOIN
pg_class T ON C.reltoastrelid = T.oid LEFT JOIN
@@ -856,9 +856,9 @@ CREATE VIEW pg_stat_all_indexes AS
N.nspname AS schemaname,
C.relname AS relname,
I.relname AS indexrelname,
- pg_stat_get_numscans(I.oid) AS idx_scan,
- pg_stat_get_tuples_returned(I.oid) AS idx_tup_read,
- pg_stat_get_tuples_fetched(I.oid) AS idx_tup_fetch
+ pg_catalog.pg_stat_get_numscans(I.oid) AS idx_scan,
+ pg_catalog.pg_stat_get_tuples_returned(I.oid) AS idx_tup_read,
+ pg_catalog.pg_stat_get_tuples_fetched(I.oid) AS idx_tup_fetch
FROM pg_class C JOIN
pg_index X ON C.oid = X.indrelid JOIN
pg_class I ON I.oid = X.indexrelid
@@ -883,8 +883,8 @@ CREATE VIEW pg_statio_all_indexes AS
C.relname AS relname,
I.relname AS indexrelname,
pg_stat_get_blocks_fetched(I.oid) -
- pg_stat_get_blocks_hit(I.oid) AS idx_blks_read,
- pg_stat_get_blocks_hit(I.oid) AS idx_blks_hit
+ pg_catalog.pg_stat_get_blocks_hit(I.oid) AS idx_blks_read,
+ pg_catalog.pg_stat_get_blocks_hit(I.oid) AS idx_blks_hit
FROM pg_class C JOIN
pg_index X ON C.oid = X.indrelid JOIN
pg_class I ON I.oid = X.indexrelid
@@ -907,8 +907,8 @@ CREATE VIEW pg_statio_all_sequences AS
N.nspname AS schemaname,
C.relname AS relname,
pg_stat_get_blocks_fetched(C.oid) -
- pg_stat_get_blocks_hit(C.oid) AS blks_read,
- pg_stat_get_blocks_hit(C.oid) AS blks_hit
+ pg_catalog.pg_stat_get_blocks_hit(C.oid) AS blks_read,
+ pg_catalog.pg_stat_get_blocks_hit(C.oid) AS blks_hit
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind = 'S' or C.relkind = 'L';
@@ -948,8 +948,10 @@ CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity AS
END AS resource_pool,
S.query_id,
S.query,
- S.connection_info
- FROM pg_database D, pg_stat_get_activity_with_conninfo(NULL) AS S, pg_authid U
+ S.connection_info,
+ S.unique_sql_id,
+ S.trace_id
+ FROM pg_database D, pg_catalog.pg_stat_get_activity_with_conninfo(NULL) AS S, pg_authid U
WHERE S.datid = D.oid AND
S.usesysid = U.oid;
@@ -979,7 +981,7 @@ CREATE OR REPLACE VIEW pg_catalog.pg_stat_activity_ng AS
S.query_id,
S.query,
N.node_group
- FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_stat_get_activity_ng(NULL) AS N, pg_authid U
+ FROM pg_database D, pg_catalog.pg_stat_get_activity(NULL) AS S, pg_catalog.pg_stat_get_activity_ng(NULL) AS N, pg_authid U
WHERE S.datid = D.oid AND
S.usesysid = U.oid AND
S.sessionid = N.sessionid;
@@ -1017,7 +1019,7 @@ CREATE OR REPLACE VIEW pg_catalog.pg_session_wlmstat AS
S.query,
S.is_plana,
S.node_group
- FROM pg_database D, pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, gs_wlm_session_respool(0) AS T
+ FROM pg_database D, pg_catalog.pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, pg_catalog.gs_wlm_session_respool(0) AS T
WHERE S.datid = D.oid AND
S.usesysid = U.oid AND
T.sessionid = S.sessionid;
@@ -1033,7 +1035,7 @@ CREATE VIEW pg_wlm_statistics AS
control_group,
status,
action
- FROM pg_stat_get_wlm_statistics(NULL);
+ FROM pg_catalog.pg_stat_get_wlm_statistics(NULL);
CREATE VIEW gs_session_memory_statistics AS
SELECT
@@ -1047,7 +1049,7 @@ SELECT
S.query,
S.node_group,
T.top_mem_dn
-FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T
+FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T
WHERE S.pid = T.threadid;
CREATE VIEW pg_session_iostat AS
@@ -1065,10 +1067,10 @@ CREATE VIEW pg_session_iostat AS
S.query,
S.node_group,
T.curr_io_limits as curr_io_limits
-FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_session_iostat_info(0) AS T
+FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_session_iostat_info(0) AS T
WHERE S.pid = T.threadid;
-CREATE VIEW gs_cluster_resource_info AS SELECT * FROM pg_stat_get_wlm_node_resource_info(0);
+CREATE VIEW gs_cluster_resource_info AS SELECT * FROM pg_catalog.pg_stat_get_wlm_node_resource_info(0);
CREATE VIEW gs_session_cpu_statistics AS
SELECT
@@ -1082,7 +1084,7 @@ SELECT
S.query,
S.node_group,
T.top_cpu_dn
-FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T
+FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T
WHERE S.sessionid = T.threadid;
CREATE VIEW gs_wlm_session_statistics AS
@@ -1136,7 +1138,7 @@ SELECT
S.node_group,
T.top_cpu_dn,
T.top_mem_dn
-FROM pg_stat_activity_ng AS S, pg_stat_get_wlm_realtime_session_info(NULL) AS T
+FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T
WHERE S.pid = T.threadid;
CREATE OR REPLACE FUNCTION gs_wlm_get_all_user_resource_info()
@@ -1150,7 +1152,7 @@ DECLARE
BEGIN
query_str := 'SELECT rolname FROM pg_authid';
FOR row_name IN EXECUTE(query_str) LOOP
- query_str2 := 'SELECT * FROM gs_wlm_user_resource_info(''' || row_name.rolname || ''')';
+ query_str2 := 'SELECT * FROM pg_catalog.gs_wlm_user_resource_info(''' || row_name.rolname || ''')';
FOR row_data IN EXECUTE(query_str2) LOOP
return next row_data;
END LOOP;
@@ -1276,7 +1278,7 @@ DECLARE
record_cnt int;
BEGIN
record_cnt := 0;
- query_str := 'SELECT * FROM pg_stat_get_wlm_instance_info_with_cleanup()';
+ query_str := 'SELECT * FROM pg_catalog.pg_stat_get_wlm_instance_info_with_cleanup()';
EXECUTE 'INSERT INTO gs_wlm_instance_history ' || query_str;
return record_cnt;
END; $$
@@ -1374,7 +1376,7 @@ create table gs_wlm_session_query_info_all
);
CREATE VIEW gs_wlm_session_info_all AS
-SELECT * FROM pg_stat_get_wlm_session_info(0);
+SELECT * FROM pg_catalog.pg_stat_get_wlm_session_info(0);
CREATE VIEW gs_wlm_session_info AS
SELECT
@@ -1522,7 +1524,7 @@ FROM gs_wlm_session_info_all S;
-CREATE OR REPLACE FUNCTION create_wlm_session_info(IN flag int)
+CREATE OR REPLACE FUNCTION pg_catalog.create_wlm_session_info(IN flag int)
RETURNS int
AS $$
DECLARE
@@ -1531,7 +1533,7 @@ DECLARE
BEGIN
record_cnt := 0;
- query_str := 'SELECT * FROM pg_stat_get_wlm_session_info(1)';
+ query_str := 'SELECT * FROM pg_catalog.pg_stat_get_wlm_session_info(1)';
IF flag > 0 THEN
EXECUTE 'INSERT INTO gs_wlm_session_query_info_all ' || query_str;
@@ -1554,7 +1556,7 @@ CREATE VIEW gs_wlm_cgroup_info AS
relpath,
valid,
node_group
- FROM pg_stat_get_cgroup_info(NULL);
+ FROM pg_catalog.pg_stat_get_cgroup_info(NULL);
CREATE VIEW gs_wlm_user_info AS
SELECT
@@ -1568,7 +1570,7 @@ SELECT
T.spacelimit,
T.childcount,
T.childlist
-FROM pg_roles AS S, gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R
+FROM pg_roles AS S, pg_catalog.gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R
WHERE S.oid = T.userid AND T.rpoid = R.oid;
CREATE VIEW gs_wlm_resource_pool AS
@@ -1583,11 +1585,11 @@ SELECT
T.waiting_count,
T.iops_limits as io_limits,
T.io_priority
-FROM gs_wlm_get_resource_pool_info(0) AS T, pg_resource_pool AS R
+FROM pg_catalog.gs_wlm_get_resource_pool_info(0) AS T, pg_resource_pool AS R
WHERE T.respool_oid = R.oid;
CREATE VIEW gs_wlm_rebuild_user_resource_pool AS
- SELECT * FROM gs_wlm_rebuild_user_resource_pool(0);
+ SELECT * FROM pg_catalog.gs_wlm_rebuild_user_resource_pool(0);
CREATE VIEW gs_wlm_workload_records AS
SELECT
@@ -1606,7 +1608,7 @@ CREATE VIEW gs_wlm_workload_records AS
P.queue_type AS enqueue,
S.query,
P.node_group
- FROM pg_stat_get_session_wlmstat(NULL) AS S, pg_authid U, gs_wlm_get_workload_records(0) P
+ FROM pg_catalog.pg_stat_get_session_wlmstat(NULL) AS S, pg_authid U, pg_catalog.gs_wlm_get_workload_records(0) P
WHERE P.query_pid = S.threadpid AND
S.usesysid = U.oid;
@@ -1699,7 +1701,7 @@ BEGIN
T.totalsize AS totalsize,
T.freesize AS freesize,
T.usedsize AS usedsize
- FROM pv_thread_memory_detail() T;';
+ FROM pg_catalog.pv_thread_memory_detail() T;';
FOR row_data IN EXECUTE(query_str) LOOP
sessid = row_data.sessid;
sesstype = row_data.sesstype;
@@ -1735,8 +1737,8 @@ CREATE VIEW pg_stat_replication AS
W.receiver_replay_location,
W.sync_priority,
W.sync_state
- FROM pg_stat_get_activity(NULL) AS S, pg_authid U,
- pg_stat_get_wal_senders() AS W
+ FROM pg_catalog.pg_stat_get_activity(NULL) AS S, pg_authid U,
+ pg_catalog.pg_stat_get_wal_senders() AS W
WHERE S.usesysid = U.oid AND
S.pid = W.pid;
@@ -1760,35 +1762,35 @@ CREATE VIEW pg_stat_database AS
SELECT
D.oid AS datid,
D.datname AS datname,
- pg_stat_get_db_numbackends(D.oid) AS numbackends,
- pg_stat_get_db_xact_commit(D.oid) AS xact_commit,
- pg_stat_get_db_xact_rollback(D.oid) AS xact_rollback,
- pg_stat_get_db_blocks_fetched(D.oid) -
- pg_stat_get_db_blocks_hit(D.oid) AS blks_read,
- pg_stat_get_db_blocks_hit(D.oid) AS blks_hit,
- pg_stat_get_db_tuples_returned(D.oid) AS tup_returned,
- pg_stat_get_db_tuples_fetched(D.oid) AS tup_fetched,
- pg_stat_get_db_tuples_inserted(D.oid) AS tup_inserted,
- pg_stat_get_db_tuples_updated(D.oid) AS tup_updated,
- pg_stat_get_db_tuples_deleted(D.oid) AS tup_deleted,
- pg_stat_get_db_conflict_all(D.oid) AS conflicts,
- pg_stat_get_db_temp_files(D.oid) AS temp_files,
- pg_stat_get_db_temp_bytes(D.oid) AS temp_bytes,
- pg_stat_get_db_deadlocks(D.oid) AS deadlocks,
- pg_stat_get_db_blk_read_time(D.oid) AS blk_read_time,
- pg_stat_get_db_blk_write_time(D.oid) AS blk_write_time,
- pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset
+ pg_catalog.pg_stat_get_db_numbackends(D.oid) AS numbackends,
+ pg_catalog.pg_stat_get_db_xact_commit(D.oid) AS xact_commit,
+ pg_catalog.pg_stat_get_db_xact_rollback(D.oid) AS xact_rollback,
+ pg_catalog.pg_stat_get_db_blocks_fetched(D.oid) -
+ pg_catalog.pg_stat_get_db_blocks_hit(D.oid) AS blks_read,
+ pg_catalog.pg_stat_get_db_blocks_hit(D.oid) AS blks_hit,
+ pg_catalog.pg_stat_get_db_tuples_returned(D.oid) AS tup_returned,
+ pg_catalog.pg_stat_get_db_tuples_fetched(D.oid) AS tup_fetched,
+ pg_catalog.pg_stat_get_db_tuples_inserted(D.oid) AS tup_inserted,
+ pg_catalog.pg_stat_get_db_tuples_updated(D.oid) AS tup_updated,
+ pg_catalog.pg_stat_get_db_tuples_deleted(D.oid) AS tup_deleted,
+ pg_catalog.pg_stat_get_db_conflict_all(D.oid) AS conflicts,
+ pg_catalog.pg_stat_get_db_temp_files(D.oid) AS temp_files,
+ pg_catalog.pg_stat_get_db_temp_bytes(D.oid) AS temp_bytes,
+ pg_catalog.pg_stat_get_db_deadlocks(D.oid) AS deadlocks,
+ pg_catalog.pg_stat_get_db_blk_read_time(D.oid) AS blk_read_time,
+ pg_catalog.pg_stat_get_db_blk_write_time(D.oid) AS blk_write_time,
+ pg_catalog.pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset
FROM pg_database D;
CREATE VIEW pg_stat_database_conflicts AS
SELECT
D.oid AS datid,
D.datname AS datname,
- pg_stat_get_db_conflict_tablespace(D.oid) AS confl_tablespace,
- pg_stat_get_db_conflict_lock(D.oid) AS confl_lock,
- pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot,
- pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin,
- pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock
+ pg_catalog.pg_stat_get_db_conflict_tablespace(D.oid) AS confl_tablespace,
+ pg_catalog.pg_stat_get_db_conflict_lock(D.oid) AS confl_lock,
+ pg_catalog.pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot,
+ pg_catalog.pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin,
+ pg_catalog.pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock
FROM pg_database D;
CREATE VIEW pg_stat_user_functions AS
@@ -1796,24 +1798,24 @@ CREATE VIEW pg_stat_user_functions AS
P.oid AS funcid,
N.nspname AS schemaname,
P.proname AS funcname,
- pg_stat_get_function_calls(P.oid) AS calls,
- pg_stat_get_function_total_time(P.oid) AS total_time,
- pg_stat_get_function_self_time(P.oid) AS self_time
+ pg_catalog.pg_stat_get_function_calls(P.oid) AS calls,
+ pg_catalog.pg_stat_get_function_total_time(P.oid) AS total_time,
+ pg_catalog.pg_stat_get_function_self_time(P.oid) AS self_time
FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace)
WHERE P.prolang != 12 -- fast check to eliminate built-in functions
- AND pg_stat_get_function_calls(P.oid) IS NOT NULL;
+ AND pg_catalog.pg_stat_get_function_calls(P.oid) IS NOT NULL;
CREATE VIEW pg_stat_xact_user_functions AS
SELECT
P.oid AS funcid,
N.nspname AS schemaname,
P.proname AS funcname,
- pg_stat_get_xact_function_calls(P.oid) AS calls,
- pg_stat_get_xact_function_total_time(P.oid) AS total_time,
- pg_stat_get_xact_function_self_time(P.oid) AS self_time
+ pg_catalog.pg_stat_get_xact_function_calls(P.oid) AS calls,
+ pg_catalog.pg_stat_get_xact_function_total_time(P.oid) AS total_time,
+ pg_catalog.pg_stat_get_xact_function_self_time(P.oid) AS self_time
FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace)
WHERE P.prolang != 12 -- fast check to eliminate built-in functions
- AND pg_stat_get_xact_function_calls(P.oid) IS NOT NULL;
+ AND pg_catalog.pg_stat_get_xact_function_calls(P.oid) IS NOT NULL;
CREATE VIEW pg_stat_bgwriter AS
SELECT
@@ -1840,7 +1842,7 @@ CREATE VIEW pg_user_mappings AS
ELSE
A.rolname
END AS usename,
- CASE WHEN pg_has_role(S.srvowner, 'USAGE') OR has_server_privilege(S.oid, 'USAGE') THEN
+ CASE WHEN pg_catalog.pg_has_role(S.srvowner, 'USAGE') OR pg_catalog.has_server_privilege(S.oid, 'USAGE') THEN
U.umoptions
ELSE
NULL
@@ -1852,47 +1854,47 @@ CREATE VIEW pg_user_mappings AS
REVOKE ALL on pg_user_mapping FROM public;
-- these functions are added for supporting default format transformation
-CREATE OR REPLACE FUNCTION to_char(NUMERIC)
+CREATE OR REPLACE FUNCTION pg_catalog.to_char(NUMERIC)
RETURNS VARCHAR2
AS $$ SELECT CAST(numeric_out($1) AS VARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION to_char(INT2)
+CREATE OR REPLACE FUNCTION pg_catalog.to_char(INT2)
RETURNS VARCHAR2
-AS $$ SELECT CAST(int2out($1) AS VARCHAR2) $$
+AS $$ SELECT CAST(pg_catalog.int2out($1) AS VARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION to_char(INT4)
+CREATE OR REPLACE FUNCTION pg_catalog.to_char(INT4)
RETURNS VARCHAR2
-AS $$ SELECT CAST(int4out($1) AS VARCHAR2) $$
+AS $$ SELECT CAST(pg_catalog.int4out($1) AS VARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION to_char(INT8)
+CREATE OR REPLACE FUNCTION pg_catalog.to_char(INT8)
RETURNS VARCHAR2
-AS $$ SELECT CAST(int8out($1) AS VARCHAR2) $$
+AS $$ SELECT CAST(pg_catalog.int8out($1) AS VARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION to_char(FLOAT4)
+CREATE OR REPLACE FUNCTION pg_catalog.to_char(FLOAT4)
RETURNS VARCHAR2
-AS $$ SELECT CAST(float4out($1) AS VARCHAR2) $$
+AS $$ SELECT CAST(pg_catalog.float4out($1) AS VARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION to_char(FLOAT8)
+CREATE OR REPLACE FUNCTION pg_catalog.to_char(FLOAT8)
RETURNS VARCHAR2
-AS $$ SELECT CAST(float8out($1) AS VARCHAR2) $$
+AS $$ SELECT CAST(pg_catalog.float8out($1) AS VARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION to_char(TEXT)
+CREATE OR REPLACE FUNCTION pg_catalog.to_char(TEXT)
RETURNS TEXT
AS $$ SELECT $1 $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION to_number(TEXT)
+CREATE OR REPLACE FUNCTION pg_catalog.to_number(TEXT)
RETURNS NUMERIC
-AS $$ SELECT numeric_in(textout($1), 0::Oid, -1) $$
+AS $$ SELECT pg_catalog.numeric_in(textout($1), 0::Oid, -1) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE CAST (VARCHAR2 AS RAW) WITH FUNCTION hextoraw(text) AS IMPLICIT;
+CREATE CAST (VARCHAR2 AS RAW) WITH FUNCTION pg_catalog.hextoraw(text) AS IMPLICIT;
--
-- We have a few function definitions in here, too.
@@ -1903,7 +1905,7 @@ CREATE CAST (VARCHAR2 AS RAW) WITH FUNCTION hextoraw(text) AS IMPLICIT;
-- Tsearch debug function. Defined here because it'd be pretty unwieldy
-- to put it into pg_proc.h
-CREATE FUNCTION ts_debug(IN config regconfig, IN document text,
+CREATE FUNCTION pg_catalog.ts_debug(IN config regconfig, IN document text,
OUT alias text,
OUT description text,
OUT token text,
@@ -1943,10 +1945,10 @@ WHERE tt.tokid = parse.tokid
$$
LANGUAGE SQL STRICT STABLE NOT FENCED;
-COMMENT ON FUNCTION ts_debug(regconfig,text) IS
+COMMENT ON FUNCTION pg_catalog.ts_debug(regconfig,text) IS
'debug function for text search configuration';
-CREATE FUNCTION ts_debug(IN document text,
+CREATE FUNCTION pg_catalog.ts_debug(IN document text,
OUT alias text,
OUT description text,
OUT token text,
@@ -1959,7 +1961,7 @@ $$
$$
LANGUAGE SQL STRICT STABLE NOT FENCED;
-COMMENT ON FUNCTION ts_debug(text) IS
+COMMENT ON FUNCTION pg_catalog.ts_debug(text) IS
'debug function for current text search configuration';
--
@@ -1971,133 +1973,133 @@ COMMENT ON FUNCTION ts_debug(text) IS
-- to get filled in.)
--
-CREATE OR REPLACE FUNCTION TO_TEXT(INT2)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TEXT(INT2)
RETURNS TEXT
-AS $$ select CAST(int2out($1) AS VARCHAR) $$
+AS $$ select CAST(pg_catalog.int2out($1) AS VARCHAR) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_TEXT(INT4)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TEXT(INT4)
RETURNS TEXT
-AS $$ select CAST(int4out($1) AS VARCHAR) $$
+AS $$ select CAST(pg_catalog.int4out($1) AS VARCHAR) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_TEXT(INT8)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TEXT(INT8)
RETURNS TEXT
-AS $$ select CAST(int8out($1) AS VARCHAR) $$
+AS $$ select CAST(pg_catalog.int8out($1) AS VARCHAR) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_TEXT(FLOAT4)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TEXT(FLOAT4)
RETURNS TEXT
-AS $$ select CAST(float4out($1) AS VARCHAR) $$
+AS $$ select CAST(pg_catalog.float4out($1) AS VARCHAR) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_TEXT(FLOAT8)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TEXT(FLOAT8)
RETURNS TEXT
-AS $$ select CAST(float8out($1) AS VARCHAR) $$
+AS $$ select CAST(pg_catalog.float8out($1) AS VARCHAR) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_TEXT(NUMERIC)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TEXT(NUMERIC)
RETURNS TEXT
-AS $$ SELECT CAST(numeric_out($1) AS VARCHAR) $$
+AS $$ SELECT CAST(pg_catalog.numeric_out($1) AS VARCHAR) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_TEXT(INTERVAL)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TEXT(INTERVAL)
RETURNS TEXT
-AS $$ select CAST(interval_out($1) AS TEXT) $$
+AS $$ select CAST(pg_catalog.interval_out($1) AS TEXT) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
--logical decoding
CREATE CAST (INTERVAL AS TEXT) WITH FUNCTION
-TO_TEXT(INTERVAL) AS IMPLICIT;
+pg_catalog.TO_TEXT(INTERVAL) AS IMPLICIT;
-create or replace function to_number(text)
+create or replace function pg_catalog.to_number(text)
returns numeric
-AS $$ select numeric_in(textout($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.numeric_in(pg_catalog.textout($1), 0::Oid, -1) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION time_text(time)
+CREATE OR REPLACE FUNCTION pg_catalog.time_text(time)
RETURNS text
-AS $$ SELECT CAST(time_out($1) AS text) $$
+AS $$ SELECT CAST(pg_catalog.time_out($1) AS text) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE CAST (time AS text) WITH FUNCTION time_text(time) AS IMPLICIT;
+CREATE CAST (time AS text) WITH FUNCTION pg_catalog.time_text(time) AS IMPLICIT;
-CREATE OR REPLACE FUNCTION timetz_text(timetz)
+CREATE OR REPLACE FUNCTION pg_catalog.timetz_text(timetz)
RETURNS text
-AS $$ SELECT CAST(timetz_out($1) AS text) $$
+AS $$ SELECT CAST(pg_catalog.timetz_out($1) AS text) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE CAST (timetz AS text) WITH FUNCTION timetz_text(timetz) AS IMPLICIT;
+CREATE CAST (timetz AS text) WITH FUNCTION pg_catalog.timetz_text(timetz) AS IMPLICIT;
-CREATE OR REPLACE FUNCTION reltime_text(reltime)
+CREATE OR REPLACE FUNCTION pg_catalog.reltime_text(reltime)
RETURNS text
-AS $$ SELECT CAST(reltimeout($1) AS text) $$
+AS $$ SELECT CAST(pg_catalog.reltimeout($1) AS text) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE CAST (reltime AS text) WITH FUNCTION reltime_text(reltime) AS IMPLICIT;
+CREATE CAST (reltime AS text) WITH FUNCTION pg_catalog.reltime_text(reltime) AS IMPLICIT;
-CREATE OR REPLACE FUNCTION abstime_text(abstime)
+CREATE OR REPLACE FUNCTION pg_catalog.abstime_text(abstime)
RETURNS text
-AS $$ SELECT CAST(abstimeout($1) AS text) $$
+AS $$ SELECT CAST(pg_catalog.abstimeout($1) AS text) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE CAST (abstime AS text) WITH FUNCTION abstime_text(abstime) AS IMPLICIT;
+CREATE CAST (abstime AS text) WITH FUNCTION pg_catalog.abstime_text(abstime) AS IMPLICIT;
/*text to num*/
-create or replace function int1(text)
+create or replace function pg_catalog.int1(text)
returns int1
-as $$ select cast(to_number($1) as int1)$$
+as $$ select cast(pg_catalog.to_number($1) as int1)$$
language sql IMMUTABLE strict NOT FENCED;
-create or replace function int2(text)
+create or replace function pg_catalog.int2(text)
returns int2
-as $$ select cast(to_number($1) as int2)$$
+as $$ select cast(pg_catalog.to_number($1) as int2)$$
language sql IMMUTABLE strict NOT FENCED;
-create or replace function int4(text)
+create or replace function pg_catalog.int4(text)
returns int4
-as $$ select cast(to_number($1) as int4) $$
+as $$ select cast(pg_catalog.to_number($1) as int4) $$
language sql IMMUTABLE strict NOT FENCED;
-create or replace function int8(text)
+create or replace function pg_catalog.int8(text)
returns int8
-as $$ select cast(to_number($1) as int8) $$
+as $$ select cast(pg_catalog.to_number($1) as int8) $$
language sql IMMUTABLE strict NOT FENCED;
-create or replace function float4(text)
+create or replace function pg_catalog.float4(text)
returns float4
-as $$ select cast(to_number($1) as float4) $$
+as $$ select cast(pg_catalog.to_number($1) as float4) $$
language sql IMMUTABLE strict NOT FENCED;
-create or replace function float8(text)
+create or replace function pg_catalog.float8(text)
returns float8
-as $$ select cast(to_number($1) as float8) $$
+as $$ select cast(pg_catalog.to_number($1) as float8) $$
language sql IMMUTABLE strict NOT FENCED;
/*character to numeric*/
-CREATE OR REPLACE FUNCTION TO_NUMERIC(CHAR)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NUMERIC(CHAR)
RETURNS NUMERIC
-AS $$ SELECT TO_NUMBER($1::TEXT)$$
+AS $$ SELECT pg_catalog.TO_NUMBER($1::TEXT)$$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_NUMERIC(VARCHAR)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NUMERIC(VARCHAR)
RETURNS NUMERIC
-AS $$ SELECT TO_NUMBER($1::TEXT)$$
+AS $$ SELECT pg_catalog.TO_NUMBER($1::TEXT)$$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
/*character to int*/
-CREATE OR REPLACE FUNCTION TO_INTEGER(VARCHAR)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_INTEGER(VARCHAR)
RETURNS INTEGER
-AS $$ SELECT int4in(varcharout($1)) $$
+AS $$ SELECT pg_catalog.int4in(pg_catalog.varcharout($1)) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_INTEGER(CHAR)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_INTEGER(CHAR)
RETURNS INTEGER
-AS $$ SELECT int4in(bpcharout($1)) $$
+AS $$ SELECT pg_catalog.int4in(pg_catalog.bpcharout($1)) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (TEXT AS RAW) WITH FUNCTION hextoraw(TEXT);
-CREATE CAST (RAW AS TEXT) WITH FUNCTION rawtohex(raw) AS IMPLICIT;
+CREATE CAST (TEXT AS RAW) WITH FUNCTION pg_catalog.hextoraw(TEXT);
+CREATE CAST (RAW AS TEXT) WITH FUNCTION pg_catalog.rawtohex(raw) AS IMPLICIT;
CREATE CAST (BLOB AS RAW) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST (RAW AS BLOB) WITHOUT FUNCTION AS IMPLICIT;
@@ -2106,293 +2108,293 @@ CREATE CAST (TEXT AS CLOB) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST (CLOB AS TEXT) WITHOUT FUNCTION AS IMPLICIT;
/* text to clob */
-CREATE OR REPLACE FUNCTION to_clob(TEXT)
+CREATE OR REPLACE FUNCTION pg_catalog.to_clob(TEXT)
RETURNS CLOB
AS $$ select $1 $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
/* char to clob */
-CREATE OR REPLACE FUNCTION to_clob(CHAR)
+CREATE OR REPLACE FUNCTION pg_catalog.to_clob(CHAR)
RETURNS CLOB
AS $$ select CAST($1 AS TEXT) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION to_clob(VARCHAR)
+CREATE OR REPLACE FUNCTION pg_catalog.to_clob(VARCHAR)
RETURNS CLOB
AS $$ select CAST($1 AS TEXT) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION to_clob(NVARCHAR2)
+CREATE OR REPLACE FUNCTION pg_catalog.to_clob(NVARCHAR2)
RETURNS CLOB
AS $$ select CAST($1 AS TEXT) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
/*character to int8*/
-CREATE OR REPLACE FUNCTION TO_BIGINT(VARCHAR)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_BIGINT(VARCHAR)
RETURNS BIGINT
-AS $$ SELECT int8in(varcharout($1))$$
+AS $$ SELECT pg_catalog.int8in(pg_catalog.varcharout($1))$$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
/*float8 to numeric*/
-CREATE OR REPLACE FUNCTION TO_NUMERIC(double precision)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NUMERIC(double precision)
RETURNS NUMERIC
-AS $$ SELECT TO_NUMBER($1::TEXT)$$
+AS $$ SELECT pg_catalog.TO_NUMBER($1::TEXT)$$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
/*date to char(n)*/
-CREATE OR REPLACE FUNCTION TO_TEXT(TIMESTAMP WITHOUT TIME ZONE)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TEXT(TIMESTAMP WITHOUT TIME ZONE)
RETURNS TEXT
-AS $$ select CAST(timestamp_out($1) AS VARCHAR2) $$
+AS $$ select CAST(pg_catalog.timestamp_out($1) AS VARCHAR2) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_TEXT(TIMESTAMP WITH TIME ZONE)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TEXT(TIMESTAMP WITH TIME ZONE)
RETURNS TEXT
-AS $$ select CAST(timestamptz_out($1) AS VARCHAR2) $$
+AS $$ select CAST(pg_catalog.timestamptz_out($1) AS VARCHAR2) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION TRUNC(TIMESTAMP WITH TIME ZONE)
+CREATE OR REPLACE FUNCTION pg_catalog.TRUNC(TIMESTAMP WITH TIME ZONE)
RETURNS TIMESTAMP WITHOUT TIME ZONE AS $$
SELECT CAST(DATE_TRUNC('day',$1) AS TIMESTAMP WITHOUT TIME ZONE);
$$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION SUBSTR(TEXT, INT8, INT8) RETURNS TEXT AS $$
- select SUBSTR($1, $2::INT4, $3::INT4);
+CREATE OR REPLACE FUNCTION pg_catalog.SUBSTR(TEXT, INT8, INT8) RETURNS TEXT AS $$
+ select pg_catalog.SUBSTR($1, $2::INT4, $3::INT4);
$$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION SUBSTR(TEXT, INT8) RETURNS TEXT AS $$
- select SUBSTR($1, $2::INT4);
+CREATE OR REPLACE FUNCTION pg_catalog.SUBSTR(TEXT, INT8) RETURNS TEXT AS $$
+ select pg_catalog.SUBSTR($1, $2::INT4);
$$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
/* timestamp to varchar2 */
-CREATE OR REPLACE FUNCTION TO_VARCHAR2(TIMESTAMP WITHOUT TIME ZONE)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_VARCHAR2(TIMESTAMP WITHOUT TIME ZONE)
RETURNS VARCHAR2
-AS $$ select CAST(timestamp_out($1) AS VARCHAR2) $$
+AS $$ select CAST(pg_catalog.timestamp_out($1) AS VARCHAR2) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
/* interval to varchar2 */
-CREATE OR REPLACE FUNCTION TO_VARCHAR2(INTERVAL)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_VARCHAR2(INTERVAL)
RETURNS VARCHAR2
-AS $$ select CAST(interval_out($1) AS VARCHAR2) $$
+AS $$ select CAST(pg_catalog.interval_out($1) AS VARCHAR2) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (INTERVAL AS VARCHAR2) WITH FUNCTION TO_VARCHAR2(INTERVAL) AS IMPLICIT;
+CREATE CAST (INTERVAL AS VARCHAR2) WITH FUNCTION pg_catalog.TO_VARCHAR2(INTERVAL) AS IMPLICIT;
/* char,varchar2 to interval */
-CREATE OR REPLACE FUNCTION TO_INTERVAL(BPCHAR)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_INTERVAL(BPCHAR)
RETURNS INTERVAL
-AS $$ select interval_in(bpcharout($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.interval_in(pg_catalog.bpcharout($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_INTERVAL(VARCHAR2)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_INTERVAL(VARCHAR2)
RETURNS INTERVAL
-AS $$ select interval_in(varcharout($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.interval_in(pg_catalog.varcharout($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (BPCHAR AS INTERVAL) WITH FUNCTION TO_INTERVAL(BPCHAR) AS IMPLICIT;
-CREATE CAST (VARCHAR2 AS INTERVAL) WITH FUNCTION TO_INTERVAL(VARCHAR2) AS IMPLICIT;
+CREATE CAST (BPCHAR AS INTERVAL) WITH FUNCTION pg_catalog.TO_INTERVAL(BPCHAR) AS IMPLICIT;
+CREATE CAST (VARCHAR2 AS INTERVAL) WITH FUNCTION pg_catalog.TO_INTERVAL(VARCHAR2) AS IMPLICIT;
/* raw to varchar2 */
-CREATE CAST (RAW AS VARCHAR2) WITH FUNCTION rawtohex(RAW) AS IMPLICIT;
+CREATE CAST (RAW AS VARCHAR2) WITH FUNCTION pg_catalog.rawtohex(RAW) AS IMPLICIT;
/* varchar2,char to timestamp */
-CREATE OR REPLACE FUNCTION TO_TS(VARCHAR2)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TS(VARCHAR2)
RETURNS TIMESTAMP WITHOUT TIME ZONE
-AS $$ select timestamp_in(varcharout($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.timestamp_in(pg_catalog.varcharout($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_TS(BPCHAR)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TS(BPCHAR)
RETURNS TIMESTAMP WITHOUT TIME ZONE
-AS $$ select timestamp_in(bpcharout($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.timestamp_in(pg_catalog.bpcharout($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION timestamp_to_smalldatetime(TIMESTAMP WITHOUT TIME ZONE)
+CREATE OR REPLACE FUNCTION pg_catalog.timestamp_to_smalldatetime(TIMESTAMP WITHOUT TIME ZONE)
RETURNS SMALLDATETIME
-AS $$ select smalldatetime_in(timestamp_out($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.smalldatetime_in(pg_catalog.timestamp_out($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (TIMESTAMP WITHOUT TIME ZONE AS SMALLDATETIME) WITH FUNCTION timestamp_to_smalldatetime(TIMESTAMP WITHOUT TIME ZONE) AS IMPLICIT;
+CREATE CAST (TIMESTAMP WITHOUT TIME ZONE AS SMALLDATETIME) WITH FUNCTION pg_catalog.timestamp_to_smalldatetime(TIMESTAMP WITHOUT TIME ZONE) AS IMPLICIT;
-CREATE OR REPLACE FUNCTION smalldatetime_to_timestamp(smalldatetime)
+CREATE OR REPLACE FUNCTION pg_catalog.smalldatetime_to_timestamp(smalldatetime)
RETURNS TIMESTAMP WITHOUT TIME ZONE
-AS $$ select timestamp_in(smalldatetime_out($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.timestamp_in(pg_catalog.smalldatetime_out($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (smalldatetime AS TIMESTAMP WITHOUT TIME ZONE) WITH FUNCTION smalldatetime_to_timestamp(smalldatetime) AS IMPLICIT;
+CREATE CAST (smalldatetime AS TIMESTAMP WITHOUT TIME ZONE) WITH FUNCTION pg_catalog.smalldatetime_to_timestamp(smalldatetime) AS IMPLICIT;
/* smalldatetime to text */
-CREATE OR REPLACE FUNCTION TO_TEXT(smalldatetime)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TEXT(smalldatetime)
RETURNS TEXT
-AS $$ select CAST(smalldatetime_out($1) AS VARCHAR2) $$
+AS $$ select CAST(pg_catalog.smalldatetime_out($1) AS VARCHAR2) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (smalldatetime AS TEXT) WITH FUNCTION TO_TEXT(smalldatetime) AS IMPLICIT;
+CREATE CAST (smalldatetime AS TEXT) WITH FUNCTION pg_catalog.TO_TEXT(smalldatetime) AS IMPLICIT;
/* smalldatetime to varchar2 */
-CREATE OR REPLACE FUNCTION SMALLDATETIME_TO_VARCHAR2(smalldatetime)
+CREATE OR REPLACE FUNCTION pg_catalog.SMALLDATETIME_TO_VARCHAR2(smalldatetime)
RETURNS VARCHAR2
-AS $$ select CAST(smalldatetime_out($1) AS VARCHAR2) $$
+AS $$ select CAST(pg_catalog.smalldatetime_out($1) AS VARCHAR2) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (smalldatetime AS VARCHAR2) WITH FUNCTION SMALLDATETIME_TO_VARCHAR2(smalldatetime) AS IMPLICIT;
+CREATE CAST (smalldatetime AS VARCHAR2) WITH FUNCTION pg_catalog.SMALLDATETIME_TO_VARCHAR2(smalldatetime) AS IMPLICIT;
/* varchar2, bpchar to smalldatetime */
-CREATE OR REPLACE FUNCTION VARCHAR2_TO_SMLLDATETIME(VARCHAR2)
+CREATE OR REPLACE FUNCTION pg_catalog.VARCHAR2_TO_SMLLDATETIME(VARCHAR2)
RETURNS SMALLDATETIME
-AS $$ select smalldatetime_in(varcharout($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.smalldatetime_in(pg_catalog.varcharout($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE OR REPLACE FUNCTION BPCHAR_TO_SMALLDATETIME(BPCHAR)
+CREATE OR REPLACE FUNCTION pg_catalog.BPCHAR_TO_SMALLDATETIME(BPCHAR)
RETURNS SMALLDATETIME
-AS $$ select smalldatetime_in(bpcharout($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.smalldatetime_in(pg_catalog.bpcharout($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (VARCHAR2 AS SMALLDATETIME) WITH FUNCTION VARCHAR2_TO_SMLLDATETIME(VARCHAR2) AS IMPLICIT;
+CREATE CAST (VARCHAR2 AS SMALLDATETIME) WITH FUNCTION pg_catalog.VARCHAR2_TO_SMLLDATETIME(VARCHAR2) AS IMPLICIT;
-CREATE CAST (BPCHAR AS SMALLDATETIME) WITH FUNCTION BPCHAR_TO_SMALLDATETIME(BPCHAR) AS IMPLICIT;
+CREATE CAST (BPCHAR AS SMALLDATETIME) WITH FUNCTION pg_catalog.BPCHAR_TO_SMALLDATETIME(BPCHAR) AS IMPLICIT;
/*abstime TO smalldatetime*/
-CREATE OR REPLACE FUNCTION abstime_to_smalldatetime(ABSTIME)
+CREATE OR REPLACE FUNCTION pg_catalog.abstime_to_smalldatetime(ABSTIME)
RETURNS SMALLDATETIME
-AS $$ select smalldatetime_in(timestamp_out($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.smalldatetime_in(pg_catalog.timestamp_out($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (ABSTIME AS SMALLDATETIME) WITH FUNCTION abstime_to_smalldatetime(ABSTIME) AS IMPLICIT;
+CREATE CAST (ABSTIME AS SMALLDATETIME) WITH FUNCTION pg_catalog.abstime_to_smalldatetime(ABSTIME) AS IMPLICIT;
/*smalldatetime_to_abstime*/
-CREATE OR REPLACE FUNCTION smalldatetime_to_abstime(smalldatetime)
+CREATE OR REPLACE FUNCTION pg_catalog.smalldatetime_to_abstime(smalldatetime)
RETURNS abstime
-AS $$ select abstimein(smalldatetime_out($1)) $$
+AS $$ select pg_catalog.abstimein(pg_catalog.smalldatetime_out($1)) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (smalldatetime AS abstime) WITH FUNCTION smalldatetime_to_abstime(smalldatetime) AS IMPLICIT;
+CREATE CAST (smalldatetime AS abstime) WITH FUNCTION pg_catalog.smalldatetime_to_abstime(smalldatetime) AS IMPLICIT;
/*smalldatetime to time*/
-CREATE OR REPLACE FUNCTION smalldatetime_to_time(smalldatetime)
+CREATE OR REPLACE FUNCTION pg_catalog.smalldatetime_to_time(smalldatetime)
RETURNS time
-AS $$ select time_in(smalldatetime_out($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.time_in(pg_catalog.smalldatetime_out($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (smalldatetime AS time) WITH FUNCTION smalldatetime_to_time(smalldatetime) AS IMPLICIT;
+CREATE CAST (smalldatetime AS time) WITH FUNCTION pg_catalog.smalldatetime_to_time(smalldatetime) AS IMPLICIT;
/*smalldatetime_to_timestamptz*/
-CREATE OR REPLACE FUNCTION smalldatetime_to_timestamptz(smalldatetime)
+CREATE OR REPLACE FUNCTION pg_catalog.smalldatetime_to_timestamptz(smalldatetime)
RETURNS TIMESTAMP WITH TIME ZONE
-AS $$ select timestamptz_in(smalldatetime_out($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.timestamptz_in(pg_catalog.smalldatetime_out($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (smalldatetime AS TIMESTAMP WITH TIME ZONE) WITH FUNCTION smalldatetime_to_timestamptz(smalldatetime) AS IMPLICIT;
+CREATE CAST (smalldatetime AS TIMESTAMP WITH TIME ZONE) WITH FUNCTION pg_catalog.smalldatetime_to_timestamptz(smalldatetime) AS IMPLICIT;
/*timestamptz_to_smalldatetime*/
-CREATE OR REPLACE FUNCTION timestamptz_to_smalldatetime(TIMESTAMP WITH TIME ZONE)
+CREATE OR REPLACE FUNCTION pg_catalog.timestamptz_to_smalldatetime(TIMESTAMP WITH TIME ZONE)
RETURNS smalldatetime
-AS $$ select smalldatetime_in(TIMESTAMPTZ_OUT($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.smalldatetime_in(pg_catalog.TIMESTAMPTZ_OUT($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (TIMESTAMP WITH TIME ZONE AS smalldatetime) WITH FUNCTION timestamptz_to_smalldatetime(TIMESTAMP WITH TIME ZONE) AS IMPLICIT;
+CREATE CAST (TIMESTAMP WITH TIME ZONE AS smalldatetime) WITH FUNCTION pg_catalog.timestamptz_to_smalldatetime(TIMESTAMP WITH TIME ZONE) AS IMPLICIT;
create type exception as (code integer, message varchar2);
-create or replace function regexp_substr(text,text)
+create or replace function pg_catalog.regexp_substr(text,text)
returns text
AS '$libdir/plpgsql','regexp_substr'
LANGUAGE C STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION report_application_error(
+CREATE OR REPLACE FUNCTION pg_catalog.report_application_error(
IN log text,
IN code integer default null
)RETURNS void
AS '$libdir/plpgsql','report_application_error'
LANGUAGE C VOLATILE NOT FENCED;
-create or replace function bitand(bigint,bigint)
+create or replace function pg_catalog.bitand(bigint,bigint)
returns bigint
as $$ select $1 & $2 $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-create or replace function regexp_like(text,text)
+create or replace function pg_catalog.regexp_like(text,text)
returns boolean as $$ select $1 ~ $2 $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-create or replace function regexp_like(text,text,text)
+create or replace function pg_catalog.regexp_like(text,text,text)
returns boolean as $$
select case $3 when 'i' then $1 ~* $2 else $1 ~ $2 end;$$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION INTERVALTONUM(INTERVAL)
+CREATE OR REPLACE FUNCTION pg_catalog.INTERVALTONUM(INTERVAL)
RETURNS NUMERIC
AS '$libdir/plpgsql','intervaltonum'
LANGUAGE C STRICT IMMUTABLE NOT FENCED;
-CREATE CAST (INTERVAL AS NUMERIC) WITH FUNCTION INTERVALTONUM(INTERVAL) AS IMPLICIT;
+CREATE CAST (INTERVAL AS NUMERIC) WITH FUNCTION pg_catalog.INTERVALTONUM(INTERVAL) AS IMPLICIT;
/* add for nvarcahr2 data type */
-CREATE OR REPLACE FUNCTION TO_NUMERIC(NVARCHAR2)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NUMERIC(NVARCHAR2)
RETURNS NUMERIC
-AS $$ SELECT TO_NUMBER($1::TEXT)$$
+AS $$ SELECT pg_catalog.TO_NUMBER($1::TEXT)$$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (NVARCHAR2 AS NUMERIC) WITH FUNCTION TO_NUMERIC(NVARCHAR2) AS IMPLICIT;
+CREATE CAST (NVARCHAR2 AS NUMERIC) WITH FUNCTION pg_catalog.TO_NUMERIC(NVARCHAR2) AS IMPLICIT;
-CREATE OR REPLACE FUNCTION TO_INTEGER(NVARCHAR2)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_INTEGER(NVARCHAR2)
RETURNS INTEGER
-AS $$ SELECT int4in(nvarchar2out($1))$$
+AS $$ SELECT pg_catalog.int4in(pg_catalog.nvarchar2out($1))$$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (NVARCHAR2 AS INTEGER) WITH FUNCTION TO_INTEGER(NVARCHAR2) AS IMPLICIT;
+CREATE CAST (NVARCHAR2 AS INTEGER) WITH FUNCTION pg_catalog.TO_INTEGER(NVARCHAR2) AS IMPLICIT;
-CREATE OR REPLACE FUNCTION TO_NVARCHAR2(TIMESTAMP WITHOUT TIME ZONE)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NVARCHAR2(TIMESTAMP WITHOUT TIME ZONE)
RETURNS NVARCHAR2
-AS $$ select CAST(timestamp_out($1) AS NVARCHAR2) $$
+AS $$ select CAST(pg_catalog.timestamp_out($1) AS NVARCHAR2) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (TIMESTAMP WITHOUT TIME ZONE AS NVARCHAR2) WITH FUNCTION TO_NVARCHAR2(TIMESTAMP WITHOUT TIME ZONE) AS IMPLICIT;
+CREATE CAST (TIMESTAMP WITHOUT TIME ZONE AS NVARCHAR2) WITH FUNCTION pg_catalog.TO_NVARCHAR2(TIMESTAMP WITHOUT TIME ZONE) AS IMPLICIT;
-CREATE OR REPLACE FUNCTION TO_NVARCHAR2(INTERVAL)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NVARCHAR2(INTERVAL)
RETURNS NVARCHAR2
-AS $$ select CAST(interval_out($1) AS NVARCHAR2) $$
+AS $$ select CAST(pg_catalog.interval_out($1) AS NVARCHAR2) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (INTERVAL AS NVARCHAR2) WITH FUNCTION TO_NVARCHAR2(INTERVAL) AS IMPLICIT;
+CREATE CAST (INTERVAL AS NVARCHAR2) WITH FUNCTION pg_catalog.TO_NVARCHAR2(INTERVAL) AS IMPLICIT;
-CREATE OR REPLACE FUNCTION TO_NVARCHAR2(NUMERIC)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NVARCHAR2(NUMERIC)
RETURNS NVARCHAR2
-AS $$ SELECT CAST(numeric_out($1) AS NVARCHAR2) $$
+AS $$ SELECT CAST(pg_catalog.numeric_out($1) AS NVARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_NVARCHAR2(INT2)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NVARCHAR2(INT2)
RETURNS NVARCHAR2
-AS $$ select CAST(int2out($1) AS NVARCHAR2) $$
+AS $$ select CAST(pg_catalog.int2out($1) AS NVARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_NVARCHAR2(INT4)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NVARCHAR2(INT4)
RETURNS NVARCHAR2
-AS $$ select CAST(int4out($1) AS NVARCHAR2) $$
+AS $$ select CAST(pg_catalog.int4out($1) AS NVARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_NVARCHAR2(INT8)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NVARCHAR2(INT8)
RETURNS NVARCHAR2
-AS $$ select CAST(int8out($1) AS NVARCHAR2) $$
+AS $$ select CAST(pg_catalog.int8out($1) AS NVARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_NVARCHAR2(FLOAT4)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NVARCHAR2(FLOAT4)
RETURNS NVARCHAR2
-AS $$ select CAST(float4out($1) AS NVARCHAR2) $$
+AS $$ select CAST(pg_catalog.float4out($1) AS NVARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE OR REPLACE FUNCTION TO_NVARCHAR2(FLOAT8)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_NVARCHAR2(FLOAT8)
RETURNS NVARCHAR2
-AS $$ select CAST(float8out($1) AS NVARCHAR2) $$
+AS $$ select CAST(pg_catalog.float8out($1) AS NVARCHAR2) $$
LANGUAGE SQL STRICT IMMUTABLE NOT FENCED;
-CREATE CAST (INT2 AS NVARCHAR2) WITH FUNCTION TO_NVARCHAR2(INT2) AS IMPLICIT;
-CREATE CAST (INT4 AS NVARCHAR2) WITH FUNCTION TO_NVARCHAR2(INT4) AS IMPLICIT;
-CREATE CAST (INT8 AS NVARCHAR2) WITH FUNCTION TO_NVARCHAR2(INT8) AS IMPLICIT;
-CREATE CAST (NUMERIC AS NVARCHAR2) WITH FUNCTION TO_NVARCHAR2(NUMERIC) AS IMPLICIT;
-CREATE CAST (FLOAT4 AS NVARCHAR2) WITH FUNCTION TO_NVARCHAR2(FLOAT4) AS IMPLICIT;
-CREATE CAST (FLOAT8 AS NVARCHAR2) WITH FUNCTION TO_NVARCHAR2(FLOAT8) AS IMPLICIT;
+CREATE CAST (INT2 AS NVARCHAR2) WITH FUNCTION pg_catalog.TO_NVARCHAR2(INT2) AS IMPLICIT;
+CREATE CAST (INT4 AS NVARCHAR2) WITH FUNCTION pg_catalog.TO_NVARCHAR2(INT4) AS IMPLICIT;
+CREATE CAST (INT8 AS NVARCHAR2) WITH FUNCTION pg_catalog.TO_NVARCHAR2(INT8) AS IMPLICIT;
+CREATE CAST (NUMERIC AS NVARCHAR2) WITH FUNCTION pg_catalog.TO_NVARCHAR2(NUMERIC) AS IMPLICIT;
+CREATE CAST (FLOAT4 AS NVARCHAR2) WITH FUNCTION pg_catalog.TO_NVARCHAR2(FLOAT4) AS IMPLICIT;
+CREATE CAST (FLOAT8 AS NVARCHAR2) WITH FUNCTION pg_catalog.TO_NVARCHAR2(FLOAT8) AS IMPLICIT;
-CREATE OR REPLACE FUNCTION TO_TS(NVARCHAR2)
+CREATE OR REPLACE FUNCTION pg_catalog.TO_TS(NVARCHAR2)
RETURNS TIMESTAMP WITHOUT TIME ZONE
-AS $$ select timestamp_in(nvarchar2out($1), 0::Oid, -1) $$
+AS $$ select pg_catalog.timestamp_in(pg_catalog.nvarchar2out($1), 0::Oid, -1) $$
LANGUAGE SQL IMMUTABLE STRICT NOT FENCED;
-CREATE CAST (NVARCHAR2 AS TIMESTAMP WITHOUT TIME ZONE) WITH FUNCTION TO_TS(NVARCHAR2) AS IMPLICIT;
+CREATE CAST (NVARCHAR2 AS TIMESTAMP WITHOUT TIME ZONE) WITH FUNCTION pg_catalog.TO_TS(NVARCHAR2) AS IMPLICIT;
-create or replace function regex_like_m(text,text) returns boolean
+create or replace function pg_catalog.regex_like_m(text,text) returns boolean
as $$
declare
source_line integer := 1;
@@ -2406,46 +2408,46 @@ declare
source_array array_text := array_text();
regex_array array_text := array_text();
begin
- if left($2,1) <> '^' and right($2,1) <> '$' then
+ if pg_catalog.left($2,1) <> '^' and pg_catalog.right($2,1) <> '$' then
return $1 ~ $2;
end if;
--source string to source_array
- for i in 1..length($1) loop
+ for i in 1..pg_catalog.length($1) loop
if substr($1,i,1) ~ '\n' then
if position = i then
source_array(source_line) := '\n';
else
- source_array(source_line) := substr($1,position,i - position);
+ source_array(source_line) := pg_catalog.substr($1,position,i - position);
end if;
position := i + 1;
source_line := source_line + 1;
end if;
end loop;
- if position <= length($1) or position = 1 then
- source_array(source_line) := substr($1,position);
+ if position <= pg_catalog.length($1) or position = 1 then
+ source_array(source_line) := pg_catalog.substr($1,position);
else
- if position > length($1) then
+ if position > pg_catalog.length($1) then
source_line := source_line - 1;
end if;
end if;
--regexp string to regex_array
position := 1;
- for i in 1..length($2) loop
- if substr($2,i,1) ~ '\n' then
+ for i in 1..pg_catalog.length($2) loop
+ if pg_catalog.substr($2,i,1) ~ '\n' then
if position = i then
regex_array(regex_line) := '\n';
else
- regex_array(regex_line) := substr($2,position,i - position);
+ regex_array(regex_line) := pg_catalog.substr($2,position,i - position);
end if;
position := i + 1;
regex_line := regex_line + 1;
end if;
end loop;
- if position <= length($2) or position = 1 then
- regex_array(regex_line) := substr($2,position);
+ if position <= pg_catalog.length($2) or position = 1 then
+ regex_array(regex_line) := pg_catalog.substr($2,position);
else
- if position > length($2) then
+ if position > pg_catalog.length($2) then
regex_line := regex_line - 1;
end if;
end if;
@@ -2468,12 +2470,12 @@ begin
end if;
end loop;
if left($2,1) = '^' then
- regex_temp := substr($2,2);
+ regex_temp := pg_catalog.substr($2,2);
else
regex_temp := $2;
end if;
if right($2,1) = '$' then
- regex_temp := substr(regex_temp,1,length(regex_temp)-1);
+ regex_temp := pg_catalog.substr(regex_temp,1,pg_catalog.length(regex_temp)-1);
end if;
if flag then
flag := $1 ~ regex_temp;
@@ -2482,14 +2484,14 @@ begin
end;
$$ LANGUAGE plpgsql shippable NOT FENCED;
-create or replace function regexp_like(text,text,text)
+create or replace function pg_catalog.regexp_like(text,text,text)
returns boolean
as $$
declare
regex_char varchar(1);
begin
- for i in 1..length($3) loop
- regex_char := substr($3,i,1);
+ for i in 1..pg_catalog.length($3) loop
+ regex_char := pg_catalog.substr($3,i,1);
if regex_char <> 'i' and regex_char <> 'm' and regex_char <> 'c' then
raise info 'illegal argument for function';
return false;
@@ -2498,20 +2500,20 @@ begin
case right($3, 1)
when 'i' then return $1 ~* $2;
when 'c' then return $1 ~ $2;
- when 'm' then return regex_like_m($1,$2);
+ when 'm' then return pg_catalog.regex_like_m($1,$2);
end case;
end;
$$ LANGUAGE plpgsql shippable NOT FENCED;
-create or replace function rawtohex(text)
+create or replace function pg_catalog.rawtohex(text)
returns text
AS '$libdir/plpgsql','rawtohex'
LANGUAGE C STRICT IMMUTABLE NOT FENCED;
/*
* login_audit_messages
*/
-CREATE OR REPLACE FUNCTION login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER
+CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages(in flag boolean) returns table (username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text) AUTHID DEFINER
AS $$
DECLARE
user_id text;
@@ -2521,13 +2523,13 @@ SQL_STMT VARCHAR2(500);
fail_cursor REFCURSOR;
success_cursor REFCURSOR;
BEGIN
- SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id;
+ SELECT text(oid) FROM pg_catalog.pg_authid WHERE rolname=SESSION_USER INTO user_id;
SELECT SESSION_USER INTO user_name;
- SELECT CURRENT_DATABASE() INTO db_name;
+ SELECT pg_catalog.CURRENT_DATABASE() INTO db_name;
IF flag = true THEN
- SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE
+ SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_catalog.pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE
type IN (''login_success'') AND username =' || quote_literal(user_name) ||
- ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';';
+ ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';';
OPEN success_cursor FOR EXECUTE SQL_STMT;
--search bottom up for all the success login info
FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo;
@@ -2537,9 +2539,9 @@ BEGIN
END IF;
CLOSE success_cursor;
ELSE
- SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE
+ SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo FROM pg_catalog.pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE
type IN (''login_success'', ''login_failed'') AND username =' || quote_literal(user_name) ||
- ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';';
+ ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';';
OPEN fail_cursor FOR EXECUTE SQL_STMT;
--search bottom up
FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo;
@@ -2565,7 +2567,7 @@ LANGUAGE plpgsql NOT FENCED;
* This is a special API for DataStudio, not the common behavrior.
* Highly suggest to use the login_audit_messages instead of this.
*/
-CREATE OR REPLACE FUNCTION login_audit_messages_pid(flag boolean)
+CREATE OR REPLACE FUNCTION pg_catalog.login_audit_messages_pid(flag boolean)
RETURNS TABLE(username text, database text, logintime timestamp with time zone, mytype text, result text, client_conninfo text, backendid bigint) AUTHID DEFINER
AS $$
DECLARE
@@ -2578,15 +2580,15 @@ success_cursor REFCURSOR;
mybackendid bigint;
curSessionFound boolean;
BEGIN
- SELECT text(oid) FROM pg_authid WHERE rolname=SESSION_USER INTO user_id;
+ SELECT text(oid) FROM pg_catalog.pg_authid WHERE rolname=SESSION_USER INTO user_id;
SELECT SESSION_USER INTO user_name;
- SELECT CURRENT_DATABASE() INTO db_name;
- SELECT pg_backend_pid() INTO mybackendid;
+ SELECT pg_catalog.CURRENT_DATABASE() INTO db_name;
+ SELECT pg_catalog.pg_backend_pid() INTO mybackendid;
curSessionFound = false;
IF flag = true THEN
- SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE
+ SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, pg_catalog.split_part(thread_id,''@'',1) backendid FROM pg_catalog.pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE
type IN (''login_success'') AND username =' || quote_literal(user_name) ||
- ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';';
+ ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';';
OPEN success_cursor FOR EXECUTE SQL_STMT;
--search bottom up for all the success login info
FETCH LAST FROM success_cursor into username, database, logintime, mytype, result, client_conninfo, backendid;
@@ -2606,9 +2608,9 @@ BEGIN
END IF;
END IF;
ELSE
- SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, split_part(thread_id,''@'',1) backendid FROM pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE
- type IN (''login_success'', ''login_failed'') AND username =' || quote_literal(user_name) ||
- ' AND database =' || quote_literal(db_name) || ' AND userid =' || quote_literal(user_id) || ';';
+ SQL_STMT := 'SELECT username,database,time,type,result,client_conninfo, pg_catalog.split_part(thread_id,''@'',1) backendid FROM pg_catalog.pg_query_audit(''1970-1-1'',''9999-12-31'') WHERE
+ type IN (''login_success'', ''login_failed'') AND username =' || pg_catalog.quote_literal(user_name) ||
+ ' AND database =' || pg_catalog.quote_literal(db_name) || ' AND userid =' || pg_catalog.quote_literal(user_id) || ';';
OPEN fail_cursor FOR EXECUTE SQL_STMT;
--search bottom up
FETCH LAST FROM fail_cursor into username, database, logintime, mytype, result, client_conninfo, backendid;
@@ -2644,7 +2646,7 @@ LANGUAGE plpgsql NOT FENCED;
* local way to fetch all thread wait status in local node.
*/
CREATE VIEW pg_thread_wait_status AS
- SELECT * FROM pg_stat_get_status(NULL);
+ SELECT * FROM pg_catalog.pg_stat_get_status(NULL);
/*
* pgxc_thread_wait_status
@@ -2652,7 +2654,7 @@ CREATE VIEW pg_thread_wait_status AS
* parallel way to fetch global thread wait status.
*/
CREATE VIEW pgxc_thread_wait_status AS
- SELECT * FROM pgxc_get_thread_wait_status();
+ SELECT * FROM pg_catalog.pgxc_get_thread_wait_status();
/*
*gs_sql_count
@@ -2685,7 +2687,7 @@ CREATE VIEW gs_sql_count AS
avg_delete_elapse,
max_delete_elapse,
min_delete_elapse
- FROM pg_stat_get_sql_count();
+ FROM pg_catalog.pg_stat_get_sql_count();
CREATE VIEW pg_os_threads AS
SELECT
@@ -2694,7 +2696,7 @@ CREATE VIEW pg_os_threads AS
S.lwpid,
S.thread_name,
S.creation_time
- FROM pg_stat_get_thread() AS S;
+ FROM pg_catalog.pg_stat_get_thread() AS S;
CREATE VIEW pg_node_env AS
SELECT
@@ -2705,13 +2707,13 @@ CREATE VIEW pg_node_env AS
S.installpath,
S.datapath,
S.log_directory
- FROM pg_stat_get_env() AS S;
+ FROM pg_catalog.pg_stat_get_env() AS S;
/*
* PGXC system view to look for libcomm stat
*/
CREATE VIEW pg_comm_status AS
- SELECT * FROM pg_comm_status();
+ SELECT * FROM pg_catalog.pg_comm_status();
/*
* PGXC system view to look for libcomm recv stream status
*/
@@ -2734,7 +2736,7 @@ CREATE VIEW pg_comm_recv_stream AS
S.speed,
S.quota,
S.buff_usize
- FROM pg_comm_recv_stream() AS S;
+ FROM pg_catalog.pg_comm_recv_stream() AS S;
/*
* PGXC system view to look for libcomm send stream status
@@ -2758,22 +2760,22 @@ CREATE VIEW pg_comm_send_stream AS
S.speed,
S.quota,
S.wait_quota
- FROM pg_comm_send_stream() AS S;
+ FROM pg_catalog.pg_comm_send_stream() AS S;
/*
* PGXC sytem view to show running transctions on node
*/
CREATE VIEW pg_running_xacts AS
SELECT
*
-FROM pg_get_running_xacts();
+FROM pg_catalog.pg_get_running_xacts();
/*
* PGXC sytem view to show variable cache on node
*/
CREATE VIEW pg_variable_info AS
-SELECT * FROM pg_get_variable_info();
+SELECT * FROM pg_catalog.pg_get_variable_info();
--Test distribute situation
-create or replace function table_skewness(table_name text, column_name text,
+create or replace function pg_catalog.table_skewness(table_name text, column_name text,
OUT seqNum text, OUT Num text, OUT Ratio text, row_num text default '0')
RETURNS setof record
AS $$
@@ -2797,14 +2799,14 @@ DECLARE
if tolal_num = 0 then
seqNum = 0;
Num = 0;
- Ratio = ROUND(0, 3) || '%';
+ Ratio = pg_catalog.ROUND(0, 3) || '%';
return;
end if;
for row_data in EXECUTE execute_query loop
seqNum = row_data.seqNum;
Num = row_data.num;
- Ratio = ROUND(row_data.num / tolal_num * 100, 3) || '%';
+ Ratio = pg_catalog.ROUND(row_data.num / tolal_num * 100, 3) || '%';
RETURN next;
end loop;
END;
@@ -2819,7 +2821,7 @@ CREATE VIEW pg_get_invalid_backends AS
S.datname AS dbname,
S.backend_start,
S.query
- FROM pg_pool_validate(false, ' ') AS C LEFT JOIN pg_stat_activity AS S
+ FROM pg_catalog.pg_pool_validate(false, ' ') AS C LEFT JOIN pg_stat_activity AS S
ON (C.pid = S.sessionid);
/*
@@ -2835,7 +2837,7 @@ CREATE VIEW pg_get_senders_catchup_time AS
'Wal' AS type,
W.catchup_start,
W.catchup_end
- FROM pg_stat_get_wal_senders() AS W
+ FROM pg_catalog.pg_stat_get_wal_senders() AS W
UNION ALL
SELECT
D.pid,
@@ -2846,9 +2848,9 @@ CREATE VIEW pg_get_senders_catchup_time AS
'Data' AS type,
D.catchup_start,
D.catchup_end
- FROM pg_stat_get_data_senders() AS D;
+ FROM pg_catalog.pg_stat_get_data_senders() AS D;
-CREATE OR REPLACE FUNCTION pg_stat_session_cu(OUT mem_hit int, OUT hdd_sync_read int, OUT hdd_asyn_read int)
+CREATE OR REPLACE FUNCTION pg_catalog.pg_stat_session_cu(OUT mem_hit int, OUT hdd_sync_read int, OUT hdd_asyn_read int)
RETURNS setof record
AS $$
DECLARE
@@ -2856,7 +2858,7 @@ DECLARE
query_str text;
statname text;
BEGIN
- query_str := 'select statname, sum(value) as value from gs_session_stat group by statname;';
+ query_str := 'select statname, pg_catalog.sum(value) as value from gs_session_stat group by statname;';
FOR stat_result IN EXECUTE(query_str) LOOP
statname := stat_result.statname;
IF statname = 'n_cu_mem_hit' THEN
@@ -2872,27 +2874,27 @@ DECLARE
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW gs_stat_session_cu AS
- SELECT DISTINCT * from pg_stat_session_cu();
+ SELECT DISTINCT * from pg_catalog.pg_stat_session_cu();
/*
* PGXC system view to look for libcomm delay information
*/
CREATE VIEW pg_comm_delay AS
- SELECT DISTINCT * from pg_comm_delay();
+ SELECT DISTINCT * from pg_catalog.pg_comm_delay();
CREATE VIEW gs_comm_proxy_thread_status AS
- SELECT DISTINCT * from gs_comm_proxy_thread_status();
+ SELECT DISTINCT * from pg_catalog.gs_comm_proxy_thread_status();
ALTER TEXT SEARCH CONFIGURATION ngram ADD MAPPING
FOR zh_words, en_word, numeric, alnum, grapsymbol, multisymbol
WITH simple;
CREATE VIEW gs_all_control_group_info AS
- SELECT DISTINCT * from gs_all_control_group_info();
+ SELECT DISTINCT * from pg_catalog.gs_all_control_group_info();
CREATE VIEW mpp_tables AS
SELECT n.nspname AS schemaname, c.relname AS tablename,
- pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS tablespace, x.pgroup,x.nodeoids
+ pg_catalog.pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS tablespace, x.pgroup,x.nodeoids
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
@@ -2929,15 +2931,15 @@ create table gs_wlm_operator_info
--real time operator-level view in single CN
CREATE VIEW gs_wlm_operator_statistics AS
SELECT t.*
-FROM pg_stat_activity AS s, pg_stat_get_wlm_realtime_operator_info(NULL) as t
+FROM pg_stat_activity AS s, pg_catalog.pg_stat_get_wlm_realtime_operator_info(NULL) as t
where s.query_id = t.queryid;
--history operator-level view for DM in single CN
CREATE VIEW gs_wlm_operator_history AS
-SELECT * FROM pg_stat_get_wlm_operator_info(0);
+SELECT * FROM pg_catalog.pg_stat_get_wlm_operator_info(0);
--function used to get history table from hash table
-CREATE OR REPLACE FUNCTION create_wlm_operator_info(IN flag int)
+CREATE OR REPLACE FUNCTION pg_catalog.create_wlm_operator_info(IN flag int)
RETURNS int
AS $$
DECLARE
@@ -3006,10 +3008,10 @@ create table gs_wlm_plan_operator_info
);
CREATE VIEW gs_wlm_plan_operator_history AS
-SELECT * FROM gs_stat_get_wlm_plan_operator_info(0);
+SELECT * FROM pg_catalog.gs_stat_get_wlm_plan_operator_info(0);
--perf hist encoder
-CREATE OR REPLACE FUNCTION encode_feature_perf_hist
+CREATE OR REPLACE FUNCTION pg_catalog.encode_feature_perf_hist
(
IN datname text,
OUT queryid bigint,
@@ -3078,7 +3080,7 @@ CREATE TABLE gs_wlm_plan_encoding_table
encode text
);
-CREATE OR REPLACE FUNCTION gather_encoding_info(IN datname text)
+CREATE OR REPLACE FUNCTION pg_catalog.gather_encoding_info(IN datname text)
RETURNS int
AS $$
DECLARE
@@ -3086,12 +3088,12 @@ DECLARE
EXECUTE 'INSERT INTO gs_wlm_plan_encoding_table
(queryid, plan_node_id, parent_node_id, encode, startup_time, total_time, rows, peak_memory)
SELECT queryid, plan_node_id, parent_node_id, encode, startup_time, total_time, rows, peak_memory
- FROM encode_feature_perf_hist('''|| datname ||''') order by queryid, plan_node_id;';
+ FROM pg_catalog.encode_feature_perf_hist('''|| datname ||''') order by queryid, plan_node_id;';
RETURN 0;
END;$$
LANGUAGE plpgsql NOT FENCED;
-CREATE OR REPLACE FUNCTION pg_catalog.copy_error_log_create()
+CREATE OR REPLACE FUNCTION pg_catalog.pg_catalog.copy_error_log_create()
RETURNS bool
AS $$
DECLARE
@@ -3143,9 +3145,9 @@ DECLARE
query_str_nodes := 'SELECT group_name,group_kind FROM pgxc_group WHERE group_kind = ''v'' OR group_kind = ''i'' ';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
IF row_name.group_kind = 'i' THEN
- query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM gs_all_nodegroup_control_group_info(''installation'')';
+ query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM pg_catalog.gs_all_nodegroup_control_group_info(''installation'')';
ELSE
- query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM gs_all_nodegroup_control_group_info(''' ||row_name.group_name||''')';
+ query_str := 'SELECT *,CAST(''' || row_name.group_name || ''' AS TEXT) AS nodegroup,CAST(''' || row_name.group_kind || ''' AS TEXT) AS group_kind FROM pg_catalog.gs_all_nodegroup_control_group_info(''' ||row_name.group_name||''')';
END IF;
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
@@ -3156,11 +3158,11 @@ DECLARE
LANGUAGE 'plpgsql' NOT FENCED;
-- the view for function gs_total_nodegroup_memory_detail.
-CREATE VIEW pg_catalog.gs_total_nodegroup_memory_detail AS SELECT * FROM gs_total_nodegroup_memory_detail();
+CREATE VIEW pg_catalog.gs_total_nodegroup_memory_detail AS SELECT * FROM pg_catalog.gs_total_nodegroup_memory_detail();
-- the view for function gs_get_control_group_info.
CREATE VIEW pg_catalog.gs_get_control_group_info AS
- SELECT * from gs_get_control_group_info() AS
+ SELECT * from pg_catalog.gs_get_control_group_info() AS
(
name text,
type text,
@@ -3189,7 +3191,7 @@ SELECT
t.ec_query,
t.ec_libodbc_type,
t.ec_fetch_count
-FROM pg_stat_activity AS s, pg_stat_get_wlm_realtime_ec_operator_info(NULL) as t
+FROM pg_stat_activity AS s, pg_catalog.pg_stat_get_wlm_realtime_ec_operator_info(NULL) as t
where s.query_id = t.queryid and t.ec_operator > 0;
--ec history operator-level view for DM in single CN
@@ -3209,7 +3211,7 @@ SELECT
ec_username,
ec_query,
ec_libodbc_type
-FROM pg_stat_get_wlm_ec_operator_info(0) where ec_operator > 0;
+FROM pg_catalog.pg_stat_get_wlm_ec_operator_info(0) where ec_operator > 0;
--table definition for ec history info
create table gs_wlm_ec_operator_info
@@ -3232,10 +3234,10 @@ create table gs_wlm_ec_operator_info
-- create view pg_tde_info
CREATE VIEW pg_catalog.pg_tde_info AS
-SELECT * from pg_tde_info();
+SELECT * from pg_catalog.pg_tde_info();
--get delta infomation in single DN
-CREATE OR REPLACE FUNCTION pg_get_delta_info(IN rel TEXT, IN schema_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8)
+CREATE OR REPLACE FUNCTION pg_catalog.pg_get_delta_info(IN rel TEXT, IN schema_name TEXT, OUT part_name TEXT, OUT live_tuple INT8, OUT data_size INT8, OUT blockNum INT8)
RETURNS setof record
AS $$
DECLARE
@@ -3255,7 +3257,7 @@ DECLARE
EXECUTE(query_str) INTO row_data;
query_select_str := 'select count(*) from cstore.' || row_data.relname || '';
EXECUTE (query_select_str) INTO live_tuple;
- query_size_str := 'select * from pg_relation_size(' || row_data.oid || ')';
+ query_size_str := 'select * from pg_catalog.pg_relation_size(' || row_data.oid || ')';
EXECUTE (query_size_str) INTO data_size;
blockNum := data_size/8192;
part_name := 'non partition table';
@@ -3268,7 +3270,7 @@ DECLARE
FOR row_data IN EXECUTE(query_str) LOOP
query_select_str := 'select count(*) from cstore.' || row_data.relname || '';
EXECUTE (query_select_str) INTO live_tuple;
- query_size_str := 'select * from pg_relation_size(' || row_data.oid || ')';
+ query_size_str := 'select * from pg_catalog.pg_relation_size(' || row_data.oid || ')';
EXECUTE (query_size_str) INTO data_size;
END LOOP;
blockNum := data_size/8192;
@@ -3280,9 +3282,9 @@ DECLARE
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW pg_catalog.pg_stat_bad_block AS
- SELECT DISTINCT * from pg_stat_bad_block();
+ SELECT DISTINCT * from pg_catalog.pg_stat_bad_block();
-CREATE OR REPLACE FUNCTION lock_cluster_ddl()
+CREATE OR REPLACE FUNCTION pg_catalog.lock_cluster_ddl()
RETURNS boolean
AS $$
DECLARE
@@ -3294,7 +3296,7 @@ DECLARE
BEGIN
query_database_oid := 'SELECT datname FROM pg_database WHERE datallowconn = true order by datname';
for databse_name in EXECUTE(query_database_oid) LOOP
- lock_str = format('SELECT * FROM pgxc_lock_for_sp_database(''%s'')', databse_name.datname);
+ lock_str = pg_catalog.format('SELECT * FROM pg_catalog.pgxc_lock_for_sp_database(''%s'')', databse_name.datname);
begin
EXECUTE(lock_str) into lock_result;
if lock_result = 'f' then
@@ -3307,7 +3309,7 @@ DECLARE
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
-CREATE OR REPLACE FUNCTION unlock_cluster_ddl()
+CREATE OR REPLACE FUNCTION pg_catalog.unlock_cluster_ddl()
RETURNS bool
AS $$
DECLARE
@@ -3319,7 +3321,7 @@ DECLARE
BEGIN
query_database_oid := 'SELECT datname FROM pg_database WHERE datallowconn = true order by datname';
for databse_name in EXECUTE(query_database_oid) LOOP
- unlock_str = format('SELECT * FROM pgxc_unlock_for_sp_database(''%s'')', databse_name.datname);
+ unlock_str = format('SELECT * FROM pg_catalog.pgxc_unlock_for_sp_database(''%s'')', databse_name.datname);
begin
EXECUTE(unlock_str) into unlock_result;
if unlock_result = 'f' then
@@ -3343,17 +3345,19 @@ CREATE TABLE PLAN_TABLE_DATA(
object_name name,
object_type varchar2(30),
object_owner name,
- projection varchar2(4000)
+ projection varchar2(4000),
+ cost float8,
+ cardinality float8
);
CREATE VIEW PLAN_TABLE AS
-SELECT statement_id,plan_id,id,operation,options,object_name,object_type,object_owner,projection
+SELECT statement_id,plan_id,id,operation,options,object_name,object_type,object_owner,projection,cost,cardinality
FROM PLAN_TABLE_DATA
-WHERE session_id=pg_current_sessionid()
-AND user_id=pg_current_userid();
+WHERE session_id=pg_catalog.pg_current_sessionid()
+AND user_id=pg_catalog.pg_current_userid();
-- get pgxc dirty tables stat
-CREATE OR REPLACE FUNCTION pgxc_get_stat_dirty_tables(in dirty_percent int4, in n_tuples int4, out relid oid, out relname name, out schemaname name, out n_tup_ins int8, out n_tup_upd int8, out n_tup_del int8, out n_live_tup int8, out n_dead_tup int8, out dirty_page_rate numeric(5,2))
+CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_stat_dirty_tables(in dirty_percent int4, in n_tuples int4, out relid oid, out relname name, out schemaname name, out n_tup_ins int8, out n_tup_upd int8, out n_tup_del int8, out n_live_tup int8, out n_dead_tup int8, out dirty_page_rate numeric(5,2))
RETURNS setof record
AS $$
DECLARE
@@ -3362,8 +3366,8 @@ DECLARE
BEGIN
query_str := 'SELECT oid relid, s.relname,s.schemaname,s.n_tup_ins,s.n_tup_upd,s.n_tup_del,s.n_live_tup,s.n_dead_tup,s.dirty_page_rate
FROM pg_class p,
- (SELECT relname, schemaname, SUM(n_tup_ins) n_tup_ins, SUM(n_tup_upd) n_tup_upd, SUM(n_tup_del) n_tup_del, SUM(n_live_tup) n_live_tup, SUM(n_dead_tup) n_dead_tup, CAST((SUM(n_dead_tup) / SUM(n_dead_tup + n_live_tup + 0.00001) * 100)
- AS NUMERIC(5,2)) dirty_page_rate FROM pgxc_stat_dirty_tables('||dirty_percent||','||n_tuples||') GROUP BY (relname,schemaname)) s
+ (SELECT relname, schemaname, pg_catalog.SUM(n_tup_ins) n_tup_ins, pg_catalog.SUM(n_tup_upd) n_tup_upd, pg_catalog.SUM(n_tup_del) n_tup_del, pg_catalog.SUM(n_live_tup) n_live_tup, pg_catalog.SUM(n_dead_tup) n_dead_tup, CAST((pg_catalog.SUM(n_dead_tup) / pg_catalog.SUM(n_dead_tup + n_live_tup + 0.00001) * 100)
+ AS pg_catalog.NUMERIC(5,2)) dirty_page_rate FROM pg_catalog.pgxc_stat_dirty_tables('||dirty_percent||','||n_tuples||') GROUP BY (relname,schemaname)) s
WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) ORDER BY dirty_page_rate DESC';
FOR row_data IN EXECUTE(query_str) LOOP
relid = row_data.relid;
@@ -3380,7 +3384,7 @@ DECLARE
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
-CREATE OR REPLACE FUNCTION pgxc_get_stat_dirty_tables(in dirty_percent int4, in n_tuples int4,in schema text, out relid oid, out relname name, out schemaname name, out n_tup_ins int8, out n_tup_upd int8, out n_tup_del int8, out n_live_tup int8, out n_dead_tup int8, out dirty_page_rate numeric(5,2))
+CREATE OR REPLACE FUNCTION pg_catalog.pgxc_get_stat_dirty_tables(in dirty_percent int4, in n_tuples int4,in schema text, out relid oid, out relname name, out schemaname name, out n_tup_ins int8, out n_tup_upd int8, out n_tup_del int8, out n_live_tup int8, out n_dead_tup int8, out dirty_page_rate numeric(5,2))
RETURNS setof record
AS $$
DECLARE
@@ -3389,8 +3393,8 @@ DECLARE
BEGIN
query_str := 'SELECT oid relid, s.relname,s.schemaname,s.n_tup_ins,s.n_tup_upd,s.n_tup_del,s.n_live_tup,s.n_dead_tup,s.dirty_page_rate
FROM pg_class p,
- (SELECT relname, schemaname, SUM(n_tup_ins) n_tup_ins, SUM(n_tup_upd) n_tup_upd, SUM(n_tup_del) n_tup_del, SUM(n_live_tup) n_live_tup, SUM(n_dead_tup) n_dead_tup, CAST((SUM(n_dead_tup) / SUM(n_dead_tup + n_live_tup + 0.00001) * 100)
- AS NUMERIC(5,2)) dirty_page_rate FROM pgxc_stat_dirty_tables('||dirty_percent||','||n_tuples||','''||schema||''') GROUP BY (relname,schemaname)) s
+ (SELECT relname, schemaname, pg_catalog.SUM(n_tup_ins) n_tup_ins, pg_catalog.SUM(n_tup_upd) n_tup_upd, pg_catalog.SUM(n_tup_del) n_tup_del, pg_catalog.SUM(n_live_tup) n_live_tup, pg_catalog.SUM(n_dead_tup) n_dead_tup, CAST((pg_catalog.SUM(n_dead_tup) / pg_catalog.SUM(n_dead_tup + n_live_tup + 0.00001) * 100)
+ AS pg_catalog.NUMERIC(5,2)) dirty_page_rate FROM pg_catalog.pgxc_stat_dirty_tables('||dirty_percent||','||n_tuples||','''||schema||''') GROUP BY (relname,schemaname)) s
WHERE p.relname = s.relname AND p.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname) ORDER BY dirty_page_rate DESC';
FOR row_data IN EXECUTE(query_str) LOOP
relid = row_data.relid;
@@ -3409,11 +3413,11 @@ LANGUAGE 'plpgsql' NOT FENCED;
CREATE OR REPLACE VIEW pg_catalog.get_global_prepared_xacts AS
SELECT p.transaction, p.gid, p.prepared, u.rolname AS owner, d.datname AS database, p.node_name
- FROM get_local_prepared_xact() p
+ FROM pg_catalog.get_local_prepared_xact() p
LEFT JOIN pg_authid u ON p.ownerid = u.oid
LEFT JOIN pg_database d ON p.dbid = d.oid
UNION ALL
- SELECT * FROM get_remote_prepared_xacts();
+ SELECT * FROM pg_catalog.get_remote_prepared_xacts();
CREATE unlogged table statement_history(
db_name name,
@@ -3466,7 +3470,8 @@ CREATE unlogged table statement_history(
lwlock_time bigint,
lwlock_wait_time bigint,
details bytea,
- is_slow_sql bool
+ is_slow_sql bool,
+ trace_id text
);
REVOKE ALL on table pg_catalog.statement_history FROM public;
create index statement_history_time_idx on pg_catalog.statement_history USING btree (start_time, is_slow_sql);
@@ -3504,6 +3509,35 @@ GRANT SELECT ON TABLE SYS_DUMMY TO PUBLIC;
CREATE TYPE pg_catalog.bulk_exception as (error_index integer, error_code integer, error_message text);
+CREATE VIEW pg_catalog.gs_db_privileges AS
+ SELECT
+ pg_catalog.pg_get_userbyid(roleid) AS rolename,
+ privilege_type AS privilege_type,
+ CASE
+ WHEN admin_option THEN
+ 'yes'
+ ELSE
+ 'no'
+ END AS admin_option
+ FROM pg_catalog.gs_db_privilege;
+
+CREATE OR REPLACE VIEW pg_catalog.gs_gsc_memory_detail AS
+ SELECT db_id, sum(totalsize) AS totalsize, sum(freesize) AS freesize, sum(usedsize) AS usedsize
+ FROM (
+ SELECT
+ CASE WHEN contextname like '%GlobalSysDBCacheEntryMemCxt%' THEN substring(contextname, 29)
+ ELSE substring(parent, 29) END AS db_id,
+ totalsize,
+ freesize,
+ usedsize
+ FROM pg_catalog.pg_shared_memory_detail()
+ WHERE contextname LIKE '%GlobalSysDBCacheEntryMemCxt%' OR parent LIKE '%GlobalSysDBCacheEntryMemCxt%'
+ )a
+ GROUP BY db_id;
+
+CREATE OR REPLACE VIEW pg_catalog.gs_lsc_memory_detail AS
+SELECT * FROM pg_catalog.pv_thread_memory_detail() WHERE contextname LIKE '%LocalSysCache%' OR parent LIKE '%LocalSysCache%';
+
CREATE VIEW pg_publication_tables AS
SELECT
P.pubname AS pubname,
@@ -3511,7 +3545,7 @@ CREATE VIEW pg_publication_tables AS
C.relname AS tablename
FROM pg_publication P, pg_class C
JOIN pg_namespace N ON (N.oid = C.relnamespace)
- WHERE C.oid IN (SELECT relid FROM pg_get_publication_tables(P.pubname));
+ WHERE C.oid IN (SELECT relid FROM pg_catalog.pg_get_publication_tables(P.pubname));
CREATE VIEW pg_stat_subscription AS
SELECT
@@ -3524,11 +3558,13 @@ CREATE VIEW pg_stat_subscription AS
st.latest_end_lsn,
st.latest_end_time
FROM pg_subscription su
- LEFT JOIN pg_stat_get_subscription(NULL) st
+ LEFT JOIN pg_catalog.pg_stat_get_subscription(NULL) st
ON (st.subid = su.oid);
CREATE VIEW pg_replication_origin_status AS
SELECT *
- FROM pg_show_replication_origin_status();
+ FROM pg_catalog.pg_show_replication_origin_status();
REVOKE ALL ON pg_replication_origin_status FROM public;
+
+REVOKE ALL ON pg_subscription FROM public;
diff --git a/src/common/backend/catalog/toasting.cpp b/src/common/backend/catalog/toasting.cpp
index 7571f1b55..63c14f8fc 100644
--- a/src/common/backend/catalog/toasting.cpp
+++ b/src/common/backend/catalog/toasting.cpp
@@ -40,6 +40,10 @@
#include "utils/syscache.h"
#include "utils/lsyscache.h"
#include "utils/partitionmap.h"
+#include "utils/acl.h"
+#include "commands/dbcommands.h"
+#include "catalog/pg_authid.h"
+#include "tcop/utility.h"
/* Potentially set by contrib/pg_upgrade_support functions */
static bool create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
@@ -642,6 +646,261 @@ static bool binary_upgrade_is_next_part_toast_pg_type_oid_valid()
return true;
}
+static void InitTempToastNamespace(void)
+{
+ char toastNamespaceName[NAMEDATALEN];
+ char PGXCNodeNameSimplified[NAMEDATALEN];
+ Oid toastspaceId;
+ uint32 timeLineId = 0;
+ CreateSchemaStmt* create_stmt = NULL;
+ char str[NAMEDATALEN * 2 + 64] = {0};
+ uint32 tempID = 0;
+ const uint32 NAME_SIMPLIFIED_LEN = 7;
+ uint32 nameLen = strlen(g_instance.attr.attr_common.PGXCNodeName);
+ int ret;
+ errno_t rc;
+
+#ifndef ENABLE_MULTIPLE_NODES
+ Assert(g_instance.exec_cxt.global_application_name != NULL);
+ nameLen = strlen(g_instance.exec_cxt.global_application_name);
+#endif
+
+ if (pg_database_aclcheck(u_sess->proc_cxt.MyDatabaseId, GetUserId(), ACL_CREATE_TEMP) != ACLCHECK_OK) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("permission denied to create temporary tables in database \"%s\"",
+ get_and_check_db_name(u_sess->proc_cxt.MyDatabaseId))));
+ }
+
+ check_nodegroup_privilege(GetUserId(), GetUserId(), ACL_CREATE);
+
+ if (RecoveryInProgress())
+ ereport(ERROR,
+ (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION), errmsg("cannot create temporary tables during recovery")));
+
+ timeLineId = get_controlfile_timeline();
+ tempID = __sync_add_and_fetch(>_tempID_seed, 1);
+
+ ret = strncpy_s(PGXCNodeNameSimplified,
+ sizeof(PGXCNodeNameSimplified),
+#ifndef ENABLE_MULTIPLE_NODES
+ g_instance.exec_cxt.global_application_name,
+#else
+ g_instance.attr.attr_common.PGXCNodeName,
+#endif
+ nameLen >= NAME_SIMPLIFIED_LEN ? NAME_SIMPLIFIED_LEN : nameLen);
+ securec_check(ret, "\0", "\0");
+
+ HeapTuple tup = NULL;
+ char* bootstrap_username = NULL;
+ tup = SearchSysCache1(AUTHOID, BOOTSTRAP_SUPERUSERID);
+ if (HeapTupleIsValid(tup)) {
+ bootstrap_username = pstrdup(NameStr(((Form_pg_authid)GETSTRUCT(tup))->rolname));
+ ReleaseSysCache(tup);
+ } else {
+ ereport(ERROR,
+ (errcode(ERRCODE_CACHE_LOOKUP_FAILED), errmsg("cache lookup failed for role %u", BOOTSTRAP_SUPERUSERID)));
+ }
+ if (!IsInitdb) {
+ ret = snprintf_s(toastNamespaceName,
+ sizeof(toastNamespaceName),
+ sizeof(toastNamespaceName) - 1,
+ "pg_toast_temp_%s_%u_%u_%lu",
+ PGXCNodeNameSimplified,
+ timeLineId,
+ tempID,
+ IS_THREAD_POOL_WORKER ? u_sess->session_id : (uint64)t_thrd.proc_cxt.MyProcPid);
+ } else {
+ ret = snprintf_s(toastNamespaceName,
+ sizeof(toastNamespaceName),
+ sizeof(toastNamespaceName) - 1,
+ "pg_toast_temp_%s",
+ PGXCNodeNameSimplified);
+ }
+
+ securec_check_ss(ret, "\0", "\0");
+
+ toastspaceId = get_namespace_oid(toastNamespaceName, true);
+ if (OidIsValid(toastspaceId)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_CACHE_LOOKUP_FAILED),
+ errmsg("toast Namespace Named %s has existed, please drop it and try again", toastNamespaceName)));
+ }
+
+ create_stmt = makeNode(CreateSchemaStmt);
+ create_stmt->authid = bootstrap_username;
+ create_stmt->schemaElts = NULL;
+ create_stmt->schemaname = toastNamespaceName;
+ create_stmt->temptype = Temp_Toast;
+ rc = memset_s(str, sizeof(str), 0, sizeof(str));
+ securec_check(rc, "", "");
+ ret = snprintf_s(str,
+ sizeof(str),
+ sizeof(str) - 1,
+ "CREATE SCHEMA %s AUTHORIZATION \"%s\"",
+ toastNamespaceName,
+ bootstrap_username);
+ securec_check_ss(ret, "\0", "\0");
+ ProcessUtility((Node*)create_stmt, str, NULL, false, None_Receiver, false, NULL);
+
+ /* Advance command counter to make namespace visible */
+ CommandCounterIncrement();
+
+ Assert(OidIsValid(u_sess->catalog_cxt.myTempNamespace) && OidIsValid(u_sess->catalog_cxt.myTempToastNamespace));
+
+ u_sess->catalog_cxt.baseSearchPathValid = false;
+}
+
+bool create_toast_by_sid(Oid *toastOid)
+{
+ char toast_relname[NAMEDATALEN];
+ char toast_idxname[NAMEDATALEN];
+ TupleDesc tupdesc;
+ IndexInfo* indexInfo = NULL;
+ Relation toast_rel;
+ Oid namespaceid = 0;
+ Oid collationObjectId[2];
+ Oid classObjectId[2];
+ int16 coloptions[2];
+ errno_t rc = EOK;
+ uint64 session_id = 0;
+ if (OidIsValid(u_sess->plsql_cxt.ActiveLobToastOid)) {
+ *toastOid = u_sess->plsql_cxt.ActiveLobToastOid;
+ return false;
+ }
+
+ session_id = IS_THREAD_POOL_WORKER ? u_sess->session_id : t_thrd.proc_cxt.MyProcPid;
+
+ rc = snprintf_s(toast_relname, sizeof(toast_relname), sizeof(toast_relname) - 1, "pg_temp_toast_%u", session_id);
+ securec_check_ss(rc, "\0", "\0");
+ rc = snprintf_s(
+ toast_idxname, sizeof(toast_idxname), sizeof(toast_idxname) - 1, "pg_temp_toast_%u_index", session_id);
+ securec_check_ss(rc, "\0", "\0");
+
+ /* this is pretty painful... need a tuple descriptor */
+ tupdesc = CreateTemplateTupleDesc(3, false);
+ TupleDescInitEntry(tupdesc, (AttrNumber)1, "chunk_id", OIDOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)2, "chunk_seq", INT4OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)3, "chunk_data", BYTEAOID, -1, 0);
+
+ /*
+ * Ensure that the toast table doesn't itself get toasted, or we'll be
+ * toast :-(. This is essential for chunk_data because type bytea is
+ * toastable; hit the other two just to be sure.
+ */
+ tupdesc->attrs[0]->attstorage = 'p';
+ tupdesc->attrs[1]->attstorage = 'p';
+ tupdesc->attrs[2]->attstorage = 'p';
+ if (OidIsValid(u_sess->catalog_cxt.myTempToastNamespace)) {
+ namespaceid = GetTempToastNamespace();
+ } else {
+ InitTempToastNamespace();
+ namespaceid = GetTempToastNamespace();
+ }
+
+ StorageType storage_type = HEAP_DISK;
+ Datum reloptions = (Datum)0;
+ Oid toast_relid = heap_create_with_catalog(toast_relname,
+ namespaceid,
+ u_sess->proc_cxt.MyDatabaseTableSpace,
+ InvalidOid,
+ InvalidOid,
+ InvalidOid,
+ GetUserId(),
+ tupdesc,
+ NIL,
+ RELKIND_TOASTVALUE,
+ RELPERSISTENCE_PERMANENT,
+ false,
+ false,
+ true,
+ 0,
+ ONCOMMIT_NOOP,
+ reloptions,
+ false,
+ true,
+ NULL,
+ REL_CMPRS_NOT_SUPPORT,
+ NULL,
+ true,
+ NULL,
+ storage_type);
+ Assert(toast_relid != InvalidOid);
+
+ toast_rel = heap_open(toast_relid, ShareLock);
+
+ Datum indexReloptions = (Datum)0;
+ List* indexOptions = NULL;
+ if (RelationIsUstoreFormat(toast_rel)) {
+ DefElem* def = makeDefElem("storage_type", (Node*)makeString(TABLE_ACCESS_METHOD_USTORE));
+ indexOptions = list_make1(def);
+ indexReloptions = transformRelOptions((Datum)0, indexOptions, NULL, NULL, false, false);
+ }
+
+ indexInfo = makeNode(IndexInfo);
+ indexInfo->ii_NumIndexAttrs = 2;
+ indexInfo->ii_NumIndexKeyAttrs = indexInfo->ii_NumIndexAttrs;
+ indexInfo->ii_KeyAttrNumbers[0] = 1;
+ indexInfo->ii_KeyAttrNumbers[1] = 2;
+ indexInfo->ii_Expressions = NIL;
+ indexInfo->ii_ExpressionsState = NIL;
+ indexInfo->ii_Predicate = NIL;
+ indexInfo->ii_PredicateState = NIL;
+ indexInfo->ii_ExclusionOps = NULL;
+ indexInfo->ii_ExclusionProcs = NULL;
+ indexInfo->ii_ExclusionStrats = NULL;
+ indexInfo->ii_Unique = true;
+ indexInfo->ii_ReadyForInserts = true;
+ indexInfo->ii_Concurrent = false;
+ indexInfo->ii_BrokenHotChain = false;
+ indexInfo->ii_PgClassAttrId = 0;
+ indexInfo->ii_ParallelWorkers = 0;
+
+ collationObjectId[0] = InvalidOid;
+ collationObjectId[1] = InvalidOid;
+
+ classObjectId[0] = OID_BTREE_OPS_OID;
+ classObjectId[1] = INT4_BTREE_OPS_OID;
+
+ coloptions[0] = 0;
+ coloptions[1] = 0;
+
+ IndexCreateExtraArgs extra;
+ SetIndexCreateExtraArgs(&extra, InvalidOid, false, false);
+
+ index_create(toast_rel,
+ toast_idxname,
+ InvalidOid,
+ InvalidOid,
+ indexInfo,
+ list_make2((void*)"chunk_id", (void*)"chunk_seq"),
+ BTREE_AM_OID,
+ u_sess->proc_cxt.MyDatabaseTableSpace,
+ collationObjectId,
+ classObjectId,
+ coloptions,
+ indexReloptions,
+ true,
+ false,
+ false,
+ false,
+ true,
+ !u_sess->upg_cxt.new_catalog_need_storage,
+ false,
+ &extra,
+ false);
+
+ heap_close(toast_rel, NoLock);
+ u_sess->plsql_cxt.ActiveLobToastOid = toast_relid;
+ *toastOid = toast_relid;
+ /*
+ * Make changes visible
+ */
+ CommandCounterIncrement();
+
+ return true;
+}
+
static Oid binary_upgrade_get_next_part_toast_pg_type_oid()
{
Oid old_part_toast_pg_type_oid;
diff --git a/src/common/backend/client_logic/client_logic.cpp b/src/common/backend/client_logic/client_logic.cpp
index e20daba17..7800f3cdc 100644
--- a/src/common/backend/client_logic/client_logic.cpp
+++ b/src/common/backend/client_logic/client_logic.cpp
@@ -252,7 +252,7 @@ void get_catalog_name(const RangeVar * const rel)
Oid existing_relid;
RangeVar *relation = const_cast(rel);
relation->catalogname = get_database_name(u_sess->proc_cxt.MyDatabaseId);
- namespace_id = RangeVarGetAndCheckCreationNamespace(relation, NoLock, &existing_relid);
+ namespace_id = RangeVarGetAndCheckCreationNamespace(relation, NoLock, &existing_relid, '\0');
if (relation->schemaname == NULL) {
relation->schemaname = get_namespace_name(namespace_id);
}
diff --git a/src/common/backend/client_logic/client_logic_proc.cpp b/src/common/backend/client_logic/client_logic_proc.cpp
index 596e366fb..65eace9ea 100755
--- a/src/common/backend/client_logic/client_logic_proc.cpp
+++ b/src/common/backend/client_logic/client_logic_proc.cpp
@@ -16,7 +16,7 @@
* client_logic_proc.cpp
*
* IDENTIFICATION
- * src\common\backend\client_logic\client_logic_proc.cpp
+ * src\common\backend\client_logic\client_logic_proc.cpp
*
* -------------------------------------------------------------------------
*/
@@ -33,6 +33,12 @@
#include "access/xact.h"
+/*
+ * @Description: save record in pg_depend for the dependency between clietn logic proc table and pg_proc
+ * @param[IN] func_id Oid of function in pg_proc
+ * @param[IN] gs_encrypted_proc_id Oid of function in gs_encrypted_proc
+ * @return: void
+ */
void record_proc_depend(const Oid func_id, const Oid gs_encrypted_proc_id)
{
ObjectAddress pg_proc_addr;
@@ -46,6 +52,49 @@ void record_proc_depend(const Oid func_id, const Oid gs_encrypted_proc_id)
recordDependencyOn(&gs_encrypted_proc_addr, &pg_proc_addr, DEPENDENCY_INTERNAL);
}
+void verify_out_param(HeapTuple oldtup, int *out_param_id)
+{
+ bool isNull = false;
+ Datum proargmodes;
+#ifndef ENABLE_MULTIPLE_NODES
+ if (t_thrd.proc->workingVersionNum < 92470) {
+ proargmodes = SysCacheGetAttr(PROCNAMEARGSNSP, oldtup, Anum_pg_proc_proargmodes, &isNull);
+ } else {
+ proargmodes = SysCacheGetAttr(PROCALLARGS, oldtup, Anum_pg_proc_proargmodes, &isNull);
+ }
+#else
+ proargmodes = SysCacheGetAttr(PROCNAMEARGSNSP, oldtup, Anum_pg_proc_proargmodes, &isNull);
+#endif
+ if (isNull) {
+ return;
+ }
+ ArrayType *arr = DatumGetArrayTypeP(proargmodes); /* ensure not toasted */
+ if (arr == NULL) {
+ return;
+ }
+ int n_modes = ARR_DIMS(arr)[0];
+ char *argmodes = (char*)ARR_DATA_PTR(arr);
+ for (int i = 0; i < n_modes; i++) {
+ if (argmodes[i] == PROARGMODE_OUT || argmodes[i] == PROARGMODE_INOUT ||
+ argmodes[i] == PROARGMODE_TABLE) {
+ if (*out_param_id == -1) {
+ *out_param_id = i;
+ } else {
+ /* there is more than one out param - ignore */
+ *out_param_id = -1;
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * @Description: inserting into gs tale the original return type - calclation by out params might happen for PLPGSQL
+ * @param[IN] func_id Oid of function in pg_proc
+ * @param[IN] ret_type original return type
+ * @param[IN] res_type client logic data type
+ * @return: void
+ */
void add_rettype_orig(const Oid func_id, const Oid ret_type, const Oid res_type)
{
bool nulls[Natts_pg_proc] = {0};
@@ -64,40 +113,17 @@ void add_rettype_orig(const Oid func_id, const Oid ret_type, const Oid res_type)
errmsg("cache lookup failed for function %u when initialize function cache.", func_id)));
}
/* for dynamic plpgsql there is not enough to replace ret value
- * also need to replace out parameter through wicj this value returned
+ * also need to replace out parameter through which this value returned
*/
int out_param_id = -1;
Oid out_param_type = InvalidOid;
int allnumargs = 0;
- Datum proargmodes;
-#ifndef ENABLE_MULTIPLE_NODES
- if (t_thrd.proc->workingVersionNum < 92470) {
- proargmodes = SysCacheGetAttr(PROCNAMEARGSNSP, oldtup, Anum_pg_proc_proargmodes, &isNull);
- } else {
- proargmodes = SysCacheGetAttr(PROCALLARGS, oldtup, Anum_pg_proc_proargmodes, &isNull);
- }
-#else
- proargmodes = SysCacheGetAttr(PROCNAMEARGSNSP, oldtup, Anum_pg_proc_proargmodes, &isNull);
-#endif
- if (!isNull) {
- ArrayType* arr = DatumGetArrayTypeP(proargmodes); /* ensure not toasted */
- if (arr) {
- int n_modes = ARR_DIMS(arr)[0];
- char* argmodes = (char*)ARR_DATA_PTR(arr);
- for (int i = 0; i < n_modes; i++) {
- if (argmodes[i] == PROARGMODE_OUT || argmodes[i] == PROARGMODE_INOUT ||
- argmodes[i] == PROARGMODE_TABLE) {
- if (out_param_id == -1) {
- out_param_id = i;
- } else {
- /* there is more than one out param - ignore */
- out_param_id = -1;
- break;
- }
- }
- }
- }
- }
+
+ /* since return type must match OUT params, if there is only 1 OUT param, so its data type is the return type
+ * if there are more than 1 out param, the return type is going to be recoerd which is beign processed in another
+ * function
+ */
+ verify_out_param(oldtup, &out_param_id);
if (out_param_id > -1) {
/* there is one out param - replace allargs as well */
Datum proallargtypes = SysCacheGetAttr(PROCOID, oldtup, Anum_pg_proc_proallargtypes, &isNull);
@@ -122,12 +148,14 @@ void add_rettype_orig(const Oid func_id, const Oid ret_type, const Oid res_type)
CatalogUpdateIndexes(rel, tup);
ReleaseSysCache(oldtup);
heap_close(rel, RowExclusiveLock);
+ CommandCounterIncrement();
HeapTuple gs_tup;
HeapTuple gs_oldtup = SearchSysCache1(GSCLPROCID, ObjectIdGetDatum(func_id));
Relation gs_rel = heap_open(ClientLogicProcId, RowExclusiveLock);
TupleDesc gs_tupDesc = RelationGetDescr(gs_rel);
gs_values[Anum_gs_encrypted_proc_last_change - 1] =
- DirectFunctionCall1(timestamptz_timestamp, GetCurrentTimestamp());
+ DirectFunctionCall1(timestamptz_timestamp, GetCurrentTimestamp());
+ gs_values[Anum_gs_encrypted_proc_prorettype_orig - 1] = ObjectIdGetDatum(ret_type);
if (!HeapTupleIsValid(gs_oldtup)) {
gs_values[Anum_gs_encrypted_proc_func_id - 1] = ObjectIdGetDatum(func_id);
gs_values[Anum_gs_encrypted_proc_prorettype_orig - 1] = ObjectIdGetDatum(ret_type);
@@ -175,7 +203,40 @@ void add_rettype_orig(const Oid func_id, const Oid ret_type, const Oid res_type)
ce_cache_refresh_type |= 0x20; /* update PROC cache */
}
-void add_allargtypes_orig(const Oid func_id, Datum* all_types_orig, Datum* all_types, const int tup_natts)
+
+/*
+ * @Description: get the pg_type Oid related to specific pg_class record
+ * @param[IN] relid Oid of the relation that we want to get its related type
+ * @return: type related to relid
+ */
+static Oid get_reltype_from_relid(const Oid relid)
+{
+ Oid reltypid = InvalidOid;
+ if (relid != InvalidOid) {
+ HeapTuple tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+ if (HeapTupleIsValid(tuple)) {
+ bool is_null;
+ Datum typid_datum = SysCacheGetAttr(RELOID, tuple, Anum_pg_class_reltype, &is_null);
+ if(!is_null) {
+ reltypid = DatumGetObjectId(typid_datum);
+ }
+ ReleaseSysCache(tuple);
+ }
+ }
+ return reltypid;
+}
+
+/*
+ * @Description: adding to the original parameters data types to gs_encrypted_proc
+ * @param[IN] func_id pg_proc Oid of the function
+ * @param[IN] all_types_orig Datum array of original data types in case of client logic, else -1
+ * @param[IN] all_types real types of the pg_proc record for this functions
+ * @param[IN] tup_natts number of attributes that will return in the function result type
+ * @param[IN] relid relation id of the table that the columns returned from
+ * @return: void
+ */
+void add_allargtypes_orig(const Oid func_id,
+ Datum* all_types_orig, Datum* all_types, const int tup_natts, const Oid relid)
{
Datum proargmodes = 0;
Datum gs_all_types_orig = 0;
@@ -192,7 +253,7 @@ void add_allargtypes_orig(const Oid func_id, Datum* all_types_orig, Datum* all_t
bool nulls[Natts_pg_proc] = {0};
Datum values[Natts_pg_proc] = {0};
bool replaces[Natts_pg_proc] = {0};
-
+ const Oid reltypid = get_reltype_from_relid(relid);
HeapTuple oldtup = SearchSysCache1(PROCOID, ObjectIdGetDatum(func_id));
if (!HeapTupleIsValid(oldtup)) {
ereport(ERROR, (errcode(ERRCODE_CACHE_LOOKUP_FAILED), errmodule(MOD_EXECUTOR),
@@ -201,6 +262,17 @@ void add_allargtypes_orig(const Oid func_id, Datum* all_types_orig, Datum* all_t
bool isNull = false;
Datum proAllArgTypes = SysCacheGetAttr(PROCOID, oldtup, Anum_pg_proc_proallargtypes, &isNull);
if (isNull) {
+ if (reltypid != InvalidOid) {
+ values[Anum_pg_proc_prorettype - 1] = ObjectIdGetDatum(reltypid);
+ replaces[Anum_pg_proc_prorettype-1] = true;
+ Relation rel = heap_open(ProcedureRelationId, RowExclusiveLock);
+ TupleDesc tupDesc = RelationGetDescr(rel);
+ HeapTuple tup = heap_modify_tuple(oldtup, tupDesc, values, nulls, replaces);
+ simple_heap_update(rel, &tup->t_self, tup);
+ CatalogUpdateIndexes(rel, tup);
+ heap_close(rel, RowExclusiveLock);
+ CommandCounterIncrement();
+ }
ReleaseSysCache(oldtup);
return; /* nothing to update */
}
@@ -216,6 +288,7 @@ void add_allargtypes_orig(const Oid func_id, Datum* all_types_orig, Datum* all_t
ReleaseSysCache(oldtup);
return;
}
+ /* for replacing the content of arr_all_arg_types it is easier to work with */
vec_all_arg_types = (Oid*)ARR_DATA_PTR(arr_all_arg_types);
#ifndef ENABLE_MULTIPLE_NODES
@@ -257,35 +330,37 @@ void add_allargtypes_orig(const Oid func_id, Datum* all_types_orig, Datum* all_t
}
/* Replace orig data types with replaced data types */
- int col = 0;
- for (int i = 0; i < tup_natts; i++) {
- if (vec_proargmodes) {
- bool is_input_params = vec_proargmodes[col] == PROARGMODE_IN || vec_proargmodes[col] == PROARGMODE_VARIADIC;
- while (is_input_params) {
- col++;
- if (col > allnumargs) {
- ereport(ERROR, (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
- errmsg("mismatch in number of output parameters for proallargtypes replace")));
+ if (vec_proargmodes) {
+ int col = 0;
+ for (int i = 0; i < tup_natts; i++) {
+ for(; col < allnumargs; col++) {
+ if(vec_proargmodes[col] == PROARGMODE_OUT || vec_proargmodes[col] == PROARGMODE_INOUT ||
+ vec_proargmodes[col] == PROARGMODE_TABLE) {
+ vec_all_arg_types[col] = DatumGetObjectId(all_types[i]);
+ vec_gs_all_types_orig[col] = DatumGetObjectId(all_types_orig[i]);
+ col++; /* force move to the next arg */
+ break;
}
- is_input_params = vec_proargmodes[col] == PROARGMODE_IN || vec_proargmodes[col] == PROARGMODE_INOUT ||
- vec_proargmodes[col] == PROARGMODE_VARIADIC;
}
- vec_all_arg_types[col] = DatumGetObjectId(all_types[i]);
- vec_gs_all_types_orig[col] = DatumGetObjectId(all_types_orig[i]);
- col++;
}
}
values[Anum_pg_proc_proallargtypes - 1] = PointerGetDatum(arr_all_arg_types);
replaces[Anum_pg_proc_proallargtypes - 1] = true;
+ if (reltypid != InvalidOid) {
+ values[Anum_pg_proc_prorettype - 1] = ObjectIdGetDatum(reltypid);
+ replaces[Anum_pg_proc_prorettype-1] = true;
+ }
+
Relation rel = heap_open(ProcedureRelationId, RowExclusiveLock);
TupleDesc tupDesc = RelationGetDescr(rel);
HeapTuple tup = heap_modify_tuple(oldtup, tupDesc, values, nulls, replaces);
simple_heap_update(rel, &tup->t_self, tup);
CatalogUpdateIndexes(rel, tup);
heap_close(rel, RowExclusiveLock);
+ CommandCounterIncrement();
Relation gs_rel = heap_open(ClientLogicProcId, RowExclusiveLock);
TupleDesc gs_tupDesc = RelationGetDescr(gs_rel);
- gs_values[Anum_gs_encrypted_proc_last_change - 1] =
+ gs_values[Anum_gs_encrypted_proc_last_change - 1] =
DirectFunctionCall1(timestamptz_timestamp, GetCurrentTimestamp());
if (!HeapTupleIsValid(gs_oldtup)) {
gs_values[Anum_gs_encrypted_proc_func_id - 1] = ObjectIdGetDatum(func_id);
@@ -312,45 +387,10 @@ void add_allargtypes_orig(const Oid func_id, Datum* all_types_orig, Datum* all_t
CatalogUpdateIndexes(gs_rel, gs_tup);
heap_close(gs_rel, RowExclusiveLock);
ce_cache_refresh_type |= 0x20; /* update PROC cache */
- CommandCounterIncrement();
ReleaseSysCache(oldtup);
+ CommandCounterIncrement();
}
-void verify_out_param(HeapTuple oldtup, int *out_param_id)
-{
- bool isNull = false;
- Datum proargmodes;
-#ifndef ENABLE_MULTIPLE_NODES
- if (t_thrd.proc->workingVersionNum < 92470) {
- proargmodes = SysCacheGetAttr(PROCNAMEARGSNSP, oldtup, Anum_pg_proc_proargmodes, &isNull);
- } else {
- proargmodes = SysCacheGetAttr(PROCALLARGS, oldtup, Anum_pg_proc_proargmodes, &isNull);
- }
-#else
- proargmodes = SysCacheGetAttr(PROCNAMEARGSNSP, oldtup, Anum_pg_proc_proargmodes, &isNull);
-#endif
- if (isNull) {
- return;
- }
- ArrayType *arr = DatumGetArrayTypeP(proargmodes); /* ensure not toasted */
- if (arr == NULL) {
- return;
- }
- int n_modes = ARR_DIMS(arr)[0];
- char *argmodes = (char*)ARR_DATA_PTR(arr);
- for (int i = 0; i < n_modes; i++) {
- if (argmodes[i] == PROARGMODE_OUT || argmodes[i] == PROARGMODE_INOUT ||
- argmodes[i] == PROARGMODE_TABLE) {
- if (*out_param_id == -1) {
- *out_param_id = i;
- } else {
- /* there is more than one out param - ignore */
- *out_param_id = -1;
- break;
- }
- }
- }
-}
void verify_rettype_for_out_param(const Oid func_id)
{
@@ -362,6 +402,10 @@ void verify_rettype_for_out_param(const Oid func_id)
bool gs_replaces[Natts_gs_encrypted_proc] = {0};
replaces[Anum_pg_proc_prorettype - 1] = true;
bool isNull = false;
+ int out_param_id = -1;
+ Oid out_param_type = InvalidOid;
+ int allnumargs = 0;
+
HeapTuple oldtup = SearchSysCache1(PROCOID, ObjectIdGetDatum(func_id));
if (!HeapTupleIsValid(oldtup)) {
ereport(ERROR, (errcode(ERRCODE_CACHE_LOOKUP_FAILED), errmodule(MOD_EXECUTOR),
@@ -376,9 +420,6 @@ void verify_rettype_for_out_param(const Oid func_id)
ReleaseSysCache(oldtup);
return;
}
- int out_param_id = -1;
- Oid out_param_type = InvalidOid;
- int allnumargs = 0;
verify_out_param(oldtup, &out_param_id);
if (out_param_id == -1) {
ReleaseSysCache(oldtup);
@@ -401,6 +442,7 @@ void verify_rettype_for_out_param(const Oid func_id)
return;
}
values[Anum_pg_proc_prorettype - 1] = out_param_type;
+
Relation rel = heap_open(ProcedureRelationId, RowExclusiveLock);
TupleDesc tupDesc = RelationGetDescr(rel);
HeapTuple tup = heap_modify_tuple(oldtup, tupDesc, values, nulls, replaces);
@@ -408,6 +450,7 @@ void verify_rettype_for_out_param(const Oid func_id)
CatalogUpdateIndexes(rel, tup);
ReleaseSysCache(oldtup);
heap_close(rel, RowExclusiveLock);
+ CommandCounterIncrement();
/* keep original rettype in gs_encrypted_proc */
HeapTuple gs_tup;
HeapTuple gs_oldtup = SearchSysCache1(GSCLPROCID, ObjectIdGetDatum(func_id));
@@ -424,7 +467,7 @@ void verify_rettype_for_out_param(const Oid func_id)
gs_all_args_orig[i] = ObjectIdGetDatum(-1);
}
gs_all_args_orig[out_param_id] = out_param_type;
- ArrayType *arr_gs_all_types_orig =
+ ArrayType *arr_gs_all_types_orig =
construct_array(gs_all_args_orig, allnumargs, INT4OID, sizeof(int4), true, 'i');
gs_values[Anum_gs_encrypted_proc_proallargtypes_orig - 1] = PointerGetDatum(arr_gs_all_types_orig);
pfree_ext(gs_all_args_orig);
@@ -450,14 +493,31 @@ void verify_rettype_for_out_param(const Oid func_id)
ce_cache_refresh_type |= 0x20; /* update PROC cache */
}
+/*
+ * @Description: delete all procedure client logic info and remove dependencies
+ * @param[IN] tuple of gs_encrypted_proc to be removed
+ * @return: void
+ */
+void delete_proc_client_info(HeapTuple old_gs_tup)
+{
+ deleteDependencyRecordsFor(ClientLogicProcId, HeapTupleGetOid(old_gs_tup), true);
+ Relation gs_rel = heap_open(ClientLogicProcId, RowExclusiveLock);
+ simple_heap_delete(gs_rel, &old_gs_tup->t_self);
+ heap_close(gs_rel, RowExclusiveLock);
+ ReleaseSysCache(old_gs_tup);
+ CommandCounterIncrement();
+}
+
+/*
+ * @Description: delete all procedure client logic info and remove dependencies
+ * @param[IN] func_id Oid of functions in pg_proc
+ * @return: void
+ */
void delete_proc_client_info(Oid func_id)
{
HeapTuple old_gs_tup = SearchSysCache1(GSCLPROCID, ObjectIdGetDatum(func_id));
if (HeapTupleIsValid(old_gs_tup)) {
- Relation gs_rel = heap_open(ClientLogicProcId, RowExclusiveLock);
- deleteDependencyRecordsFor(ClientLogicProcId, HeapTupleGetOid(old_gs_tup), true);
- simple_heap_delete(gs_rel, &old_gs_tup->t_self);
- heap_close(gs_rel, RowExclusiveLock);
- ReleaseSysCache(old_gs_tup);
+ ereport(DEBUG5, (errmsg("removing client logic procedure info for %u", func_id)));
+ delete_proc_client_info(old_gs_tup);
}
}
diff --git a/src/common/backend/lib/dllist.cpp b/src/common/backend/lib/dllist.cpp
index c781ec648..79cc63a23 100644
--- a/src/common/backend/lib/dllist.cpp
+++ b/src/common/backend/lib/dllist.cpp
@@ -235,15 +235,18 @@ DllistWithLock::~DllistWithLock()
SpinLockFree(&m_lock);
}
-void DllistWithLock::Remove(Dlelem* e)
+bool DllistWithLock::RemoveConfirm(Dlelem* e)
{
+ bool found = false;
START_CRIT_SECTION();
SpinLockAcquire(&(m_lock));
if (e->dle_list == &m_list) {
+ found = true;
DLRemove(e);
}
SpinLockRelease(&(m_lock));
END_CRIT_SECTION();
+ return found;
}
void DllistWithLock::AddHead(Dlelem* e)
@@ -279,6 +282,17 @@ Dlelem* DllistWithLock::RemoveHead()
return head;
}
+Dlelem* DllistWithLock::RemoveTail()
+{
+ Dlelem* head = NULL;
+ START_CRIT_SECTION();
+ SpinLockAcquire(&(m_lock));
+ head = DLRemTail(&m_list);
+ SpinLockRelease(&(m_lock));
+ END_CRIT_SECTION();
+ return head;
+}
+
bool DllistWithLock::IsEmpty()
{
START_CRIT_SECTION();
@@ -302,6 +316,12 @@ void DllistWithLock::GetLock()
SpinLockAcquire(&(m_lock));
}
+Dlelem* DllistWithLock::RemoveHeadNoLock()
+{
+ Dlelem* head = DLRemHead(&m_list);
+ return head;
+}
+
void DllistWithLock::ReleaseLock()
{
SpinLockRelease(&(m_lock));
diff --git a/src/common/backend/libpq/auth.cpp b/src/common/backend/libpq/auth.cpp
index 977379a73..8064d2224 100644
--- a/src/common/backend/libpq/auth.cpp
+++ b/src/common/backend/libpq/auth.cpp
@@ -64,12 +64,17 @@ extern GlobalNodeDefinition* global_node_definition;
* Global authentication functions
* ----------------------------------------------------------------
*/
+#ifndef ENABLE_UT
static void sendAuthRequest(Port* port, AuthRequest areq);
static void auth_failed(Port* port, int status);
static char* recv_password_packet(Port* port);
static int recv_and_check_password_packet(Port* port);
-static void clear_gss_info(pg_gssinfo* gss);
-static void clear_gssconn_info(GssConn *gss);
+#else
+void sendAuthRequest(Port* port, AuthRequest areq);
+void auth_failed(Port* port, int status);
+char* recv_password_packet(Port* port);
+int recv_and_check_password_packet(Port* port);
+#endif
/* ----------------------------------------------------------------
* Ident authentication
@@ -175,8 +180,15 @@ static int pg_krb5_recvauth(Port* port);
#else
#include
#endif
-
+#ifndef ENABLE_UT
static int pg_GSS_recvauth(Port* port);
+static void clear_gss_info(pg_gssinfo* gss);
+static void clear_gssconn_info(GssConn *gss);
+#else
+int pg_GSS_recvauth(Port* port);
+void clear_gss_info(pg_gssinfo* gss);
+void clear_gssconn_info(GssConn *gss);
+#endif
#endif /* ENABLE_GSS */
/* ----------------------------------------------------------------
@@ -227,7 +239,10 @@ THR_LOCAL ClientAuthentication_hook_type ClientAuthentication_hook = NULL;
* Note that many sorts of failure report additional information in the
* postmaster log, which we hope is only readable by good guys.
*/
-static void auth_failed(Port* port, int status)
+#ifndef ENABLE_UT
+static
+#endif
+ void auth_failed(Port* port, int status)
{
const char* errstr = NULL;
int errcode_return = ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION;
@@ -649,6 +664,12 @@ void ClientAuthentication(Port* port)
case uaCert:
#ifdef USE_SSL
+ /* Forbid remote connection with initial user. */
+ if (isRemoteInitialUser(port)) {
+ ereport(FATAL,
+ (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
+ errmsg("Forbid remote connection with initial user.")));
+ }
status = CheckCertAuth(port);
#else
Assert(false);
@@ -791,7 +812,10 @@ void GenerateFakeSaltBytes(const char* user_name, char* fake_salt_bytes, int sal
/*
* Send an authentication request packet to the frontend.
*/
-static bool GsGenerateFakeEncryptString(char* encrypt_string, const Port* port, int len)
+#ifndef ENABLE_UT
+static
+#endif
+ bool GsGenerateFakeEncryptString(char* encrypt_string, const Port* port, int len)
{
int retval = 0;
errno_t rc = EOK;
@@ -829,7 +853,10 @@ static bool GsGenerateFakeEncryptString(char* encrypt_string, const Port* port,
securec_check_ss(rc, "\0", "\0");
return true;
}
-static void sendAuthRequest(Port* port, AuthRequest areq)
+#ifndef ENABLE_UT
+static
+#endif
+ void sendAuthRequest(Port* port, AuthRequest areq)
{
/* Database Security: Support SHA256.*/
int32 stored_method = 0;
@@ -858,7 +885,7 @@ static void sendAuthRequest(Port* port, AuthRequest areq)
t_thrd.int_cxt.ImmediateInterruptOK = false;
#ifdef ENABLE_MULTIPLE_NODES
- if (IsDSorHaWalSender()) {
+ if (IsDSorHaWalSender() && !AM_WAL_HADR_SENDER && !AM_WAL_HADR_CN_SENDER) {
#else
if (IsDSorHaWalSender() && is_node_internal_connection(port) && !AM_WAL_HADR_SENDER) {
#endif
@@ -1168,7 +1195,10 @@ static void sendAuthRequest(Port* port, AuthRequest areq)
*
* Returns NULL if couldn't get password, else palloc'd string.
*/
-static char* recv_password_packet(Port* port)
+#ifndef ENABLE_UT
+static
+#endif
+ char* recv_password_packet(Port* port)
{
StringInfoData buf;
@@ -1245,7 +1275,10 @@ static char* recv_password_packet(Port* port)
* Called when we have sent an authorization request for a password.
* Get the response and check it.
*/
-static int recv_and_check_password_packet(Port* port)
+#ifndef ENABLE_UT
+static
+#endif
+ int recv_and_check_password_packet(Port* port)
{
int result;
int rcs = 0;
@@ -1480,7 +1513,10 @@ static GSS_DLLIMP gss_OID GSS_C_NT_USER_NAME = &GSS_C_NT_USER_NAME_desc;
* Generate an error for GSSAPI authentication. The caller should apply
* _() to errmsg to make it translatable.
*/
-static void pg_GSS_error(int severity, char* errmsg, OM_uint32 maj_stat, OM_uint32 min_stat)
+#ifndef ENABLE_UT
+static
+#endif
+ void pg_GSS_error(int severity, char* errmsg, OM_uint32 maj_stat, OM_uint32 min_stat)
{
gss_buffer_desc gmsg;
OM_uint32 lmin_s, msg_ctx;
@@ -1521,7 +1557,10 @@ static void pg_GSS_error(int severity, char* errmsg, OM_uint32 maj_stat, OM_uint
ereport(severity, (errmsg_internal("%s", errmsg), errdetail_internal("%s: %s", msg_major, msg_minor)));
}
-static int pg_GSS_recvauth(Port* port)
+#ifndef ENABLE_UT
+static
+#endif
+ int pg_GSS_recvauth(Port* port)
{
OM_uint32 maj_stat, min_stat, gflags;
int mtype;
@@ -1813,7 +1852,10 @@ static int pg_GSS_recvauth(Port* port)
* @in size : the size of data which need to be sent.
* @return : the number of bytes sent or -1 for error.
*/
-static int GssInternalSend(int fd, const void* data, int size)
+#ifndef ENABLE_UT
+static
+#endif
+ int GssInternalSend(int fd, const void* data, int size)
{
ssize_t nbytes;
ssize_t nSend = 0;
@@ -1850,7 +1892,10 @@ static int GssInternalSend(int fd, const void* data, int size)
* @in size : the size of data which need recv.
* @return : the number of bytes received or -1 for error.
*/
-static int GssInternalRecv(int fd, void* data, int size)
+#ifndef ENABLE_UT
+static
+#endif
+ int GssInternalRecv(int fd, void* data, int size)
{
#define MSG_NOTIFICATION 0x8000
@@ -1939,7 +1984,10 @@ static int GssSendWithType(GssConn* gss_conn, char type)
* @in type : the data type need to recv.
* @return : 0 for success and -1 for failed.
*/
-static int GssRecvWithType(GssConn* gss_conn, char type)
+#ifndef ENABLE_UT
+static
+#endif
+ int GssRecvWithType(GssConn* gss_conn, char type)
{
#define MSG_HEAD_LEN 5 /* sizeof(char)+sizeof(int) */
@@ -2094,7 +2142,10 @@ static char* GssGetKerberosHostName()
* @in server_host : the server ip.
* @return : 0 for success and -1 for error.
*/
-static int GssImportName(GssConn* gss_conn, char* server_host)
+#ifndef ENABLE_UT
+static
+#endif
+ int GssImportName(GssConn* gss_conn, char* server_host)
{
#define MAXENVLEN 1024
@@ -2139,6 +2190,7 @@ static int GssImportName(GssConn* gss_conn, char* server_host)
* @in gss_conn : stored the messages used in authentication.
* @return : 0 for success and -1 for error.
*/
+
static int GssClientInit(GssConn* gss_conn)
{
#define MAX_KERBEROS_CAPACITY 3000 /* The max capacity of kerberos is 3000 per second */
@@ -2409,7 +2461,10 @@ static int GssServerAccept(GssConn* gss_conn)
* @in gss_conn : to stored the messages used in gss authentication.
* @return : 0 for success and -1 for error.
*/
-static int GssServerContinue(GssConn* gss_conn)
+#ifndef ENABLE_UT
+static
+#endif
+ int GssServerContinue(GssConn* gss_conn)
{
int re = -1;
@@ -2483,6 +2538,42 @@ int GssServerAuth(int socket, const char* krb_keyfile)
return GssServerContinue(&gss_conn);
}
+/*
+ * release kerberos gss connection info
+ * if the handle to be released is specified GSS_C_NO_CREDENTIAL or GSS_C_NO_CONTEXT(which is initial status),
+ * the function will complete successfully but do nothing, so that it's safe to invoke the function without pre-judge
+ */
+#ifndef ENABLE_UT
+static
+#endif
+ void clear_gss_info(pg_gssinfo* gss)
+{
+ /* status codes coming from gss interface */
+ OM_uint32 lmin_s = 0;
+ /* Release service principal credentials */
+ (void)gss_release_cred(&lmin_s, &gss->cred);
+ /* Release gss security context and name after server authentication finished */
+ (void)gss_delete_sec_context(&lmin_s, &gss->ctx, GSS_C_NO_BUFFER);
+ /* Release gss_name and gss_buf */
+ (void)gss_release_name(&lmin_s, &gss->name);
+}
+
+/*
+ * release kerberos gss stream connection info
+ * the function will complete successfully but do nothing, so that it's safe to invoke the function without pre-judge
+ */
+#ifndef ENABLE_UT
+static
+#endif
+ void clear_gssconn_info(GssConn *gss)
+{
+ /* status codes coming from gss interface */
+ OM_uint32 lmin_s = 0;
+ /* Release gss security context and name after server authentication finished */
+ (void)gss_delete_sec_context(&lmin_s, &gss->gctx, GSS_C_NO_BUFFER);
+ /* Release gss_name and gss_buf */
+ (void)gss_release_name(&lmin_s, &gss->gtarg_nam);
+}
#endif /* ENABLE_GSS */
/* ----------------------------------------------------------------
@@ -3016,7 +3107,10 @@ ident_inet_done:
*/
#ifdef HAVE_UNIX_SOCKETS
-static int auth_peer(hbaPort* port)
+#ifndef ENABLE_UT
+static
+#endif
+ int auth_peer(hbaPort* port)
{
char ident_user[IDENT_USERNAME_MAX + 1];
uid_t uid;
@@ -3544,7 +3638,10 @@ static int CheckLDAPAuth(Port* port)
* ----------------------------------------------------------------
*/
#ifdef USE_SSL
-static int CheckCertAuth(Port* port)
+#ifndef ENABLE_UT
+static
+#endif
+ int CheckCertAuth(Port* port)
{
Assert(port->ssl);
@@ -3645,34 +3742,3 @@ static int CheckIAMAuth(Port* port)
return STATUS_OK;
}
#endif
-
-/*
- * release kerberos gss connection info
- * if the handle to be released is specified GSS_C_NO_CREDENTIAL or GSS_C_NO_CONTEXT(which is initial status),
- * the function will complete successfully but do nothing, so that it's safe to invoke the function without pre-judge
- */
-static void clear_gss_info(pg_gssinfo* gss)
-{
- /* status codes coming from gss interface */
- OM_uint32 lmin_s = 0;
- /* Release service principal credentials */
- (void)gss_release_cred(&lmin_s, &gss->cred);
- /* Release gss security context and name after server authentication finished */
- (void)gss_delete_sec_context(&lmin_s, &gss->ctx, GSS_C_NO_BUFFER);
- /* Release gss_name and gss_buf */
- (void)gss_release_name(&lmin_s, &gss->name);
-}
-
-/*
- * release kerberos gss stream connection info
- * the function will complete successfully but do nothing, so that it's safe to invoke the function without pre-judge
- */
-static void clear_gssconn_info(GssConn *gss)
-{
- /* status codes coming from gss interface */
- OM_uint32 lmin_s = 0;
- /* Release gss security context and name after server authentication finished */
- (void)gss_delete_sec_context(&lmin_s, &gss->gctx, GSS_C_NO_BUFFER);
- /* Release gss_name and gss_buf */
- (void)gss_release_name(&lmin_s, &gss->gtarg_nam);
-}
diff --git a/src/common/backend/libpq/be-secure.cpp b/src/common/backend/libpq/be-secure.cpp
index bbd89cdca..c9f02b34e 100644
--- a/src/common/backend/libpq/be-secure.cpp
+++ b/src/common/backend/libpq/be-secure.cpp
@@ -96,7 +96,6 @@ typedef enum DHKeyLength {
DHKey8192
} DHKeyLength;
-static int verify_cb(int ok, X509_STORE_CTX* ctx);
static void info_cb(const SSL* ssl, int type, int args);
static const char* SSLerrmessage(void);
static void set_user_config_ssl_ciphers(const char* sslciphers);
@@ -122,16 +121,19 @@ extern THR_LOCAL unsigned char disable_pqlocking;
/* security ciphers suites in SSL connection */
static const char* ssl_ciphers_map[] = {
- TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256, /* TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 */
- TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384, /* TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 */
- TLS1_TXT_DHE_RSA_WITH_AES_128_CCM, /* TLS_DHE_RSA_WITH_AES_128_CCM */
- TLS1_TXT_DHE_RSA_WITH_AES_256_CCM, /* TLS_DHE_RSA_WITH_AES_256_CCM */
- TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384, /* TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 */
TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256, /* TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 */
- TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, /* TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 */
+ TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384, /* TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 */
TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, /* TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 */
+ TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, /* TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 */
+ /* The following are compatible with earlier versions of the client. */
+ TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256, /* TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, */
+ TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384, /* TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 */
NULL};
+#ifndef ENABLE_UT
+static
+#endif
+bool g_server_crl_err = false;
#endif
const char* ssl_cipher_file = "server.key.cipher";
@@ -442,60 +444,60 @@ ssize_t secure_write(Port* port, void* ptr, size_t len)
* criteria (e.g., accepting self-signed or expired certs), but
* for now we accept the default checks.
*/
+int be_verify_cb(int ok, X509_STORE_CTX* ctx)
+{
+ if (ok) {
+ return ok;
+ }
- static int verify_cb(int ok, X509_STORE_CTX* ctx)
- {
- int cert_error = X509_STORE_CTX_get_error(ctx);
+ /*
+ * When the CRL is abnormal, it won't be used to check whether the certificate is revoked,
+ * and the services shouldn't be affected due to the CRL exception.
+ */
+ const int crl_err_scenarios[] = {
+ X509_V_ERR_CRL_HAS_EXPIRED,
+ X509_V_ERR_UNABLE_TO_GET_CRL,
+ X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE,
+ X509_V_ERR_CRL_SIGNATURE_FAILURE,
+ X509_V_ERR_CRL_NOT_YET_VALID,
+ X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD,
+ X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD,
+ X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER,
+ X509_V_ERR_KEYUSAGE_NO_CRL_SIGN,
+ X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION,
+ X509_V_ERR_DIFFERENT_CRL_SCOPE,
+ X509_V_ERR_CRL_PATH_VALIDATION_ERROR
+ };
+ bool ignore_crl_err = false;
- if (!ok)
- {
- ereport(LOG, (errmsg("verify error:num=%d:%s \n", cert_error,
- X509_verify_cert_error_string(cert_error))));
- switch (cert_error)
- {
- case X509_V_ERR_CRL_HAS_EXPIRED:
- ok = 1;
- break;
- case X509_V_ERR_UNABLE_TO_GET_CRL:
- ok = 1;
- break;
- case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
- ok = 1;
- break;
- case X509_V_ERR_CRL_SIGNATURE_FAILURE:
- ok = 1;
- break;
- case X509_V_ERR_CRL_NOT_YET_VALID:
- ok = 1;
- break;
- case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
- ok = 1;
- break;
- case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
- ok = 1;
- break;
- case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
- ok = 1;
- break;
- case X509_V_ERR_KEYUSAGE_NO_CRL_SIGN:
- ok = 1;
- break;
- case X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION:
- ok = 1;
- break;
- case X509_V_ERR_DIFFERENT_CRL_SCOPE:
- ok = 1;
- break;
- case X509_V_ERR_CRL_PATH_VALIDATION_ERROR:
- ok = 1;
- break;
- default:
- break;
- }
- }
+ int err_code = X509_STORE_CTX_get_error(ctx);
+ const char *err_msg = X509_verify_cert_error_string(err_code);
+ if (!g_server_crl_err) {
+ for (size_t i = 0; i < sizeof(crl_err_scenarios) / sizeof(crl_err_scenarios[0]); i++) {
+ if (err_code == crl_err_scenarios[i]) {
+ ereport(LOG,
+ (errmsg("During SSL authentication, there are some errors in the CRL, so we just ignore the CRL. "
+ "{ssl err code: %d, ssl err message: %s}\n", err_code, err_msg)));
+
+ g_server_crl_err = true;
+ ignore_crl_err = true;
+ break;
+ }
+ }
+ } else {
+ if (err_code == X509_V_ERR_CERT_REVOKED) {
+ g_server_crl_err = false; /* reset */
+ ignore_crl_err = true;
+ }
+ }
- return ok;
- }
+ if (ignore_crl_err) {
+ X509_STORE_CTX_set_error(ctx, X509_V_OK);
+ ok = 1;
+ }
+
+ return ok;
+}
/*
* This callback is used to copy SSL information messages
@@ -855,7 +857,8 @@ static void initialize_SSL(void)
* presented. We might fail such connections later, depending on
* what we find in pg_hba.conf.
*/
- SSL_CTX_set_verify(u_sess->libpq_cxt.SSL_server_context, (SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE), verify_cb);
+ SSL_CTX_set_verify(u_sess->libpq_cxt.SSL_server_context, (SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE),
+ be_verify_cb);
/* Increase the depth to support multi-level certificate. */
SSL_CTX_set_verify_depth(u_sess->libpq_cxt.SSL_server_context, (MAX_CERTIFICATE_DEPTH_SUPPORTED - 2));
@@ -889,6 +892,8 @@ static int open_server_SSL(Port* port)
Assert(port->ssl == NULL);
Assert(port->peer == NULL);
+ g_server_crl_err = false;
+
port->ssl = SSL_new(u_sess->libpq_cxt.SSL_server_context);
if (port->ssl == NULL) {
ereport(COMMERROR,
diff --git a/src/common/backend/libpq/hba.cpp b/src/common/backend/libpq/hba.cpp
index 46289eb1b..89dd61d48 100644
--- a/src/common/backend/libpq/hba.cpp
+++ b/src/common/backend/libpq/hba.cpp
@@ -1396,7 +1396,7 @@ static void check_hba_replication(hbaPort* port)
HbaToken* tok = NULL;
tok = (HbaToken*)lfirst(cell);
if (token_is_keyword(tok, "replication") && hba->conntype != ctLocal) {
- if (hba->auth_method != uaGSS && !AM_WAL_HADR_SENDER) {
+ if (hba->auth_method != uaGSS && !AM_WAL_HADR_SENDER && !AM_WAL_HADR_CN_SENDER) {
hba->auth_method = uaTrust;
}
ereport(LOG,
@@ -1590,7 +1590,7 @@ static void check_hba(hbaPort* port)
if (!isUsernameSame && hba->auth_method == uaTrust) {
hba->auth_method = get_default_auth_method(port->user_name);
}
- } else if (hba->auth_method == uaTrust) {
+ } else if (hba->auth_method == uaTrust || hba->auth_method == uaPeer) {
/* For non-initdb user, password is always needed */
hba->auth_method = get_default_auth_method(port->user_name);
}
diff --git a/src/common/backend/libpq/pqcomm.cpp b/src/common/backend/libpq/pqcomm.cpp
index 40cde3203..8e54da4df 100644
--- a/src/common/backend/libpq/pqcomm.cpp
+++ b/src/common/backend/libpq/pqcomm.cpp
@@ -810,7 +810,7 @@ int StreamServerPort(int family, char* hostName, unsigned short portNumber, cons
sinp = (struct sockaddr*)(addr->ai_addr);
if (addr->ai_family == AF_INET6) {
result = inet_net_ntop(AF_INET6,
- &((struct sockaddr_in*)sinp)->sin_addr,
+ &((struct sockaddr_in6*)sinp)->sin6_addr,
128,
t_thrd.postmaster_cxt.LocalAddrList[t_thrd.postmaster_cxt.LocalIpNum],
IP_LEN);
@@ -1587,6 +1587,39 @@ int pq_flush(void)
return res;
}
+/* If query is been canceled, print information */
+static void QueryCancelPrint()
+{
+ if (t_thrd.storage_cxt.cancel_from_timeout) {
+ /* For STATEMENT、AUTOVACUUM、WLM、DEADLOCK timeout */
+ ereport(LOG,
+ (errcode(ERRCODE_QUERY_CANCELED),
+ errmsg("canceling statement due to statement timeout"),
+ ignore_interrupt(true)));
+ } else {
+ /* If node is coordinator, client is "user". And if node is datanode, client is "coordinator" */
+ ereport(LOG,
+ (errcode(ERRCODE_QUERY_CANCELED),
+ errmsg("canceling statement due to %s request", IS_PGXC_DATANODE ? "coordinator" : "user"),
+ ignore_interrupt(true)));
+ }
+ return;
+}
+
+/* If send message to client failed, set flag to true */
+static void SetConnectionLostFlag()
+{
+ if ((StreamThreadAmI() == false) && (!t_thrd.proc_cxt.proc_exit_inprogress)) {
+ /* For client connection, set ClientConnectionLost to true */
+ t_thrd.int_cxt.ClientConnectionLost = 1;
+ InterruptPending = 1;
+ } else if (StreamThreadAmI()) {
+ /* For stream connection, set StreamConnectionLost to true */
+ t_thrd.int_cxt.StreamConnectionLost = 1;
+ }
+ return;
+}
+
/* --------------------------------
* internal_flush - flush pending output
*
@@ -1602,8 +1635,10 @@ int internal_flush(void)
static THR_LOCAL int last_reported_send_errno = 0;
+ errno_t ret;
char* bufptr = t_thrd.libpq_cxt.PqSendBuffer + t_thrd.libpq_cxt.PqSendStart;
char* bufend = t_thrd.libpq_cxt.PqSendBuffer + t_thrd.libpq_cxt.PqSendPointer;
+ char connTimeInfoStr[INITIAL_EXPBUFFER_SIZE] = {'\0'};
WaitState oldStatus = pgstat_report_waitstatus(STATE_WAIT_UNDEFINED, true);
if (StreamThreadAmI() == false) {
@@ -1617,6 +1652,20 @@ int internal_flush(void)
global_node_definition ? global_node_definition->num_nodes : -1);
}
+ /*
+ * In session initialize process, client is connecting.
+ * If reply messages failed, we record entire connecting time and print it in error message.
+ */
+ if (u_sess->clientConnTime_cxt.checkOnlyInConnProcess) {
+ instr_time currentTime;
+ INSTR_TIME_SET_CURRENT(u_sess->clientConnTime_cxt.connEndTime);
+ currentTime = u_sess->clientConnTime_cxt.connEndTime;
+ INSTR_TIME_SUBTRACT(currentTime, u_sess->clientConnTime_cxt.connStartTime);
+ ret = sprintf_s(connTimeInfoStr, INITIAL_EXPBUFFER_SIZE,
+ " Client connection consumes %lfms.", INSTR_TIME_GET_MILLISEC(currentTime));
+ securec_check_ss(ret, "", "");
+ }
+
while (bufptr < bufend) {
int r;
@@ -1624,18 +1673,7 @@ int internal_flush(void)
if (unlikely(r == 0 && (StreamThreadAmI() == true || u_sess->proc_cxt.MyProcPort->is_logic_conn))) {
/* Stop query when cancel happend */
if (t_thrd.int_cxt.QueryCancelPending) {
- if (t_thrd.storage_cxt.cancel_from_timeout) {
- ereport(LOG,
- (errcode(ERRCODE_QUERY_CANCELED),
- errmsg("canceling statement due to statement timeout"),
- ignore_interrupt(true)));
- } else {
- ereport(LOG,
- (errcode(ERRCODE_QUERY_CANCELED),
- errmsg("canceling statement due to %s request", IS_PGXC_DATANODE ? "coordinator" : "user"),
- ignore_interrupt(true)));
- }
-
+ QueryCancelPrint();
(void)pgstat_report_waitstatus(oldStatus);
return EOF;
} else {
@@ -1671,16 +1709,16 @@ int internal_flush(void)
last_reported_send_errno = errno;
ereport(COMMERROR,
(errcode_for_socket_access(),
- errmsg("could not send data to client [ Remote IP: %s PORT: %s FD: %d BLOCK: %d]. Detail: %m",
+ errmsg("could not send data to client [ Remote IP: %s PORT: %s FD: %d BLOCK: %d].%s Detail: %m",
u_sess->proc_cxt.MyProcPort->remote_host,
(u_sess->proc_cxt.MyProcPort->remote_port != NULL &&
u_sess->proc_cxt.MyProcPort->remote_port[0] != '\0')
? u_sess->proc_cxt.MyProcPort->remote_port : "",
u_sess->proc_cxt.MyProcPort->sock,
- u_sess->proc_cxt.MyProcPort->noblock)));
+ u_sess->proc_cxt.MyProcPort->noblock,
+ connTimeInfoStr)));
}
-
/*
* We drop the buffered data anyway so that processing can
* continue, even though we'll probably quit soon. We also set a
@@ -1688,12 +1726,7 @@ int internal_flush(void)
* the connection.
*/
t_thrd.libpq_cxt.PqSendStart = t_thrd.libpq_cxt.PqSendPointer = 0;
- if ((StreamThreadAmI() == false) && (!t_thrd.proc_cxt.proc_exit_inprogress)) {
- t_thrd.int_cxt.ClientConnectionLost = 1;
- InterruptPending = 1;
- } else if (StreamThreadAmI()) {
- t_thrd.int_cxt.StreamConnectionLost = 1;
- }
+ SetConnectionLostFlag();
(void)pgstat_report_waitstatus(oldStatus);
return EOF;
}
diff --git a/src/common/backend/libpq/sha2.cpp b/src/common/backend/libpq/sha2.cpp
index fef86f448..3b996ffe2 100644
--- a/src/common/backend/libpq/sha2.cpp
+++ b/src/common/backend/libpq/sha2.cpp
@@ -697,6 +697,14 @@ bool pg_sha256_encrypt(
return true;
}
+#ifdef ENABLE_LITE_MODE
+bool pg_sha256_encrypt_v1(
+ const char* password, const char* salt_s, size_t salt_len, char* buf, char* client_key_buf)
+{
+ return pg_sha256_encrypt(password, salt_s, salt_len, buf, client_key_buf, ITERATION_COUNT_V1);
+}
+#endif
+
/* Caller must ensure that the length of the password1 and password2 are the same, and equal to the length */
int XOR_between_password(const char* password1, const char* password2, char* r, int length)
{
diff --git a/src/common/backend/nodes/copyfuncs.cpp b/src/common/backend/nodes/copyfuncs.cpp
index 6f88706f4..1271749d9 100644
--- a/src/common/backend/nodes/copyfuncs.cpp
+++ b/src/common/backend/nodes/copyfuncs.cpp
@@ -312,6 +312,7 @@ static ModifyTable* _copyModifyTable(const ModifyTable* from)
COPY_NODE_FIELD(updateTlist);
COPY_NODE_FIELD(exclRelTlist);
COPY_SCALAR_FIELD(exclRelRTIndex);
+ COPY_NODE_FIELD(upsertWhere);
return newnode;
}
@@ -569,6 +570,8 @@ static void CopyScanFields(const Scan* from, Scan* newnode)
newnode->pruningInfo = copyPruningResult(from->pruningInfo);
COPY_SCALAR_FIELD(scan_qual_optimized);
COPY_SCALAR_FIELD(predicate_pushdown_optimized);
+ COPY_SCALAR_FIELD(scanBatchMode);
+ COPY_SCALAR_FIELD(tableRows);
/* partition infos */
COPY_NODE_FIELD(bucketInfo);
@@ -1273,6 +1276,7 @@ static HashJoin* _copyHashJoin(const HashJoin* from)
COPY_SCALAR_FIELD(rebuildHashTable);
COPY_SCALAR_FIELD(isSonicHash);
CopyMemInfoFields(&from->mem_info, &newnode->mem_info);
+ COPY_SCALAR_FIELD(joinRows);
return newnode;
}
@@ -1547,6 +1551,9 @@ static PlanRowMark* _copyPlanRowMark(const PlanRowMark* from)
COPY_SCALAR_FIELD(rowmarkId);
COPY_SCALAR_FIELD(markType);
COPY_SCALAR_FIELD(noWait);
+ if (t_thrd.proc->workingVersionNum >= WAIT_N_TUPLE_LOCK_VERSION_NUM) {
+ COPY_SCALAR_FIELD(waitSec);
+ }
COPY_SCALAR_FIELD(isParent);
COPY_SCALAR_FIELD(numAttrs);
COPY_BITMAPSET_FIELD(bms_nodeids);
@@ -2367,6 +2374,7 @@ static Var* _copyVar(const Var* from)
{
Var* newnode = makeNode(Var);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(varno);
COPY_SCALAR_FIELD(varattno);
COPY_SCALAR_FIELD(vartype);
@@ -2387,6 +2395,7 @@ static Const* _copyConst(const Const* from)
{
Const* newnode = makeNode(Const);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(consttype);
COPY_SCALAR_FIELD(consttypmod);
COPY_SCALAR_FIELD(constcollid);
@@ -2421,6 +2430,7 @@ static Param* _copyParam(const Param* from)
{
Param* newnode = makeNode(Param);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(paramkind);
COPY_SCALAR_FIELD(paramid);
COPY_SCALAR_FIELD(paramtype);
@@ -2440,6 +2450,7 @@ static Rownum* _copyRownum(const Rownum* from)
{
Rownum* newnode = (Rownum*)makeNode(Rownum);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(rownumcollid);
COPY_LOCATION_FIELD(location);
@@ -2453,6 +2464,7 @@ static Aggref* _copyAggref(const Aggref* from)
{
Aggref* newnode = makeNode(Aggref);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(aggfnoid);
COPY_SCALAR_FIELD(aggtype);
#ifdef PGXC
@@ -2482,6 +2494,7 @@ static GroupingFunc* _copyGroupingFunc(const GroupingFunc* from)
{
GroupingFunc* newnode = makeNode(GroupingFunc);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(args);
COPY_NODE_FIELD(refs);
COPY_NODE_FIELD(cols);
@@ -2509,6 +2522,7 @@ static WindowFunc* _copyWindowFunc(const WindowFunc* from)
{
WindowFunc* newnode = makeNode(WindowFunc);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(winfnoid);
COPY_SCALAR_FIELD(wintype);
COPY_SCALAR_FIELD(wincollid);
@@ -2529,6 +2543,7 @@ static ArrayRef* _copyArrayRef(const ArrayRef* from)
{
ArrayRef* newnode = makeNode(ArrayRef);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(refarraytype);
COPY_SCALAR_FIELD(refelemtype);
COPY_SCALAR_FIELD(reftypmod);
@@ -2548,6 +2563,7 @@ static FuncExpr* _copyFuncExpr(const FuncExpr* from)
{
FuncExpr* newnode = makeNode(FuncExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(funcid);
COPY_SCALAR_FIELD(funcresulttype);
COPY_SCALAR_FIELD(funcresulttype_orig);
@@ -2570,6 +2586,7 @@ static NamedArgExpr* _copyNamedArgExpr(const NamedArgExpr* from)
{
NamedArgExpr* newnode = makeNode(NamedArgExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_STRING_FIELD(name);
COPY_SCALAR_FIELD(argnumber);
@@ -2581,6 +2598,7 @@ static NamedArgExpr* _copyNamedArgExpr(const NamedArgExpr* from)
template
static void _copyCommonOpExprPart(const T* from, T* newnode)
{
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(opno);
COPY_SCALAR_FIELD(opfuncid);
COPY_SCALAR_FIELD(opresulttype);
@@ -2627,6 +2645,7 @@ static ScalarArrayOpExpr* _copyScalarArrayOpExpr(const ScalarArrayOpExpr* from)
{
ScalarArrayOpExpr* newnode = makeNode(ScalarArrayOpExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(opno);
COPY_SCALAR_FIELD(opfuncid);
COPY_SCALAR_FIELD(useOr);
@@ -2644,6 +2663,7 @@ static BoolExpr* _copyBoolExpr(const BoolExpr* from)
{
BoolExpr* newnode = makeNode(BoolExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(boolop);
COPY_NODE_FIELD(args);
COPY_LOCATION_FIELD(location);
@@ -2658,6 +2678,7 @@ static SubLink* _copySubLink(const SubLink* from)
{
SubLink* newnode = makeNode(SubLink);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(subLinkType);
COPY_NODE_FIELD(testexpr);
COPY_NODE_FIELD(operName);
@@ -2674,6 +2695,7 @@ static SubPlan* _copySubPlan(const SubPlan* from)
{
SubPlan* newnode = makeNode(SubPlan);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(subLinkType);
COPY_NODE_FIELD(testexpr);
COPY_NODE_FIELD(paramIds);
@@ -2700,6 +2722,7 @@ static AlternativeSubPlan* _copyAlternativeSubPlan(const AlternativeSubPlan* fro
{
AlternativeSubPlan* newnode = makeNode(AlternativeSubPlan);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(subplans);
return newnode;
@@ -2712,6 +2735,7 @@ static FieldSelect* _copyFieldSelect(const FieldSelect* from)
{
FieldSelect* newnode = makeNode(FieldSelect);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_SCALAR_FIELD(fieldnum);
COPY_SCALAR_FIELD(resulttype);
@@ -2728,6 +2752,7 @@ static FieldStore* _copyFieldStore(const FieldStore* from)
{
FieldStore* newnode = makeNode(FieldStore);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_NODE_FIELD(newvals);
COPY_NODE_FIELD(fieldnums);
@@ -2743,6 +2768,7 @@ static RelabelType* _copyRelabelType(const RelabelType* from)
{
RelabelType* newnode = makeNode(RelabelType);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_SCALAR_FIELD(resulttype);
COPY_SCALAR_FIELD(resulttypmod);
@@ -2760,6 +2786,7 @@ static CoerceViaIO* _copyCoerceViaIO(const CoerceViaIO* from)
{
CoerceViaIO* newnode = makeNode(CoerceViaIO);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_SCALAR_FIELD(resulttype);
COPY_SCALAR_FIELD(resultcollid);
@@ -2776,6 +2803,7 @@ static ArrayCoerceExpr* _copyArrayCoerceExpr(const ArrayCoerceExpr* from)
{
ArrayCoerceExpr* newnode = makeNode(ArrayCoerceExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_SCALAR_FIELD(elemfuncid);
COPY_SCALAR_FIELD(resulttype);
@@ -2795,6 +2823,7 @@ static ConvertRowtypeExpr* _copyConvertRowtypeExpr(const ConvertRowtypeExpr* fro
{
ConvertRowtypeExpr* newnode = makeNode(ConvertRowtypeExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_SCALAR_FIELD(resulttype);
COPY_SCALAR_FIELD(convertformat);
@@ -2810,6 +2839,7 @@ static CollateExpr* _copyCollateExpr(const CollateExpr* from)
{
CollateExpr* newnode = makeNode(CollateExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_SCALAR_FIELD(collOid);
COPY_LOCATION_FIELD(location);
@@ -2824,6 +2854,7 @@ static CaseExpr* _copyCaseExpr(const CaseExpr* from)
{
CaseExpr* newnode = makeNode(CaseExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(casetype);
COPY_SCALAR_FIELD(casecollid);
COPY_NODE_FIELD(arg);
@@ -2841,6 +2872,7 @@ static CaseWhen* _copyCaseWhen(const CaseWhen* from)
{
CaseWhen* newnode = makeNode(CaseWhen);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(expr);
COPY_NODE_FIELD(result);
COPY_LOCATION_FIELD(location);
@@ -2855,6 +2887,7 @@ static CaseTestExpr* _copyCaseTestExpr(const CaseTestExpr* from)
{
CaseTestExpr* newnode = makeNode(CaseTestExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(typeId);
COPY_SCALAR_FIELD(typeMod);
COPY_SCALAR_FIELD(collation);
@@ -2869,6 +2902,7 @@ static ArrayExpr* _copyArrayExpr(const ArrayExpr* from)
{
ArrayExpr* newnode = makeNode(ArrayExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(array_typeid);
COPY_SCALAR_FIELD(array_collid);
COPY_SCALAR_FIELD(element_typeid);
@@ -2886,6 +2920,7 @@ static RowExpr* _copyRowExpr(const RowExpr* from)
{
RowExpr* newnode = makeNode(RowExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(args);
COPY_SCALAR_FIELD(row_typeid);
COPY_SCALAR_FIELD(row_format);
@@ -2902,6 +2937,7 @@ static RowCompareExpr* _copyRowCompareExpr(const RowCompareExpr* from)
{
RowCompareExpr* newnode = makeNode(RowCompareExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(rctype);
COPY_NODE_FIELD(opnos);
COPY_NODE_FIELD(opfamilies);
@@ -2919,6 +2955,7 @@ static CoalesceExpr* _copyCoalesceExpr(const CoalesceExpr* from)
{
CoalesceExpr* newnode = makeNode(CoalesceExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(coalescetype);
COPY_SCALAR_FIELD(coalescecollid);
COPY_NODE_FIELD(args);
@@ -2936,6 +2973,7 @@ static MinMaxExpr* _copyMinMaxExpr(const MinMaxExpr* from)
{
MinMaxExpr* newnode = makeNode(MinMaxExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(minmaxtype);
COPY_SCALAR_FIELD(minmaxcollid);
COPY_SCALAR_FIELD(inputcollid);
@@ -2953,6 +2991,7 @@ static XmlExpr* _copyXmlExpr(const XmlExpr* from)
{
XmlExpr* newnode = makeNode(XmlExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(op);
COPY_STRING_FIELD(name);
COPY_NODE_FIELD(named_args);
@@ -2973,6 +3012,7 @@ static NullTest* _copyNullTest(const NullTest* from)
{
NullTest* newnode = makeNode(NullTest);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_SCALAR_FIELD(nulltesttype);
COPY_SCALAR_FIELD(argisrow);
@@ -2987,6 +3027,7 @@ static HashFilter* _copyHashFilter(const HashFilter* from)
{
HashFilter* newnode = makeNode(HashFilter);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_NODE_FIELD(typeOids);
COPY_NODE_FIELD(nodeList);
@@ -3001,6 +3042,7 @@ static BooleanTest* _copyBooleanTest(const BooleanTest* from)
{
BooleanTest* newnode = makeNode(BooleanTest);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_SCALAR_FIELD(booltesttype);
@@ -3014,6 +3056,7 @@ static CoerceToDomain* _copyCoerceToDomain(const CoerceToDomain* from)
{
CoerceToDomain* newnode = makeNode(CoerceToDomain);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_NODE_FIELD(arg);
COPY_SCALAR_FIELD(resulttype);
COPY_SCALAR_FIELD(resulttypmod);
@@ -3031,6 +3074,7 @@ static CoerceToDomainValue* _copyCoerceToDomainValue(const CoerceToDomainValue*
{
CoerceToDomainValue* newnode = makeNode(CoerceToDomainValue);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(typeId);
COPY_SCALAR_FIELD(typeMod);
COPY_SCALAR_FIELD(collation);
@@ -3046,6 +3090,7 @@ static SetToDefault* _copySetToDefault(const SetToDefault* from)
{
SetToDefault* newnode = makeNode(SetToDefault);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(typeId);
COPY_SCALAR_FIELD(typeMod);
COPY_SCALAR_FIELD(collation);
@@ -3061,6 +3106,7 @@ static CurrentOfExpr* _copyCurrentOfExpr(const CurrentOfExpr* from)
{
CurrentOfExpr* newnode = makeNode(CurrentOfExpr);
+ COPY_SCALAR_FIELD(xpr.selec);
COPY_SCALAR_FIELD(cvarno);
COPY_STRING_FIELD(cursor_name);
COPY_SCALAR_FIELD(cursor_param);
@@ -3154,6 +3200,7 @@ static PartitionState* _copyPartitionState(const PartitionState* from)
COPY_NODE_FIELD(partitionList);
COPY_SCALAR_FIELD(rowMovement);
COPY_NODE_FIELD(subPartitionState);
+ COPY_NODE_FIELD(partitionNameList);
return newnode;
}
@@ -3229,6 +3276,17 @@ static AddPartitionState* _copyAddPartitionState(const AddPartitionState* from)
return newnode;
}
+static AddSubPartitionState* _copyAddSubPartitionState(const AddSubPartitionState* from)
+{
+ AddSubPartitionState* newnode = makeNode(AddSubPartitionState);
+
+ COPY_STRING_FIELD(partitionName);
+ COPY_NODE_FIELD(subPartitionList);
+
+ return newnode;
+}
+
+
static RangePartitionStartEndDefState* _copyRangePartitionStartEndDefState(const RangePartitionStartEndDefState* from)
{
RangePartitionStartEndDefState* newnode = makeNode(RangePartitionStartEndDefState);
@@ -3262,6 +3320,7 @@ static RangePartitionindexDefState* _copyRangePartitionindexDefState(const Range
COPY_STRING_FIELD(name);
COPY_STRING_FIELD(tablespace);
+ COPY_NODE_FIELD(sublist);
return newnode;
}
@@ -3345,7 +3404,6 @@ static RestrictInfo* _copyRestrictInfo(const RestrictInfo* from)
COPY_SCALAR_FIELD(hashjoinoperator);
COPY_SCALAR_FIELD(left_bucketsize);
COPY_SCALAR_FIELD(right_bucketsize);
- COPY_SCALAR_FIELD(converted);
return newnode;
}
@@ -3508,6 +3566,7 @@ static RangeTblEntry* _copyRangeTblEntry(const RangeTblEntry* from)
COPY_SCALAR_FIELD(isexcluded);
COPY_SCALAR_FIELD(sublink_pull_up);
COPY_SCALAR_FIELD(is_ustore);
+ COPY_SCALAR_FIELD(pulled_from_subquery);
return newnode;
}
@@ -3587,6 +3646,9 @@ static RowMarkClause* _copyRowMarkClause(const RowMarkClause* from)
COPY_SCALAR_FIELD(rti);
COPY_SCALAR_FIELD(forUpdate);
COPY_SCALAR_FIELD(noWait);
+ if (t_thrd.proc->workingVersionNum >= WAIT_N_TUPLE_LOCK_VERSION_NUM) {
+ COPY_SCALAR_FIELD(waitSec);
+ }
COPY_SCALAR_FIELD(pushedDown);
if (t_thrd.proc->workingVersionNum >= ENHANCED_TUPLE_LOCK_VERSION_NUM) {
COPY_SCALAR_FIELD(strength);
@@ -3614,6 +3676,7 @@ static UpsertClause* _copyUpsertClause(const UpsertClause* from)
COPY_NODE_FIELD(targetList);
COPY_LOCATION_FIELD(location);
+ COPY_NODE_FIELD(whereClause);
return newnode;
}
@@ -3626,6 +3689,7 @@ static UpsertExpr* _copyUpsertExpr(const UpsertExpr* from)
COPY_NODE_FIELD(updateTlist);
COPY_NODE_FIELD(exclRelTlist);
COPY_SCALAR_FIELD(exclRelIndex);
+ COPY_NODE_FIELD(upsertWhere);
return newnode;
}
@@ -4110,6 +4174,9 @@ static LockingClause* _copyLockingClause(const LockingClause* from)
if (t_thrd.proc->workingVersionNum >= ENHANCED_TUPLE_LOCK_VERSION_NUM) {
COPY_SCALAR_FIELD(strength);
}
+ if (t_thrd.proc->workingVersionNum >= WAIT_N_TUPLE_LOCK_VERSION_NUM) {
+ COPY_SCALAR_FIELD(waitSec);
+ }
return newnode;
}
@@ -4191,6 +4258,24 @@ static PredpushHint* _copyPredpushHint(const PredpushHint* from)
return newnode;
}
+/*
+ * @Description: Copy hint filelds.
+ * @in from: Source hint.
+ * @out newnode: Target hint.
+ */
+static PredpushSameLevelHint* _copyPredpushSameLevelHint(const PredpushSameLevelHint* from)
+{
+ PredpushSameLevelHint* newnode = makeNode(PredpushSameLevelHint);
+
+ CopyBaseHintFilelds((const Hint*)from, (Hint*)newnode);
+ COPY_SCALAR_FIELD(negative);
+ COPY_STRING_FIELD(dest_name);
+ COPY_SCALAR_FIELD(dest_id);
+ COPY_BITMAPSET_FIELD(candidates);
+
+ return newnode;
+}
+
/*
* @Description: Copy hint filelds.
* @in from: Source hint.
@@ -4421,6 +4506,7 @@ static HintState* _copyHintState(const HintState* from)
COPY_NODE_FIELD(set_hint);
COPY_NODE_FIELD(cache_plan_hint);
COPY_NODE_FIELD(no_gpc_hint);
+ COPY_NODE_FIELD(predpush_same_level_hint);
return newnode;
}
@@ -4728,6 +4814,27 @@ static GrantRoleStmt* _copyGrantRoleStmt(const GrantRoleStmt* from)
return newnode;
}
+static DbPriv* _copyDbPriv(const DbPriv* from)
+{
+ DbPriv* newnode = makeNode(DbPriv);
+
+ COPY_STRING_FIELD(db_priv_name);
+
+ return newnode;
+}
+
+static GrantDbStmt* _copyGrantDbStmt(const GrantDbStmt* from)
+{
+ GrantDbStmt* newnode = makeNode(GrantDbStmt);
+
+ COPY_SCALAR_FIELD(is_grant);
+ COPY_NODE_FIELD(privileges);
+ COPY_NODE_FIELD(grantees);
+ COPY_SCALAR_FIELD(admin_opt);
+
+ return newnode;
+}
+
static AlterDefaultPrivilegesStmt* _copyAlterDefaultPrivilegesStmt(const AlterDefaultPrivilegesStmt* from)
{
AlterDefaultPrivilegesStmt* newnode = makeNode(AlterDefaultPrivilegesStmt);
@@ -5956,6 +6063,10 @@ static LockStmt* _copyLockStmt(const LockStmt* from)
COPY_NODE_FIELD(relations);
COPY_SCALAR_FIELD(mode);
COPY_SCALAR_FIELD(nowait);
+ COPY_SCALAR_FIELD(cancelable);
+ if (t_thrd.proc->workingVersionNum >= WAIT_N_TUPLE_LOCK_VERSION_NUM) {
+ COPY_SCALAR_FIELD(waitSec);
+ }
return newnode;
}
@@ -6212,6 +6323,16 @@ static DropSubscriptionStmt *_copyDropSubscriptionStmt(const DropSubscriptionStm
return newnode;
}
+static PredictByFunction *_copyPredictByFunctionStmt(const PredictByFunction *from)
+{
+ PredictByFunction* newnode = makeNode(PredictByFunction);
+ COPY_STRING_FIELD(model_name);
+ COPY_SCALAR_FIELD(model_name_location);
+ COPY_NODE_FIELD(model_args);
+ COPY_SCALAR_FIELD(model_args_location);
+ return newnode;
+}
+
/* ****************************************************************
* pg_list.h copy functions
* ****************************************************************
@@ -6407,6 +6528,24 @@ static DropResourcePoolStmt* _copyDropResourcePoolStmt(const DropResourcePoolStm
return newnode;
}
+static AlterGlobalConfigStmt* _copyAlterGlobalConfigStmt(const AlterGlobalConfigStmt* from)
+{
+ AlterGlobalConfigStmt* newnode = makeNode(AlterGlobalConfigStmt);
+
+ COPY_NODE_FIELD(options);
+
+ return newnode;
+}
+
+static DropGlobalConfigStmt* _copyDropGlobalConfigStmt(const DropGlobalConfigStmt* from)
+{
+ DropGlobalConfigStmt* newnode = makeNode(DropGlobalConfigStmt);
+
+ COPY_NODE_FIELD(options);
+
+ return newnode;
+}
+
static CreateWorkloadGroupStmt* _copyCreateWorkloadGroupStmt(const CreateWorkloadGroupStmt* from)
{
CreateWorkloadGroupStmt* newnode = makeNode(CreateWorkloadGroupStmt);
@@ -7065,6 +7204,9 @@ void* copyObject(const void* from)
case T_AddPartitionState:
retval = _copyAddPartitionState((AddPartitionState*)from);
break;
+ case T_AddSubPartitionState:
+ retval = _copyAddSubPartitionState((AddSubPartitionState*)from);
+ break;
case T_RangePartitionStartEndDefState:
retval = _copyRangePartitionStartEndDefState((RangePartitionStartEndDefState*)from);
break;
@@ -7165,6 +7307,9 @@ void* copyObject(const void* from)
case T_GrantRoleStmt:
retval = _copyGrantRoleStmt((GrantRoleStmt*)from);
break;
+ case T_GrantDbStmt:
+ retval = _copyGrantDbStmt((GrantDbStmt*)from);
+ break;
case T_AlterDefaultPrivilegesStmt:
retval = _copyAlterDefaultPrivilegesStmt((AlterDefaultPrivilegesStmt*)from);
break;
@@ -7501,6 +7646,12 @@ void* copyObject(const void* from)
case T_DropResourcePoolStmt:
retval = _copyDropResourcePoolStmt((DropResourcePoolStmt*)from);
break;
+ case T_AlterGlobalConfigStmt:
+ retval = _copyAlterGlobalConfigStmt((AlterGlobalConfigStmt*)from);
+ break;
+ case T_DropGlobalConfigStmt:
+ retval = _copyDropGlobalConfigStmt((DropGlobalConfigStmt*)from);
+ break;
case T_CreateWorkloadGroupStmt:
retval = _copyCreateWorkloadGroupStmt((CreateWorkloadGroupStmt*)from);
break;
@@ -7694,6 +7845,9 @@ void* copyObject(const void* from)
case T_AccessPriv:
retval = _copyAccessPriv((AccessPriv*)from);
break;
+ case T_DbPriv:
+ retval = _copyDbPriv((DbPriv*)from);
+ break;
case T_XmlSerialize:
retval = _copyXmlSerialize((XmlSerialize*)from);
break;
@@ -7801,6 +7955,9 @@ void* copyObject(const void* from)
case T_PredpushHint:
retval = _copyPredpushHint((PredpushHint*)from);
break;
+ case T_PredpushSameLevelHint:
+ retval = _copyPredpushSameLevelHint((PredpushSameLevelHint*)from);
+ break;
case T_RewriteHint:
retval = _copyRewriteHint((RewriteHint*)from);
break;
@@ -7840,6 +7997,9 @@ void* copyObject(const void* from)
case T_AlterSubscriptionStmt:
retval = _copyAlterSubscriptionStmt((AlterSubscriptionStmt *)from);
break;
+ case T_PredictByFunction:
+ retval = _copyPredictByFunctionStmt((PredictByFunction *)from);
+ break;
case T_DropSubscriptionStmt:
retval = _copyDropSubscriptionStmt((DropSubscriptionStmt *)from);
break;
diff --git a/src/common/backend/nodes/equalfuncs.cpp b/src/common/backend/nodes/equalfuncs.cpp
index c986b1a9f..ba789f587 100644
--- a/src/common/backend/nodes/equalfuncs.cpp
+++ b/src/common/backend/nodes/equalfuncs.cpp
@@ -710,6 +710,7 @@ static bool _equalUpsertExpr(const UpsertExpr* a, const UpsertExpr* b)
COMPARE_NODE_FIELD(updateTlist);
COMPARE_NODE_FIELD(exclRelTlist);
COMPARE_SCALAR_FIELD(exclRelIndex);
+ COMPARE_NODE_FIELD(upsertWhere);
return true;
}
@@ -1071,6 +1072,23 @@ static bool _equalGrantRoleStmt(const GrantRoleStmt* a, const GrantRoleStmt* b)
return true;
}
+static bool _equalDbPriv(const DbPriv* a, const DbPriv* b)
+{
+ COMPARE_STRING_FIELD(db_priv_name);
+
+ return true;
+}
+
+static bool _equalGrantDbStmt(const GrantDbStmt* a, const GrantDbStmt* b)
+{
+ COMPARE_SCALAR_FIELD(is_grant);
+ COMPARE_NODE_FIELD(privileges);
+ COMPARE_NODE_FIELD(grantees);
+ COMPARE_SCALAR_FIELD(admin_opt);
+
+ return true;
+}
+
static bool _equalAlterDefaultPrivilegesStmt(const AlterDefaultPrivilegesStmt* a, const AlterDefaultPrivilegesStmt* b)
{
COMPARE_NODE_FIELD(options);
@@ -1190,6 +1208,14 @@ static bool _equalAddPartitionState(const AddPartitionState* a, const AddPartiti
return true;
}
+static bool _equalAddSubPartitionState(const AddSubPartitionState* a, const AddSubPartitionState* b)
+{
+ COMPARE_STRING_FIELD(partitionName);
+ COMPARE_NODE_FIELD(subPartitionList);
+
+ return true;
+}
+
static bool _equalIntervalPartitionDefState(const IntervalPartitionDefState* a, const IntervalPartitionDefState* b)
{
COMPARE_SCALAR_FIELD(partInterval);
@@ -1203,6 +1229,7 @@ static bool _equalRangePartitionindexDefState(
{
COMPARE_STRING_FIELD(name);
COMPARE_STRING_FIELD(tablespace);
+ COMPARE_NODE_FIELD(sublist);
return true;
}
@@ -1214,6 +1241,8 @@ static bool _equalPartitionState(const PartitionState* a, const PartitionState*
COMPARE_NODE_FIELD(partitionKey);
COMPARE_NODE_FIELD(partitionList);
COMPARE_SCALAR_FIELD(rowMovement);
+ COMPARE_NODE_FIELD(subPartitionState);
+ COMPARE_NODE_FIELD(partitionNameList);
return true;
}
@@ -2130,6 +2159,9 @@ static bool _equalLockStmt(const LockStmt* a, const LockStmt* b)
COMPARE_NODE_FIELD(relations);
COMPARE_SCALAR_FIELD(mode);
COMPARE_SCALAR_FIELD(nowait);
+ if (t_thrd.proc->workingVersionNum >= WAIT_N_TUPLE_LOCK_VERSION_NUM) {
+ COMPARE_SCALAR_FIELD(waitSec);
+ }
return true;
}
@@ -2580,6 +2612,9 @@ static bool _equalLockingClause(const LockingClause* a, const LockingClause* b)
if (t_thrd.proc->workingVersionNum >= ENHANCED_TUPLE_LOCK_VERSION_NUM) {
COMPARE_SCALAR_FIELD(strength);
}
+ if (t_thrd.proc->workingVersionNum >= WAIT_N_TUPLE_LOCK_VERSION_NUM) {
+ COMPARE_SCALAR_FIELD(waitSec);
+ }
return true;
}
@@ -2644,6 +2679,7 @@ static bool _equalRangeTblEntry(const RangeTblEntry* a, const RangeTblEntry* b)
COMPARE_SCALAR_FIELD(isexcluded);
COMPARE_SCALAR_FIELD(sublink_pull_up);
COMPARE_SCALAR_FIELD(is_ustore);
+ COMPARE_SCALAR_FIELD(pulled_from_subquery);
return true;
}
@@ -2724,6 +2760,10 @@ static bool _equalRowMarkClause(const RowMarkClause* a, const RowMarkClause* b)
COMPARE_SCALAR_FIELD(rti);
COMPARE_SCALAR_FIELD(forUpdate);
COMPARE_SCALAR_FIELD(noWait);
+ if (t_thrd.proc->workingVersionNum >= WAIT_N_TUPLE_LOCK_VERSION_NUM) {
+ COMPARE_SCALAR_FIELD(waitSec);
+ }
+
COMPARE_SCALAR_FIELD(pushedDown);
if (t_thrd.proc->workingVersionNum >= ENHANCED_TUPLE_LOCK_VERSION_NUM) {
COMPARE_SCALAR_FIELD(strength);
@@ -2759,6 +2799,7 @@ static bool _equalUpsertClause(const UpsertClause* a, const UpsertClause* b)
{
COMPARE_NODE_FIELD(targetList);
COMPARE_LOCATION_FIELD(location);
+ COMPARE_NODE_FIELD(whereClause);
return true;
}
@@ -3435,6 +3476,9 @@ bool equal(const void* a, const void* b)
case T_GrantRoleStmt:
retval = _equalGrantRoleStmt((GrantRoleStmt*)a, (GrantRoleStmt*)b);
break;
+ case T_GrantDbStmt:
+ retval = _equalGrantDbStmt((GrantDbStmt*)a, (GrantDbStmt*)b);
+ break;
case T_AlterDefaultPrivilegesStmt:
retval = _equalAlterDefaultPrivilegesStmt((AlterDefaultPrivilegesStmt*)a, (AlterDefaultPrivilegesStmt*)b);
break;
@@ -3479,6 +3523,9 @@ bool equal(const void* a, const void* b)
case T_AddPartitionState:
retval = _equalAddPartitionState((AddPartitionState*)a, (AddPartitionState*)b);
break;
+ case T_AddSubPartitionState:
+ retval = _equalAddSubPartitionState((AddSubPartitionState*)a, (AddSubPartitionState*)b);
+ break;
case T_SplitInfo:
retval = _equalSplitInfo((SplitInfo*)a, (SplitInfo*)b);
break;
@@ -3992,6 +4039,9 @@ bool equal(const void* a, const void* b)
case T_AccessPriv:
retval = _equalAccessPriv((AccessPriv*)a, (AccessPriv*)b);
break;
+ case T_DbPriv:
+ retval = _equalDbPriv((DbPriv*)a, (DbPriv*)b);
+ break;
case T_XmlSerialize:
retval = _equalXmlSerialize((XmlSerialize*)a, (XmlSerialize*)b);
break;
diff --git a/src/common/backend/nodes/nodeFuncs.cpp b/src/common/backend/nodes/nodeFuncs.cpp
index 768615a07..0ee58ebb9 100644
--- a/src/common/backend/nodes/nodeFuncs.cpp
+++ b/src/common/backend/nodes/nodeFuncs.cpp
@@ -49,6 +49,19 @@ Oid exprType(const Node* expr)
}
switch (nodeTag(expr)) {
+ case T_BoolExpr:
+ case T_BooleanTest:
+ case T_CurrentOfExpr:
+ case T_HashFilter:
+ case T_NullTest:
+ case T_ScalarArrayOpExpr:
+ case T_RowCompareExpr:
+ type = BOOLOID;
+ break;
+ case T_GroupingFunc:
+ case T_GroupingId:
+ type = INT4OID;
+ break;
case T_Var:
type = ((const Var*)expr)->vartype;
break;
@@ -61,9 +74,6 @@ Oid exprType(const Node* expr)
case T_Aggref:
type = ((const Aggref*)expr)->aggtype;
break;
- case T_GroupingFunc:
- type = INT4OID;
- break;
case T_WindowFunc:
type = ((const WindowFunc*)expr)->wintype;
break;
@@ -92,12 +102,6 @@ Oid exprType(const Node* expr)
case T_NullIfExpr:
type = ((const NullIfExpr*)expr)->opresulttype;
break;
- case T_ScalarArrayOpExpr:
- type = BOOLOID;
- break;
- case T_BoolExpr:
- type = BOOLOID;
- break;
case T_SubLink: {
const SubLink* sublink = (const SubLink*)expr;
@@ -187,9 +191,6 @@ Oid exprType(const Node* expr)
case T_RowExpr:
type = ((const RowExpr*)expr)->row_typeid;
break;
- case T_RowCompareExpr:
- type = BOOLOID;
- break;
case T_CoalesceExpr:
type = ((const CoalesceExpr*)expr)->coalescetype;
break;
@@ -205,13 +206,6 @@ Oid exprType(const Node* expr)
type = XMLOID;
}
break;
- case T_NullTest:
- case T_HashFilter:
- type = BOOLOID;
- break;
- case T_BooleanTest:
- type = BOOLOID;
- break;
case T_CoerceToDomain:
type = ((const CoerceToDomain*)expr)->resulttype;
break;
@@ -221,20 +215,15 @@ Oid exprType(const Node* expr)
case T_SetToDefault:
type = ((const SetToDefault*)expr)->typeId;
break;
- case T_CurrentOfExpr:
- type = BOOLOID;
- break;
case T_PlaceHolderVar:
type = exprType((Node*)((const PlaceHolderVar*)expr)->phexpr);
break;
- case T_GroupingId:
- type = INT4OID;
- break;
case T_Rownum:
- type = NUMERICOID;
- break;
- case T_GradientDescentExpr:
- type = ((const GradientDescentExpr*)expr)->fieldtype;
+ if (ROWNUM_TYPE_COMPAT) {
+ type = NUMERICOID;
+ } else {
+ type = INT8OID;
+ }
break;
default:
ereport(ERROR,
@@ -849,9 +838,6 @@ Oid exprCollation(const Node* expr)
case T_PlaceHolderVar:
coll = exprCollation((Node*)((const PlaceHolderVar*)expr)->phexpr);
break;
- case T_GradientDescentExpr:
- coll = InvalidOid;
- break;
default:
ereport(
ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("unrecognized node type: %d", (int)nodeTag(expr))));
@@ -1564,7 +1550,6 @@ bool expression_tree_walker(Node* node, bool (*walker)(), void* context)
case T_Null:
case T_PgFdwRemoteInfo:
case T_Rownum:
- case T_GradientDescentExpr:
/* primitive node types with no expression subnodes */
break;
case T_Aggref: {
@@ -1809,6 +1794,8 @@ bool expression_tree_walker(Node* node, bool (*walker)(), void* context)
UpsertExpr* upsertClause = (UpsertExpr*)node;
if (p2walker(upsertClause->updateTlist, context))
return true;
+ if (p2walker(upsertClause->upsertWhere, context))
+ return true;
} break;
case T_JoinExpr: {
JoinExpr* join = (JoinExpr*)node;
@@ -2515,6 +2502,7 @@ Node* expression_tree_mutator(Node* node, Node* (*mutator)(Node*, void*), void*
FLATCOPY(newnode, upsertClause, UpsertExpr, isCopy);
MUTATE(newnode->updateTlist, upsertClause->updateTlist, List*);
+ MUTATE(newnode->upsertWhere, upsertClause->upsertWhere, Node*);
return (Node*)newnode;
} break;
case T_FromExpr: {
diff --git a/src/common/backend/nodes/nodes.cpp b/src/common/backend/nodes/nodes.cpp
index e35aa7bf2..6417ad7de 100755
--- a/src/common/backend/nodes/nodes.cpp
+++ b/src/common/backend/nodes/nodes.cpp
@@ -89,6 +89,8 @@ static const TagStr g_tagStrArr[] = {{T_Invalid, "Invalid"},
{T_CreateResourcePoolStmt, "CreateResourcePoolStmt"},
{T_AlterResourcePoolStmt, "AlterResourcePoolStmt"},
{T_DropResourcePoolStmt, "DropResourcePoolStmt"},
+ {T_AlterGlobalConfigStmt, "AlterGlobalConfigStmt"},
+ {T_DropGlobalConfigStmt, "DropGlobalConfigStmt"},
{T_CreateWorkloadGroupStmt, "CreateWorkloadGroupStmt"},
{T_AlterWorkloadGroupStmt, "AlterWorkloadGroupStmt"},
{T_DropWorkloadGroupStmt, "DropWorkloadGroupStmt"},
@@ -231,6 +233,7 @@ static const TagStr g_tagStrArr[] = {{T_Invalid, "Invalid"},
{T_RangePartitionindexDefState, "RangePartitionindexDefState"},
{T_SplitPartitionState, "SplitPartitionState"},
{T_AddPartitionState, "AddPartitionState"},
+ {T_AddSubPartitionState, "AddSubPartitionState"},
{T_RangePartitionStartEndDefState, "RangePartitionStartEndDefState"},
{T_PlannerInfo, "PlannerInfo"},
{T_PlannerGlobal, "PlannerGlobal"},
@@ -299,6 +302,7 @@ static const TagStr g_tagStrArr[] = {{T_Invalid, "Invalid"},
{T_SetOperationStmt, "SetOperationStmt"},
{T_GrantStmt, "GrantStmt"},
{T_GrantRoleStmt, "GrantRoleStmt"},
+ {T_GrantDbStmt, "GrantDbStmt"},
{T_AlterDefaultPrivilegesStmt, "AlterDefaultPrivilegesStmt"},
{T_ClosePortalStmt, "ClosePortalStmt"},
{T_ClusterStmt, "ClusterStmt"},
@@ -439,6 +443,7 @@ static const TagStr g_tagStrArr[] = {{T_Invalid, "Invalid"},
{T_PrivGrantee, "PrivGrantee"},
{T_FuncWithArgs, "FuncWithArgs"},
{T_AccessPriv, "AccessPriv"},
+ {T_DbPriv, "DbPriv"},
{T_CreateOpClassItem, "CreateOpClassItem"},
{T_TableLikeClause, "TableLikeClause"},
{T_FunctionParameter, "FunctionParameter"},
@@ -584,12 +589,9 @@ static const TagStr g_tagStrArr[] = {{T_Invalid, "Invalid"},
// DB4AI
{T_CreateModelStmt, "CreateModelStmt"},
{T_PredictByFunction, "PredictByFunction"},
- {T_GradientDescent, "GradientDescent"},
- {T_GradientDescentState, "GradientDescentState"},
- {T_KMeans, "Kmeans"},
- {T_KMeansState, "KmeansState"},
- {T_GradientDescentExpr, "GradientDescentExpr"},
- {T_GradientDescentExprState, "GradientDescentExprState"},
+ {T_TrainModel, "TrainModel"},
+ {T_TrainModelState, "TrainModelState"},
+ {T_ExplainModelStmt, "ExplainModelStmt"},
// End DB4AI
{T_TdigestData, "TdigestData"},
{T_CentroidPoint, "CentroidPoint"}
diff --git a/src/common/backend/nodes/outfuncs.cpp b/src/common/backend/nodes/outfuncs.cpp
index 70dda9cca..1bd1ccb61 100755
--- a/src/common/backend/nodes/outfuncs.cpp
+++ b/src/common/backend/nodes/outfuncs.cpp
@@ -709,6 +709,9 @@ static void _outScanInfo(StringInfo str, Scan* node)
WRITE_NODE_FIELD(tablesample);
out_mem_info(str, &node->mem_info);
+ if (t_thrd.proc->workingVersionNum >= SCAN_BATCH_MODE_VERSION_NUM) {
+ WRITE_BOOL_FIELD(scanBatchMode);
+ }
}
/*
@@ -776,11 +779,15 @@ static void _outModifyTable(StringInfo str, ModifyTable* node)
WRITE_NODE_FIELD(exclRelTlist);
WRITE_INT_FIELD(exclRelRTIndex);
}
+ if (t_thrd.proc->workingVersionNum >= UPSERT_WHERE_VERSION_NUM) {
+ WRITE_NODE_FIELD(upsertWhere);
+ }
#else
WRITE_ENUM_FIELD(upsertAction, UpsertAction);
WRITE_NODE_FIELD(updateTlist);
WRITE_NODE_FIELD(exclRelTlist);
WRITE_INT_FIELD(exclRelRTIndex);
+ WRITE_NODE_FIELD(upsertWhere);
#endif
}
@@ -790,6 +797,9 @@ static void _outUpsertClause(StringInfo str, const UpsertClause* node)
WRITE_NODE_FIELD(targetList);
WRITE_INT_FIELD(location);
+ if (t_thrd.proc->workingVersionNum >= UPSERT_WHERE_VERSION_NUM) {
+ WRITE_NODE_FIELD(whereClause);
+ }
}
static void _outUpsertExpr(StringInfo str, const UpsertExpr* node)
@@ -800,6 +810,7 @@ static void _outUpsertExpr(StringInfo str, const UpsertExpr* node)
WRITE_NODE_FIELD(updateTlist);
WRITE_NODE_FIELD(exclRelTlist);
WRITE_INT_FIELD(exclRelIndex);
+ WRITE_NODE_FIELD(upsertWhere);
}
static void _outMergeWhenClause(StringInfo str, const MergeWhenClause* node)
{
@@ -936,7 +947,7 @@ static void _outBitmapAnd(StringInfo str, BitmapAnd* node)
_outPlanInfo(str, (Plan*)node);
WRITE_NODE_FIELD(bitmapplans);
- if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) {
+ if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) {
WRITE_BOOL_FIELD(is_ustore);
}
}
@@ -948,7 +959,7 @@ static void _outBitmapOr(StringInfo str, BitmapOr* node)
_outPlanInfo(str, (Plan*)node);
WRITE_NODE_FIELD(bitmapplans);
- if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) {
+ if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) {
WRITE_BOOL_FIELD(is_ustore);
}
}
@@ -1015,7 +1026,7 @@ static void _outIndexScan(StringInfo str, IndexScan* node)
{
WRITE_NODE_TYPE("INDEXSCAN");
_outCommonIndexScanPart(str, node);
- if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) {
+ if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) {
WRITE_BOOL_FIELD(is_ustore);
}
}
@@ -1305,7 +1316,7 @@ static void _outBitmapIndexScan(StringInfo str, BitmapIndexScan* node)
_outToken(str, get_namespace_name(get_rel_namespace(node->indexid)));
}
#endif // STREAMPLAN
- if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) {
+ if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) {
WRITE_BOOL_FIELD(is_ustore);
}
}
@@ -1969,6 +1980,9 @@ static void _outPlanRowMark(StringInfo str, PlanRowMark* node)
WRITE_UINT_FIELD(rowmarkId);
WRITE_ENUM_FIELD(markType, RowMarkType);
WRITE_BOOL_FIELD(noWait);
+ if (t_thrd.proc->workingVersionNum >= WAIT_N_TUPLE_LOCK_VERSION_NUM) {
+ WRITE_INT_FIELD(waitSec);
+ }
WRITE_BOOL_FIELD(isParent);
WRITE_INT_FIELD(numAttrs);
WRITE_BITMAPSET_FIELD(bms_nodeids);
@@ -2921,7 +2935,7 @@ static void _outIndexPath(StringInfo str, IndexPath* node)
WRITE_ENUM_FIELD(indexscandir, ScanDirection);
WRITE_FLOAT_FIELD(indextotalcost, "%.2f");
WRITE_FLOAT_FIELD(indexselectivity, "%.4f");
- if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) {
+ if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) {
WRITE_BOOL_FIELD(is_ustore);
}
}
@@ -2943,7 +2957,7 @@ static void _outBitmapAndPath(StringInfo str, BitmapAndPath* node)
WRITE_NODE_FIELD(bitmapquals);
WRITE_FLOAT_FIELD(bitmapselectivity, "%.4f");
- if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) {
+ if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) {
WRITE_BOOL_FIELD(is_ustore);
}
}
@@ -2956,7 +2970,7 @@ static void _outBitmapOrPath(StringInfo str, BitmapOrPath* node)
WRITE_NODE_FIELD(bitmapquals);
WRITE_FLOAT_FIELD(bitmapselectivity, "%.4f");
- if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) {
+ if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) {
WRITE_BOOL_FIELD(is_ustore);
}
}
@@ -3507,6 +3521,8 @@ static void _outPartitionState(StringInfo str, PartitionState* node)
WRITE_NODE_FIELD(partitionKey);
WRITE_NODE_FIELD(partitionList);
WRITE_ENUM_FIELD(rowMovement, RowMovementValue);
+ WRITE_NODE_FIELD(subPartitionState);
+ WRITE_NODE_FIELD(partitionNameList);
}
static void _outRangePartitionindexDefState(StringInfo str, RangePartitionindexDefState* node)
@@ -3515,6 +3531,7 @@ static void _outRangePartitionindexDefState(StringInfo str, RangePartitionindexD
WRITE_STRING_FIELD(name);
WRITE_STRING_FIELD(tablespace);
+ WRITE_NODE_FIELD(sublist);
}
static void _outRangePartitionStartEndDefState(StringInfo str, RangePartitionStartEndDefState* node)
@@ -3536,6 +3553,15 @@ static void _outAddPartitionState(StringInfo str, AddPartitionState* node)
WRITE_BOOL_FIELD(isStartEnd);
}
+static void _outAddSubPartitionState(StringInfo str, const AddSubPartitionState* node)
+{
+ WRITE_NODE_TYPE("ADDSUBPARTITIONSTATE");
+
+ WRITE_STRING_FIELD(partitionName);
+ WRITE_NODE_FIELD(subPartitionList);
+}
+
+
static void _outCreateStmt(StringInfo str, const CreateStmt* node)
{
WRITE_NODE_TYPE("CREATESTMT");
@@ -3724,6 +3750,9 @@ static void _outLockingClause(StringInfo str, LockingClause* node)
if (t_thrd.proc->workingVersionNum >= ENHANCED_TUPLE_LOCK_VERSION_NUM) {
WRITE_ENUM_FIELD(strength, LockClauseStrength);
}
+ if (t_thrd.proc->workingVersionNum >= WAIT_N_TUPLE_LOCK_VERSION_NUM) {
+ WRITE_BOOL_FIELD(waitSec);
+ }
}
static void _outXmlSerialize(StringInfo str, XmlSerialize* node)
@@ -3995,6 +4024,21 @@ static void _outPredpushHint(StringInfo str, PredpushHint* node)
WRITE_BITMAPSET_FIELD(candidates);
}
+/*
+ * @Description: Predpush same level hint node to string.
+ * @out str: String buf.
+ * @in node: Predpush same level hint struct.
+ */
+static void _outPredpushSameLevelHint(StringInfo str, PredpushSameLevelHint* node)
+{
+ WRITE_NODE_TYPE("PREDPUSHSAMELEVELHINT");
+ _outBaseHint(str, (Hint*)node);
+ WRITE_BOOL_FIELD(negative);
+ WRITE_STRING_FIELD(dest_name);
+ WRITE_INT_FIELD(dest_id);
+ WRITE_BITMAPSET_FIELD(candidates);
+}
+
/*
* @Description: Rewrite hint node to string.
* @out str: String buf.
@@ -4207,14 +4251,19 @@ static void _outHintState(StringInfo str, HintState* node)
if (t_thrd.proc->workingVersionNum >= PREDPUSH_VERSION_NUM) {
WRITE_NODE_FIELD(predpush_hint);
}
- WRITE_NODE_FIELD(rewrite_hint);
- WRITE_NODE_FIELD(gather_hint);
+ if (t_thrd.proc->workingVersionNum >= EXECUTE_DIRECT_ON_MULTI_VERSION_NUM) {
+ WRITE_NODE_FIELD(rewrite_hint);
+ }
if (t_thrd.proc->workingVersionNum >= HINT_ENHANCEMENT_VERSION_NUM) {
+ WRITE_NODE_FIELD(gather_hint);
WRITE_NODE_FIELD(no_expand_hint);
WRITE_NODE_FIELD(set_hint);
WRITE_NODE_FIELD(cache_plan_hint);
WRITE_NODE_FIELD(no_gpc_hint);
}
+ if (t_thrd.proc->workingVersionNum >= PREDPUSH_SAME_LEVEL_VERSION_NUM) {
+ WRITE_NODE_FIELD(predpush_same_level_hint);
+ }
}
static void _outQuery(StringInfo str, Query* node)
@@ -4366,6 +4415,9 @@ static void _outRowMarkClause(StringInfo str, RowMarkClause* node)
WRITE_UINT_FIELD(rti);
WRITE_BOOL_FIELD(forUpdate);
WRITE_BOOL_FIELD(noWait);
+ if (t_thrd.proc->workingVersionNum >= WAIT_N_TUPLE_LOCK_VERSION_NUM) {
+ WRITE_INT_FIELD(waitSec);
+ }
WRITE_BOOL_FIELD(pushedDown);
if (t_thrd.proc->workingVersionNum >= ENHANCED_TUPLE_LOCK_VERSION_NUM) {
WRITE_ENUM_FIELD(strength, LockClauseStrength);
@@ -4618,7 +4670,7 @@ static void _outRangeTblEntry(StringInfo str, RangeTblEntry* node)
WRITE_BOOL_FIELD(sublink_pull_up);
}
- if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_WERSION_NUM) {
+ if (t_thrd.proc->workingVersionNum >= INPLACE_UPDATE_VERSION_NUM) {
WRITE_BOOL_FIELD(is_ustore);
}
@@ -5504,31 +5556,58 @@ static void _outIndexVar(StringInfo str, IndexVar* node)
WRITE_BOOL_FIELD(indexpath);
}
-static void _outGradientDescent(StringInfo str, GradientDescent* node)
+static void _outTrainModel(StringInfo str, TrainModel* node)
{
- WRITE_NODE_TYPE("SGD");
+ AlgorithmAPI *api = get_algorithm_api(node->algorithm);
+ int num_hyperp;
+ const HyperparameterDefinition* definition = api->get_hyperparameters_definitions(api, &num_hyperp);
+
+ if (node->configurations != 1)
+ elog(ERROR, "TODO_DB4AI_API: more than one hyperparameter configuration");
+
+ WRITE_NODE_TYPE("TrainModel");
_outPlanInfo(str, (Plan*)node);
appendStringInfoString(str, " :algorithm ");
- appendStringInfoString(str, gd_get_algorithm(node->algorithm)->name);
- appendStringInfoString(str, " :optimizer ");
- appendStringInfoString(str, gd_get_optimizer_name(node->optimizer));
- WRITE_INT_FIELD(targetcol);
- WRITE_INT_FIELD(max_iterations);
- WRITE_INT_FIELD(max_seconds);
- WRITE_INT_FIELD(batch_size);
- WRITE_BOOL_FIELD(verbose);
- WRITE_FLOAT_FIELD(learning_rate, "%.16g");
- WRITE_FLOAT_FIELD(decay, "%.16g");
- WRITE_FLOAT_FIELD(tolerance, "%.16g");
- WRITE_INT_FIELD(seed);
- WRITE_FLOAT_FIELD(lambda, "%.16g");
-}
+ appendStringInfoString(str, api->name);
-static void _outGradientDescentExpr(StringInfo str, GradientDescentExpr* node)
-{
- WRITE_NODE_TYPE("GradientDescentExpr");
- WRITE_UINT_FIELD(field);
- WRITE_OID_FIELD(fieldtype);
+ HyperparametersGD *hyperp = (HyperparametersGD *)node->hyperparameters[0];
+ while (num_hyperp-- > 0) {
+ switch (definition->type) {
+ case INT4OID: {
+ int32_t *value_addr = (int32_t *)((char *)hyperp + definition->offset);
+ appendStringInfo(str, " : %s %d", definition->name, *value_addr);
+ break;
+ }
+ case INT8OID: {
+ int64_t *value_addr = (int64_t *)((char *)hyperp + definition->offset);
+ appendStringInfo(str, " : %s %ld", definition->name, *value_addr);
+ break;
+ }
+ case FLOAT8OID: {
+ double *value_addr = (double *)((char *)hyperp + definition->offset);
+ appendStringInfo(str, " : %s %.16g", definition->name, *value_addr);
+ break;
+ }
+ case BOOLOID: {
+ bool *value_addr = (bool *)((char *)hyperp + definition->offset);
+ appendStringInfo(str, " : %s %s", definition->name, booltostr(*value_addr));
+ break;
+ }
+ case CSTRINGOID: {
+ char **value_addr = (char **)((char *)hyperp + definition->offset);
+ appendStringInfo(str, " : %s %s", definition->name, *value_addr);
+ break;
+ }
+ case ANYENUMOID: {
+ void *value_addr = (void *)((char *)hyperp + definition->offset);
+ appendStringInfo(str, " : %s %s", definition->name, definition->validation.enum_getter(value_addr));
+ break;
+ }
+ default:
+ break;
+ }
+ definition++;
+ }
}
/*
@@ -6006,6 +6085,9 @@ static void _outNode(StringInfo str, const void* obj)
case T_AddPartitionState:
_outAddPartitionState(str, (AddPartitionState*)obj);
break;
+ case T_AddSubPartitionState:
+ _outAddSubPartitionState(str, (AddSubPartitionState*)obj);
+ break;
case T_CreateForeignTableStmt:
_outCreateForeignTableStmt(str, (CreateForeignTableStmt*)obj);
break;
@@ -6375,6 +6457,9 @@ static void _outNode(StringInfo str, const void* obj)
case T_PredpushHint:
_outPredpushHint(str, (PredpushHint *)obj);
break;
+ case T_PredpushSameLevelHint:
+ _outPredpushSameLevelHint(str, (PredpushSameLevelHint *)obj);
+ break;
case T_RewriteHint:
_outRewriteHint(str, (RewriteHint *)obj);
break;
@@ -6392,11 +6477,9 @@ static void _outNode(StringInfo str, const void* obj)
break;
case T_NoGPCHint:
_outNoGPCHint(str, (NoGPCHint*) obj);
- case T_GradientDescent:
- _outGradientDescent(str, (GradientDescent*)obj);
+ case T_TrainModel:
+ _outTrainModel(str, (TrainModel*)obj);
break;
- case T_GradientDescentExpr:
- _outGradientDescentExpr(str, (GradientDescentExpr*)obj);
case T_PLDebug_variable:
_outPLDebug_variable(str, (PLDebug_variable*) obj);
break;
diff --git a/src/common/backend/nodes/params.cpp b/src/common/backend/nodes/params.cpp
index fdfb6e7f9..94ce9aa80 100644
--- a/src/common/backend/nodes/params.cpp
+++ b/src/common/backend/nodes/params.cpp
@@ -70,9 +70,14 @@ ParamListInfo copyParamList(ParamListInfo from)
}
get_typlenbyval(nprm->ptype, &typLen, &typByVal);
nprm->value = datumCopy(nprm->value, typByVal, typLen);
- nprm->tableOfIndexType = oprm->tableOfIndexType;
- nprm->tableOfIndex = copyTableOfIndex(oprm->tableOfIndex);
- nprm->isnestedtable = oprm->isnestedtable;
+ nprm->tabInfo = NULL;
+ if (oprm->tabInfo != NULL) {
+ nprm->tabInfo = (TableOfInfo*)palloc0(sizeof(TableOfInfo));
+ nprm->tabInfo->tableOfIndexType = oprm->tabInfo->tableOfIndexType;
+ nprm->tabInfo->tableOfIndex = copyTableOfIndex(oprm->tabInfo->tableOfIndex);
+ nprm->tabInfo->isnestedtable = oprm->tabInfo->isnestedtable;
+ nprm->tabInfo->tableOfLayers = oprm->tabInfo->tableOfLayers;
+ }
}
return retval;
diff --git a/src/common/backend/nodes/readfuncs.cpp b/src/common/backend/nodes/readfuncs.cpp
index 3e067765b..01d04dad2 100755
--- a/src/common/backend/nodes/readfuncs.cpp
+++ b/src/common/backend/nodes/readfuncs.cpp
@@ -1050,8 +1050,8 @@ static JoinMethodHint* _readJoinHint(void)
}
/*
- * @Description: Read string to join hint struct.
- * @return: Join hint struct.
+ * @Description: Read string to predpush hint struct.
+ * @return: Predpush hint struct.
*/
static PredpushHint* _readPredpushHint(void)
{
@@ -1066,6 +1066,23 @@ static PredpushHint* _readPredpushHint(void)
READ_DONE();
}
+/*
+ * @Description: Read string to predpush same level hint struct.
+ * @return: Predpush same level hint struct.
+ */
+static PredpushSameLevelHint* _readPredpushSameLevelHint(void)
+{
+ READ_LOCALS(PredpushSameLevelHint);
+
+ _readBaseHint(&(local_node->base));
+ READ_BOOL_FIELD(negative);
+ READ_STRING_FIELD(dest_name);
+ READ_INT_FIELD(dest_id);
+ READ_BITMAPSET_FIELD(candidates);
+
+ READ_DONE();
+}
+
/*
* @Description: Read string to rewrite hint struct.
* @return: rewrite hint struct.
@@ -1329,8 +1346,12 @@ static HintState* _readHintState()
IF_EXIST(predpush_hint) {
READ_NODE_FIELD(predpush_hint);
}
- READ_NODE_FIELD(rewrite_hint);
- READ_NODE_FIELD(gather_hint);
+ IF_EXIST(rewrite_hint) {
+ READ_NODE_FIELD(rewrite_hint);
+ }
+ IF_EXIST(gather_hint) {
+ READ_NODE_FIELD(gather_hint);
+ }
IF_EXIST(no_expand_hint) {
READ_NODE_FIELD(no_expand_hint);
}
@@ -1343,6 +1364,9 @@ static HintState* _readHintState()
IF_EXIST(no_gpc_hint) {
READ_NODE_FIELD(no_gpc_hint);
}
+ IF_EXIST(predpush_same_level_hint) {
+ READ_NODE_FIELD(predpush_same_level_hint);
+ }
READ_DONE();
}
@@ -1611,6 +1635,10 @@ static RowMarkClause* _readRowMarkClause(void)
READ_UINT_FIELD(rti);
READ_BOOL_FIELD(forUpdate);
READ_BOOL_FIELD(noWait);
+ IF_EXIST(waitSec) {
+ READ_INT_FIELD(waitSec);
+ }
+
READ_BOOL_FIELD(pushedDown);
IF_EXIST(strength) {
READ_ENUM_FIELD(strength, LockClauseStrength);
@@ -3339,6 +3367,9 @@ static Scan* _readScan(Scan* local_node)
READ_NODE_FIELD(tablesample);
}
read_mem_info(&local_node->mem_info);
+ IF_EXIST(scanBatchMode) {
+ READ_BOOL_FIELD(scanBatchMode);
+ }
READ_DONE();
}
@@ -3945,6 +3976,10 @@ static ModifyTable* _readModifyTable(ModifyTable* local_node)
READ_INT_FIELD(exclRelRTIndex);
}
+ IF_EXIST(upsertWhere) {
+ READ_NODE_FIELD(upsertWhere);
+ }
+
READ_DONE();
}
@@ -3956,6 +3991,9 @@ static UpsertExpr* _readUpsertExpr(void)
READ_NODE_FIELD(updateTlist);
READ_NODE_FIELD(exclRelTlist);
READ_INT_FIELD(exclRelIndex);
+ IF_EXIST(upsertWhere) {
+ READ_NODE_FIELD(upsertWhere);
+ }
READ_DONE();
}
@@ -3966,7 +4004,9 @@ static UpsertClause* _readUpsertClause(void)
READ_NODE_FIELD(targetList);
READ_INT_FIELD(location);
-
+ IF_EXIST(whereClause) {
+ READ_NODE_FIELD(whereClause);
+ }
READ_DONE();
}
@@ -4282,6 +4322,10 @@ static PlanRowMark* _readPlanRowMark(void)
READ_UINT_FIELD(rowmarkId);
READ_ENUM_FIELD(markType, RowMarkType);
READ_BOOL_FIELD(noWait);
+ IF_EXIST(waitSec) {
+ READ_INT_FIELD(waitSec);
+ }
+
READ_BOOL_FIELD(isParent);
READ_INT_FIELD(numAttrs);
READ_BITMAPSET_FIELD(bms_nodeids);
@@ -5522,6 +5566,8 @@ static PartitionState* _readPartitionState()
READ_NODE_FIELD(partitionKey);
READ_NODE_FIELD(partitionList);
READ_ENUM_FIELD(rowMovement, RowMovementValue);
+ READ_NODE_FIELD(subPartitionState);
+ READ_NODE_FIELD(partitionNameList);
if (local_node->partitionStrategy == '0') {
local_node->partitionStrategy = 0;
@@ -5541,6 +5587,7 @@ static RangePartitionindexDefState* _readRangePartitionindexDefState()
READ_STRING_FIELD(name);
READ_STRING_FIELD(tablespace);
+ READ_NODE_FIELD(sublist);
READ_DONE();
}
@@ -5601,6 +5648,16 @@ static AddPartitionState* _readAddPartitionState()
READ_DONE();
}
+static AddSubPartitionState* _readAddSubPartitionState()
+{
+ READ_LOCALS(AddSubPartitionState);
+
+ READ_NODE_FIELD(subPartitionList);
+ READ_STRING_FIELD(partitionName);
+
+ READ_DONE();
+}
+
static QualSkewInfo* _readQualSkewInfo()
{
READ_LOCALS_NO_FIELDS(QualSkewInfo);
@@ -6056,6 +6113,8 @@ Node* parseNodeString(void)
return_value = _readSplitPartitionState();
} else if (MATCH("ADDPARTITIONSTATE", 17)) {
return_value = _readAddPartitionState();
+ } else if (MATCH("ADDSUBPARTITIONSTATE", 20)) {
+ return_value = _readAddSubPartitionState();
} else if (MATCH("CLIENTLOGICCOLUMNREF", 20)) {
return_value = _readClientLogicColumnRef();
} else if (MATCH("GLOBALPARAM", 11)) {
@@ -6072,6 +6131,8 @@ Node* parseNodeString(void)
return_value = _readUpsertClause();
} else if (MATCH("PREDPUSHHINT", 12)) {
return_value = _readPredpushHint();
+ } else if (MATCH("PREDPUSHSAMELEVELHINT", 21)) {
+ return_value = _readPredpushSameLevelHint();
} else if (MATCH("REWRITEHINT", 11)) {
return_value = _readRewriteHint();
} else if (MATCH("GATHERHINT", 10)) {
diff --git a/src/common/backend/parser/analyze.cpp b/src/common/backend/parser/analyze.cpp
index 5d6412058..4c9bf3b49 100644
--- a/src/common/backend/parser/analyze.cpp
+++ b/src/common/backend/parser/analyze.cpp
@@ -75,6 +75,7 @@
#include "catalog/pgxc_node.h"
#include "access/xact.h"
#include "utils/distribute_test.h"
+#include "tcop/utility.h"
#endif
#include "utils/rel.h"
#include "utils/rel_gs.h"
@@ -87,12 +88,14 @@
#include "db4ai/aifuncs.h"
#include "db4ai/create_model.h"
+#include "db4ai/hyperparameter_validation.h"
#ifndef ENABLE_MULTIPLE_NODES
#include "optimizer/clauses.h"
#endif
/* Hook for plugins to get control at end of parse analysis */
THR_LOCAL post_parse_analyze_hook_type post_parse_analyze_hook = NULL;
+static const int MILLISECONDS_PER_SECONDS = 1000;
static Query* transformDeleteStmt(ParseState* pstate, DeleteStmt* stmt);
static Query* transformInsertStmt(ParseState* pstate, InsertStmt* stmt);
@@ -127,6 +130,16 @@ static void set_ancestor_ps_contain_foreigntbl(ParseState* subParseState);
static bool include_groupingset(Node* groupClause);
static void transformGroupConstToColumn(ParseState* pstate, Node* groupClause, List* targetList);
static bool checkAllowedTableCombination(ParseState* pstate);
+#ifdef ENABLE_MULTIPLE_NODES
+static bool ContainSubLinkWalker(Node* node, void* context);
+static bool ContainSubLink(Node* clause);
+#endif /* ENABLE_MULTIPLE_NODES */
+
+#ifndef ENABLE_MULTIPLE_NODES
+static const char* NOKEYUPDATE_KEYSHARE_ERRMSG = "/NO KEY UPDATE/KEY SHARE";
+#else
+static const char* NOKEYUPDATE_KEYSHARE_ERRMSG = "";
+#endif
/*
* parse_analyze
@@ -154,7 +167,9 @@ Query* parse_analyze(
parse_fixed_parameters(pstate, paramTypes, numParams);
}
+ PUSH_SKIP_UNIQUE_SQL_HOOK();
query = transformTopLevelStmt(pstate, parseTree, isFirstNode, isCreateView);
+ POP_SKIP_UNIQUE_SQL_HOOK();
/* it's unsafe to deal with plugins hooks as dynamic lib may be released */
if (post_parse_analyze_hook && !(g_instance.status > NoShutdown)) {
@@ -834,7 +849,7 @@ static Query* transformDeleteStmt(ParseState* pstate, DeleteStmt* stmt)
// @Online expansion: check if the target relation is being redistributed in read only mode
if (!u_sess->attr.attr_sql.enable_cluster_resize && pstate->p_target_relation &&
- RelationInClusterResizingReadOnly(pstate->p_target_relation)) {
+ RelationInClusterResizingWriteErrorMode(pstate->p_target_relation)) {
ereport(ERROR,
(errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
errmsg("%s is redistributing, please retry later.", pstate->p_target_relation->rd_rel->relname.data)));
@@ -1456,7 +1471,7 @@ static Query* transformInsertStmt(ParseState* pstate, InsertStmt* stmt)
* so we don't need to double check if target table is DFS table here anymore.
*/
if (!u_sess->attr.attr_sql.enable_cluster_resize && pstate->p_target_relation != NULL &&
- RelationInClusterResizingReadOnly(pstate->p_target_relation)) {
+ RelationInClusterResizingWriteErrorMode(pstate->p_target_relation)) {
ereport(ERROR,
(errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
errmsg("%s is redistributing, please retry later.", pstate->p_target_relation->rd_rel->relname.data)));
@@ -1954,6 +1969,30 @@ static bool CheckRlsPolicyForUpsert(Relation targetrel)
return false;
}
+/*
+ * The following check only affect distributed deployment.
+ * Sublink in upsert's where clause is supported for centralized mode.
+ */
+#ifdef ENABLE_MULTIPLE_NODES
+static bool ContainSubLinkWalker(Node* node, void* context)
+{
+ if (node == NULL) {
+ return false;
+ }
+
+ if (IsA(node, SubLink)) {
+ return true;
+ }
+
+ return expression_tree_walker(node, (bool (*)())ContainSubLinkWalker, (void*)context);
+}
+
+static bool ContainSubLink(Node* clause)
+{
+ return ContainSubLinkWalker(clause, NULL);
+}
+#endif /* ENABLE_MULTIPLE_NODES */
+
static UpsertExpr* transformUpsertClause(ParseState* pstate, UpsertClause* upsertClause, RangeVar* relation)
{
UpsertExpr* result = NULL;
@@ -1961,6 +2000,7 @@ static UpsertExpr* transformUpsertClause(ParseState* pstate, UpsertClause* upser
RangeTblEntry* exclRte = NULL;
int exclRelIndex = 0;
List* exclRelTlist = NIL;
+ Node* updateWhere = NULL;
UpsertAction action = UPSERT_NOTHING;
Relation targetrel = pstate->p_target_relation;
@@ -1983,12 +2023,6 @@ static UpsertExpr* transformUpsertClause(ParseState* pstate, UpsertClause* upser
"UPDATE.")));
}
- if (RelationIsSubPartitioned(targetrel)) {
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("Subpartition is not supported for INSERT ON DUPLICATE KEY UPDATE.")));
- }
-
if (upsertClause->targetList != NIL) {
pstate->p_is_insert = false;
action = UPSERT_UPDATE;
@@ -2020,7 +2054,21 @@ static UpsertExpr* transformUpsertClause(ParseState* pstate, UpsertClause* upser
addRTEtoQuery(pstate, pstate->p_target_rangetblentry, false, true, true);
updateTlist = transformTargetList(pstate, upsertClause->targetList);
+ /* Done with select-like processing, move on transforming to match update set target column */
updateTlist = transformUpdateTargetList(pstate, updateTlist, upsertClause->targetList, relation);
+ updateWhere = transformWhereClause(pstate, upsertClause->whereClause, "WHERE");
+#ifdef ENABLE_MULTIPLE_NODES
+ /* Do not support sublinks in update where clause for now */
+ if (ContainSubLink(updateWhere)) {
+ ereport(ERROR,
+ (errmodule(MOD_OPT_PLANNER), errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("Feature is not supported for INSERT ON DUPLICATE KEY UPDATE."),
+ errdetail("Do not support sublink in where clause."),
+ errcause("Unsupported syntax."),
+ erraction("Check if the query can be rewritten into MERGE INTO statement "
+ "or reduce the sublink in where clause.")));
+ }
+#endif /* ENABLE_MULTIPLE_NODES */
/* We can't update primary or unique key in upsert, check it here */
#ifdef ENABLE_MULTIPLE_NODES
if (IS_PGXC_COORDINATOR && !u_sess->attr.attr_sql.enable_upsert_to_merge) {
@@ -2037,6 +2085,7 @@ static UpsertExpr* transformUpsertClause(ParseState* pstate, UpsertClause* upser
result->exclRelIndex = exclRelIndex;
result->exclRelTlist = exclRelTlist;
result->upsertAction = action;
+ result->upsertWhere = updateWhere;
return result;
}
@@ -3322,7 +3371,7 @@ static Query* transformUpdateStmt(ParseState* pstate, UpdateStmt* stmt)
// check if the target relation is being redistributed in read only mode
if (!u_sess->attr.attr_sql.enable_cluster_resize && pstate->p_target_relation != NULL &&
- RelationInClusterResizingReadOnly(pstate->p_target_relation)) {
+ RelationInClusterResizingWriteErrorMode(pstate->p_target_relation)) {
ereport(ERROR,
(errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
errmsg("%s is redistributing, please retry later.", pstate->p_target_relation->rd_rel->relname.data)));
@@ -4181,39 +4230,40 @@ void CheckSelectLocking(Query* qry)
if (qry->setOperations) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE is not allowed "
- "with UNION/INTERSECT/EXCEPT")));
+ errmsg("SELECT FOR UPDATE/SHARE%s is not allowed with UNION/INTERSECT/EXCEPT",
+ NOKEYUPDATE_KEYSHARE_ERRMSG)));
}
if (qry->distinctClause != NIL) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE is not allowed with DISTINCT clause")));
+ errmsg("SELECT FOR UPDATE/SHARE%s is not allowed with DISTINCT clause", NOKEYUPDATE_KEYSHARE_ERRMSG)));
}
if (qry->groupClause != NIL) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE is not allowed with GROUP BY clause")));
+ errmsg("SELECT FOR UPDATE/SHARE%s is not allowed with GROUP BY clause", NOKEYUPDATE_KEYSHARE_ERRMSG)));
}
if (qry->havingQual != NULL) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE is not allowed with HAVING clause")));
+ errmsg("SELECT FOR UPDATE/SHARE%s is not allowed with HAVING clause", NOKEYUPDATE_KEYSHARE_ERRMSG)));
}
if (qry->hasAggs) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE is not allowed with aggregate functions")));
+ errmsg("SELECT FOR UPDATE/SHARE%s is not allowed with aggregate functions",
+ NOKEYUPDATE_KEYSHARE_ERRMSG)));
}
if (qry->hasWindowFuncs) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE is not allowed with window functions")));
+ errmsg("SELECT FOR UPDATE/SHARE%s is not allowed with window functions", NOKEYUPDATE_KEYSHARE_ERRMSG)));
}
if (expression_returns_set((Node*)qry->targetList)) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE is not allowed with set-returning functions "
- "in the target list")));
+ errmsg("SELECT FOR UPDATE/SHARE%s is not allowed with set-returning functions in the target list",
+ NOKEYUPDATE_KEYSHARE_ERRMSG)));
}
}
@@ -4244,11 +4294,24 @@ static void transformLockingClause(ParseState* pstate, Query* qry, LockingClause
#ifdef ENABLE_MULTIPLE_NODES
|| true
#endif
- ) {
+ ) {
lc->strength = lc->forUpdate ? LCS_FORUPDATE : LCS_FORSHARE;
}
allrels->strength = lc->strength;
allrels->noWait = lc->noWait;
+ allrels->waitSec = lc->waitSec;
+
+ /* The processing delay of the ProcSleep function is in milliseconds. Set the delay to int_max/1000. */
+ /* The processing delay of the ProcSleep function is in milliseconds. Set the delay to int_max/1000. */
+ if (lc->waitSec > (MAX_INT32 / MILLISECONDS_PER_SECONDS)) {
+ ereport(ERROR,
+ (errmodule(MOD_OPT_PLANNER), errcode(ERRCODE_INVALID_OPTION),
+ errmsg("The delay ranges from 0 to 2147483."),
+ errdetail("N/A"),
+ errcause("Invalid input parameter."),
+ erraction("Modify SQL statement according to the manual.")));
+ }
+
if (lockedRels == NIL) {
/* all regular tables used in query */
@@ -4264,17 +4327,17 @@ static void transformLockingClause(ParseState* pstate, Query* qry, LockingClause
heap_close(rel, AccessShareLock);
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with "
- "column table \"%s\"", rte->eref->aliasname)));
+ errmsg("SELECT FOR UPDATE/SHARE%s cannot be used with "
+ "column table \"%s\"", NOKEYUPDATE_KEYSHARE_ERRMSG, rte->eref->aliasname)));
}
heap_close(rel, AccessShareLock);
- applyLockingClause(qry, i, lc->strength, lc->noWait, pushedDown);
+ applyLockingClause(qry, i, lc->strength, lc->noWait, pushedDown, lc->waitSec);
rte->requiredPerms |= ACL_SELECT_FOR_UPDATE;
break;
case RTE_SUBQUERY:
- applyLockingClause(qry, i, lc->strength, lc->noWait, pushedDown);
+ applyLockingClause(qry, i, lc->strength, lc->noWait, pushedDown, lc->waitSec);
/*
* FOR [KEY] UPDATE/SHARE of subquery is propagated to all of
@@ -4304,8 +4367,8 @@ static void transformLockingClause(ParseState* pstate, Query* qry, LockingClause
if (thisrel->catalogname || thisrel->schemaname) {
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE must specify unqualified "
- "relation names"),
+ errmsg("SELECT FOR UPDATE/SHARE%s must specify unqualified "
+ "relation names", NOKEYUPDATE_KEYSHARE_ERRMSG),
parser_errposition(pstate, thisrel->location)));
}
@@ -4322,46 +4385,48 @@ static void transformLockingClause(ParseState* pstate, Query* qry, LockingClause
heap_close(rel, AccessShareLock);
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be used with "
- "column table \"%s\"", rte->eref->aliasname),
+ errmsg("SELECT FOR UPDATE/SHARE%s cannot be used with column table \"%s\"",
+ NOKEYUPDATE_KEYSHARE_ERRMSG, rte->eref->aliasname),
parser_errposition(pstate, thisrel->location)));
}
heap_close(rel, AccessShareLock);
- applyLockingClause(qry, i, lc->strength, lc->noWait, pushedDown);
+ applyLockingClause(qry, i, lc->strength, lc->noWait, pushedDown,
+ lc->waitSec);
rte->requiredPerms |= ACL_SELECT_FOR_UPDATE;
break;
case RTE_SUBQUERY:
- applyLockingClause(qry, i, lc->strength, lc->noWait, pushedDown);
+ applyLockingClause(qry, i, lc->strength, lc->noWait, pushedDown,
+ lc->waitSec);
/* see comment above */
transformLockingClause(pstate, rte->subquery, allrels, true);
break;
case RTE_JOIN:
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be applied "
- "to a join"),
+ errmsg("SELECT FOR UPDATE/SHARE%s cannot be applied to a join",
+ NOKEYUPDATE_KEYSHARE_ERRMSG),
parser_errposition(pstate, thisrel->location)));
break;
case RTE_FUNCTION:
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be applied "
- "to a function"),
+ errmsg("SELECT FOR UPDATE/SHARE%s cannot be applied to a function",
+ NOKEYUPDATE_KEYSHARE_ERRMSG),
parser_errposition(pstate, thisrel->location)));
break;
case RTE_VALUES:
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be applied "
- "to VALUES"),
+ errmsg("SELECT FOR UPDATE/SHARE%s cannot be applied to VALUES",
+ NOKEYUPDATE_KEYSHARE_ERRMSG),
parser_errposition(pstate, thisrel->location)));
break;
case RTE_CTE:
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("SELECT FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE cannot be applied "
- "to a WITH query"),
+ errmsg("SELECT FOR UPDATE/SHARE%s cannot be applied to a WITH query",
+ NOKEYUPDATE_KEYSHARE_ERRMSG),
parser_errposition(pstate, thisrel->location)));
break;
default:
@@ -4387,7 +4452,8 @@ static void transformLockingClause(ParseState* pstate, Query* qry, LockingClause
/*
* Record locking info for a single rangetable item
*/
-void applyLockingClause(Query* qry, Index rtindex, LockClauseStrength strength, bool noWait, bool pushedDown)
+void applyLockingClause(Query* qry, Index rtindex, LockClauseStrength strength, bool noWait, bool pushedDown,
+ int waitSec)
{
RowMarkClause* rc = NULL;
@@ -4414,6 +4480,7 @@ void applyLockingClause(Query* qry, Index rtindex, LockClauseStrength strength,
rc->strength = Max(rc->strength, strength);
rc->forUpdate = rc->strength == LCS_FORUPDATE;
rc->noWait = rc->noWait || noWait;
+ rc->waitSec = Max(rc->waitSec, waitSec);
rc->pushedDown = rc->pushedDown && pushedDown;
return;
}
@@ -4421,9 +4488,10 @@ void applyLockingClause(Query* qry, Index rtindex, LockClauseStrength strength,
/* Make a new RowMarkClause */
rc = makeNode(RowMarkClause);
rc->rti = rtindex;
- rc->strength = strength;
rc->forUpdate = strength == LCS_FORUPDATE;
+ rc->strength = strength;
rc->noWait = noWait;
+ rc->waitSec = waitSec;
rc->pushedDown = pushedDown;
qry->rowMarks = lappend(qry->rowMarks, rc);
}
diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y
index 6a60f6efc..4d57dcb6b 100644
--- a/src/common/backend/parser/gram.y
+++ b/src/common/backend/parser/gram.y
@@ -9,6 +9,7 @@
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
+ * Portions Copyright (c) 2021, openGauss Contributors
*
*
* IDENTIFICATION
@@ -236,11 +237,15 @@ static Node *make_node_from_scanbuf(int start_pos, int end_pos, core_yyscan_t yy
static int64 SequenceStrGetInt64(const char *str);
static int GetLoadType(int load_type_f, int load_type_s);
static Node *MakeSqlLoadNode(char *colname);
+
+/* start with .. connect by related utilities */
static bool IsConnectByRootIdent(Node* node);
static void ValidateTripleTuple(Node* node, core_yyscan_t yyscanner, int location, char* token);
static Node* MakeConnectByRootNode(ColumnRef* cr, int location);
static char* MakeConnectByRootColName(char* tabname, char* colname);
static void FilterStartWithUseCases(SelectStmt* stmt, List* locking_clause, core_yyscan_t yyscanner, int location);
+static FuncCall* MakePriorAsFunc();
+
#ifndef ENABLE_MULTIPLE_NODES
static bool CheckWhetherInColList(char *colname, List *col_list);
#endif
@@ -293,6 +298,7 @@ static int errstate;
ResTarget *target;
struct PrivTarget *privtarget;
AccessPriv *accesspriv;
+ DbPriv *dbpriv;
InsertStmt *istmt;
VariableSetStmt *vsetstmt;
/* PGXC_BEGIN */
@@ -303,7 +309,7 @@ static int errstate;
MergeWhenClause *mergewhen;
UpsertClause *upsert;
EncryptionType algtype;
- LockClauseStrength lockstrength;
+ LockClauseStrength lockstrength;
}
%type stmt schema_stmt
@@ -329,10 +335,10 @@ static int errstate;
DropAssertStmt DropSynonymStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt DropRlsPolicyStmt
DropUserStmt DropdbStmt DropTableSpaceStmt DropDataSourceStmt DropDirectoryStmt DropFdwStmt
DropForeignServerStmt DropUserMappingStmt ExplainStmt ExecDirectStmt FetchStmt
- GrantStmt GrantRoleStmt IndexStmt InsertStmt ListenStmt LoadStmt
+ GrantStmt GrantRoleStmt GrantDbStmt IndexStmt InsertStmt ListenStmt LoadStmt
LockStmt NotifyStmt ExplainableStmt PreparableStmt
CreateFunctionStmt CreateProcedureStmt CreatePackageStmt CreatePackageBodyStmt AlterFunctionStmt AlterProcedureStmt ReindexStmt RemoveAggrStmt
- RemoveFuncStmt RemoveOperStmt RemovePackageStmt RenameStmt RevokeStmt RevokeRoleStmt
+ RemoveFuncStmt RemoveOperStmt RemovePackageStmt RenameStmt RevokeStmt RevokeRoleStmt RevokeDbStmt
RuleActionStmt RuleActionStmtOrEmpty RuleStmt
SecLabelStmt SelectStmt TimeCapsuleStmt TransactionStmt TruncateStmt CallFuncStmt
UnlistenStmt UpdateStmt VacuumStmt
@@ -351,6 +357,7 @@ static int errstate;
CreateAppWorkloadGroupMappingStmt AlterAppWorkloadGroupMappingStmt DropAppWorkloadGroupMappingStmt
MergeStmt PurgeStmt CreateMatViewStmt RefreshMatViewStmt
CreateWeakPasswordDictionaryStmt DropWeakPasswordDictionaryStmt
+ AlterGlobalConfigStmt DropGlobalConfigStmt
CreatePublicationStmt AlterPublicationStmt
CreateSubscriptionStmt AlterSubscriptionStmt DropSubscriptionStmt
@@ -391,11 +398,11 @@ static int errstate;
transaction_mode_item
create_extension_opt_item alter_extension_opt_item
-%type opt_lock lock_type cast_context
+%type opt_lock lock_type cast_context opt_wait
%type vacuum_option_list vacuum_option_elem opt_verify_options
%type opt_check opt_force opt_or_replace
opt_grant_grant_option opt_grant_admin_option
- opt_nowait opt_if_exists opt_with_data opt_large_seq
+ opt_nowait opt_if_exists opt_with_data opt_large_seq opt_cancelable
%type OptRoleList AlterOptRoleList
%type CreateOptRoleElem AlterOptRoleElem
@@ -426,7 +433,7 @@ static int errstate;
opt_class opt_inline_handler opt_validator validator_clause
opt_collate
-%type qualified_name OptConstrFromTable opt_index_name
+%type qualified_name insert_target OptConstrFromTable opt_index_name insert_partition_clause update_delete_partition_clause
%type all_Op MathOp
@@ -439,7 +446,8 @@ static int errstate;
%type grantee
%type grantee_list
%type privilege
-%type privileges privilege_list
+%type privileges privilege_list db_privileges db_privilege_list
+%type db_privilege
%type privilege_str
%type privilege_target
%type function_with_argtypes
@@ -657,7 +665,8 @@ static int errstate;
interval_expr maxValueItem list_partitioning_clause hash_partitioning_clause
range_start_end_item range_less_than_item list_partition_item hash_partition_item
subpartitioning_clause range_subpartitioning_clause hash_subpartitioning_clause
- list_subpartitioning_clause subpartition_item
+ list_subpartitioning_clause subpartition_item opt_subpartition_index_def
+ range_subpartition_index_list range_subpartition_index_item
%type range_partition_definition_list list_partition_definition_list hash_partition_definition_list maxValueList
column_item_list tablespaceList opt_interval_tablespaceList
split_dest_partition_define_list split_dest_listsubpartition_define_list split_dest_rangesubpartition_define_list
@@ -780,7 +789,7 @@ static int errstate;
BACKWARD BARRIER BEFORE BEGIN_NON_ANOYBLOCK BEGIN_P BETWEEN BIGINT BINARY BINARY_DOUBLE BINARY_INTEGER BIT BLANKS
BLOB_P BLOCKCHAIN BODY_P BOGUS BOOLEAN_P BOTH BUCKETCNT BUCKETS BY BYTEAWITHOUTORDER BYTEAWITHOUTORDERWITHEQUAL
- CACHE CALL CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
+ CACHE CALL CALLED CANCELABLE CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
CHARACTER CHARACTERISTICS CHARACTERSET CHECK CHECKPOINT CLASS CLEAN CLIENT CLIENT_MASTER_KEY CLIENT_MASTER_KEYS CLOB CLOSE
CLUSTER COALESCE COLLATE COLLATION COLUMN COLUMN_ENCRYPTION_KEY COLUMN_ENCRYPTION_KEYS COMMENT COMMENTS COMMIT
COMMITTED COMPACT COMPATIBLE_ILLEGAL_CHARS COMPLETE COMPRESS CONCURRENTLY CONDITION CONFIGURATION CONNECTION CONSTANT CONSTRAINT CONSTRAINTS
@@ -829,7 +838,7 @@ static int errstate;
OBJECT_P OF OFF OFFSET OIDS ON ONLY OPERATOR OPTIMIZATION OPTION OPTIONALLY OPTIONS OR
ORDER OUT_P OUTER_P OVER OVERLAPS OVERLAY OWNED OWNER
- PACKAGE PARSER PARTIAL PARTITION PARTITIONS PASSING PASSWORD PCTFREE PER_P PERCENT PERFORMANCE PERM PLACING PLAN PLANS POLICY POSITION
+ PACKAGE PACKAGES PARSER PARTIAL PARTITION PARTITIONS PASSING PASSWORD PCTFREE PER_P PERCENT PERFORMANCE PERM PLACING PLAN PLANS POLICY POSITION
/* PGXC_BEGIN */
POOL PRECEDING PRECISION
/* PGXC_END */
@@ -862,7 +871,7 @@ static int errstate;
VACUUM VALID VALIDATE VALIDATION VALIDATOR VALUE_P VALUES VARCHAR VARCHAR2 VARIABLES VARIADIC VARRAY VARYING VCGROUP
VERBOSE VERIFY VERSION_P VIEW VOLATILE
- WEAK WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WORKLOAD WRAPPER WRITE
+ WAIT WEAK WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WORKLOAD WRAPPER WRITE
XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLPARSE
XMLPI XMLROOT XMLSERIALIZE
@@ -879,19 +888,24 @@ static int errstate;
%token NULLS_FIRST NULLS_LAST WITH_TIME INCLUDING_ALL
RENAME_PARTITION
PARTITION_FOR
+ SUBPARTITION_FOR
ADD_PARTITION
DROP_PARTITION
REBUILD_PARTITION
MODIFY_PARTITION
+ ADD_SUBPARTITION
+ DROP_SUBPARTITION
NOT_ENFORCED
VALID_BEGIN
DECLARE_CURSOR
+ START_WITH CONNECT_BY
/* Precedence: lowest to highest */
%nonassoc PARTIAL_EMPTY_PREC
%nonassoc CLUSTER
%nonassoc SET /* see relation_expr_opt_alias */
-%right FEATURES TARGET // DB4AI
+%right PRIOR
+%right FEATURES TARGET // DB4AI
%left UNION EXCEPT MINUS_P
%left INTERSECT
%left OR
@@ -942,7 +956,7 @@ static int errstate;
/* Unary Operators */
%left AT /* sets precedence for AT TIME ZONE */
%left COLLATE
-%right UMINUS
+%right UMINUS BY NAME_P PASSING ROW TYPE_P VALUE_P
%left '[' ']'
%left '(' ')'
%left TYPECAST
@@ -1039,6 +1053,7 @@ stmt :
| AlterOwnerStmt
| AlterRlsPolicyStmt
| AlterResourcePoolStmt
+ | AlterGlobalConfigStmt
| AlterSeqStmt
| AlterSchemaStmt
| AlterSubscriptionStmt
@@ -1142,6 +1157,7 @@ stmt :
| DropRlsPolicyStmt
| DropPLangStmt
| DropResourcePoolStmt
+ | DropGlobalConfigStmt
| DropRuleStmt
| DropStmt
| DropSubscriptionStmt
@@ -1159,6 +1175,7 @@ stmt :
| FetchStmt
| GrantStmt
| GrantRoleStmt
+ | GrantDbStmt
| IndexStmt
| InsertStmt
| ListenStmt
@@ -1178,6 +1195,7 @@ stmt :
| RenameStmt
| RevokeStmt
| RevokeRoleStmt
+ | RevokeDbStmt
| RuleStmt
| SecLabelStmt
| SelectStmt
@@ -1977,7 +1995,7 @@ generic_set:
n->name = $1;
n->args = $3;
/* if we are setting role, we switch to the new syntax which check the password of role */
- if(!strcmp("role", n->name) || !pg_strcasecmp("session_authorization", n->name))
+ if(!pg_strcasecmp("role", n->name) || !pg_strcasecmp("session_authorization", n->name))
{
const char* message = "SET TO rolename\" not yet supported";
InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc);
@@ -1999,7 +2017,7 @@ generic_set:
n->name = $1;
n->args = $3;
/* if we are setting role, we switch to the new syntax which check the password of role */
- if(!strcmp("role", n->name) || !pg_strcasecmp("session_authorization", n->name))
+ if(!pg_strcasecmp("role", n->name) || !pg_strcasecmp("session_authorization", n->name))
{
const char* message = "SET TO rolename\" not yet supported";
InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc);
@@ -2942,6 +2960,151 @@ alter_partition_cmd:
n->def = (Node*)s;
$$ = (Node *)n;
}
+ | ADD_PARTITION name VALUES '(' DEFAULT ')' OptTableSpace
+ {
+ ListPartitionDefState *p = makeNode(ListPartitionDefState);
+ AlterTableCmd *n = makeNode(AlterTableCmd);
+ AddPartitionState *s = makeNode(AddPartitionState);
+ p->partitionName = $2;
+ Const *n_default = makeNode(Const);
+ n_default->ismaxvalue = true;
+ n_default->location = -1;
+ p->boundary = list_make1(n_default);
+ p->tablespacename = $7;
+ s->partitionList = list_make1(p);
+ s->isStartEnd = false;
+ n->subtype = AT_AddPartition;
+ n->def = (Node*)s;
+ $$ = (Node *)n;
+ }
+ | ADD_PARTITION name VALUES LESS THAN
+ '(' maxValueList ')' OptTableSpace '(' subpartition_definition_list ')'
+ {
+ RangePartitionDefState *p = makeNode(RangePartitionDefState);
+ AlterTableCmd *n = makeNode(AlterTableCmd);
+ AddPartitionState *s = makeNode(AddPartitionState);
+ p->partitionName = $2;
+ p->boundary = $7;
+ p->tablespacename = $9;
+ p->subPartitionDefState = $11;
+ int i = 0;
+ ListCell *elem = NULL;
+ List *parts = p->subPartitionDefState;
+ foreach(elem, parts) {
+ if (!IsA((Node*)lfirst(elem), HashPartitionDefState)) {
+ break;
+ }
+ HashPartitionDefState *hashPart = (HashPartitionDefState*)lfirst(elem);
+ hashPart->boundary = list_make1(makeIntConst(i, -1));
+ i++;
+ }
+ s->partitionList = list_make1(p);
+ s->isStartEnd = false;
+ n->subtype = AT_AddPartition;
+ n->def = (Node*)s;
+ $$ = (Node *)n;
+ }
+ | ADD_PARTITION name VALUES '(' expr_list ')' OptTableSpace '(' subpartition_definition_list ')'
+ {
+ ListPartitionDefState *p = makeNode(ListPartitionDefState);
+ AlterTableCmd *n = makeNode(AlterTableCmd);
+ AddPartitionState *s = makeNode(AddPartitionState);
+ p->partitionName = $2;
+ p->boundary = $5;
+ p->tablespacename = $7;
+ p->subPartitionDefState = $9;
+ int i = 0;
+ ListCell *elem = NULL;
+ List *parts = p->subPartitionDefState;
+ foreach(elem, parts) {
+ if (!IsA((Node*)lfirst(elem), HashPartitionDefState)) {
+ break;
+ }
+ HashPartitionDefState *hashPart = (HashPartitionDefState*)lfirst(elem);
+ hashPart->boundary = list_make1(makeIntConst(i, -1));
+ i++;
+ }
+ s->partitionList = list_make1(p);
+ s->isStartEnd = false;
+ n->subtype = AT_AddPartition;
+ n->def = (Node*)s;
+ $$ = (Node *)n;
+ }
+ | ADD_PARTITION name VALUES '(' DEFAULT ')' OptTableSpace '(' subpartition_definition_list ')'
+ {
+ ListPartitionDefState *p = makeNode(ListPartitionDefState);
+ AlterTableCmd *n = makeNode(AlterTableCmd);
+ AddPartitionState *s = makeNode(AddPartitionState);
+ p->partitionName = $2;
+ Const *n_default = makeNode(Const);
+ n_default->ismaxvalue = true;
+ n_default->location = -1;
+ p->boundary = list_make1(n_default);
+ p->tablespacename = $7;
+ p->subPartitionDefState = $9;
+ int i = 0;
+ ListCell *elem = NULL;
+ List *parts = p->subPartitionDefState;
+ foreach(elem, parts) {
+ if (!IsA((Node*)lfirst(elem), HashPartitionDefState)) {
+ break;
+ }
+ HashPartitionDefState *hashPart = (HashPartitionDefState*)lfirst(elem);
+ hashPart->boundary = list_make1(makeIntConst(i, -1));
+ i++;
+ }
+ s->partitionList = list_make1(p);
+ s->isStartEnd = false;
+ n->subtype = AT_AddPartition;
+ n->def = (Node*)s;
+ $$ = (Node *)n;
+ }
+ /* ALTER TABLE MODIFY PARTITION ADD SUBPARTITION */
+ | MODIFY_PARTITION name ADD_SUBPARTITION name VALUES LESS THAN '(' maxValueList ')' OptTableSpace
+ {
+ RangePartitionDefState *p = makeNode(RangePartitionDefState);
+ AlterTableCmd *n = makeNode(AlterTableCmd);
+ AddSubPartitionState *s = makeNode(AddSubPartitionState);
+ p->partitionName = $4;
+ p->boundary = $9;
+ p->tablespacename = $11;
+ s->subPartitionList = list_make1(p);
+ s->partitionName = $2;
+ n->subtype = AT_AddSubPartition;
+ n->def = (Node*)s;
+ $$ = (Node *)n;
+ }
+ | MODIFY_PARTITION name ADD_SUBPARTITION name VALUES '(' expr_list ')' OptTableSpace
+ {
+ ListPartitionDefState *p = makeNode(ListPartitionDefState);
+ AlterTableCmd *n = makeNode(AlterTableCmd);
+ AddSubPartitionState *s = makeNode(AddSubPartitionState);
+ p->partitionName = $4;
+ p->boundary = $7;
+ p->tablespacename = $9;
+ s->subPartitionList = list_make1(p);
+ s->partitionName = $2;
+ n->subtype = AT_AddSubPartition;
+ n->def = (Node*)s;
+ $$ = (Node *)n;
+ }
+ | MODIFY_PARTITION name ADD_SUBPARTITION name VALUES '(' DEFAULT ')' OptTableSpace
+ {
+ ListPartitionDefState *p = makeNode(ListPartitionDefState);
+ AlterTableCmd *n = makeNode(AlterTableCmd);
+ AddSubPartitionState *s = makeNode(AddSubPartitionState);
+ p->partitionName = $4;
+ Const *n_default = makeNode(Const);
+ n_default->ismaxvalue = true;
+ n_default->location = -1;
+ p->boundary = list_make1(n_default);
+ p->tablespacename = $9;
+ s->subPartitionList = list_make1(p);
+ s->partitionName = $2;
+ n->subtype = AT_AddSubPartition;
+ n->def = (Node*)s;
+ $$ = (Node *)n;
+ }
/* ALTER TABLE DROP PARTITION */
| DROP_PARTITION ColId OptGPI
{
@@ -2967,6 +3130,30 @@ alter_partition_cmd:
n->alterGPI = $6;
$$ = (Node *)n;
}
+ /* ALTER TABLE DROP SUBPARTITION */
+ | DROP_SUBPARTITION ColId OptGPI
+ {
+ AlterTableCmd *n = makeNode(AlterTableCmd);
+ n->subtype = AT_DropSubPartition;
+ n->name = $2;
+ n->behavior = DROP_CASCADE;
+ n->missing_ok = FALSE;
+ n->alterGPI = $3;
+ $$ = (Node *)n;
+ }
+ | DROP_SUBPARTITION FOR '(' expr_list ')' OptGPI
+ {
+ RangePartitionDefState *p = makeNode(RangePartitionDefState);
+ AlterTableCmd *n = makeNode(AlterTableCmd);
+
+ p->boundary = $4;
+ n->subtype = AT_DropSubPartition;
+ n->def = (Node*)p;
+ n->behavior = DROP_CASCADE;
+ n->missing_ok = FALSE;
+ n->alterGPI = $6;
+ $$ = (Node *)n;
+ }
/* merge 2 or more partitions into 1 partition */
| MERGE PARTITIONS name_list INTO PARTITION name OptTableSpace OptGPI
{
@@ -4870,6 +5057,15 @@ range_partitioning_clause:
errmsg("Un-support feature"),
errdetail("The partition key's length should be 1.")));
}
+ if ($8 != NULL && $7 != NULL) {
+ const char* message = "Un-support feature";
+ InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc);
+ ereport(errstate,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("Un-support feature"),
+ errdetail("Subpartitions do not support interval partition."),
+ errcause("System error."), erraction("Contact engineer to support.")));
+ }
n->partitionKey = $5;
n->intervalPartDef = (IntervalPartitionDefState *)$7;
n->partitionList = $10;
@@ -5023,7 +5219,7 @@ range_subpartitioning_clause:
list_subpartitioning_clause:
SUBPARTITION BY LIST '(' column_item_list ')'
{
-#ifdef ENABLE_MULTIPLE_NODE
+#ifdef ENABLE_MULTIPLE_NODES
const char* message = "Un-support feature";
InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc);
ereport(ERROR,
@@ -7556,9 +7752,14 @@ SeqOptElem: CACHE NumericOnly
{
$$ = makeDefElem("owned_by", (Node *)$3);
}
- | START opt_with NumericOnly
+ | START_WITH NumericOnly
{
- $$ = makeDefElem("start", (Node *)$3);
+ $$ = makeDefElem("start", (Node *)$2);
+ }
+
+ | START NumericOnly
+ {
+ $$ = makeDefElem("start", (Node *)$2);
}
| RESTART
{
@@ -10919,14 +11120,6 @@ privilege: SELECT opt_column_list
n->cols = $2;
$$ = n;
}
- | CONNECT opt_column_list
- {
- AccessPriv *n = makeNode(AccessPriv);
- n->priv_name = pstrdup($1);
- n->cols = $2;
- $$ = n;
- }
-
;
@@ -11102,6 +11295,14 @@ privilege_target:
n->objs = $5;
$$ = n;
}
+ | ALL PACKAGES IN_P SCHEMA name_list
+ {
+ PrivTarget *n = (PrivTarget *)palloc(sizeof(PrivTarget));
+ n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
+ n->objtype = ACL_OBJECT_PACKAGE;
+ n->objs = $5;
+ $$ = n;
+ }
| DATA_P SOURCE_P name_list
{
PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
@@ -11240,6 +11441,138 @@ opt_granted_by: GRANTED BY RoleId { $$ = $3; }
| /*EMPTY*/ { $$ = NULL; }
;
+/*****************************************************************************
+ *
+ * GRANT and REVOKE DATABASE PRIVILEGE statements
+ *
+ *****************************************************************************/
+
+GrantDbStmt:
+ GRANT db_privileges TO grantee_list opt_grant_admin_option
+ {
+ GrantDbStmt *n = makeNode(GrantDbStmt);
+ n->is_grant = true;
+ n->privileges = $2;
+ n->grantees = $4;
+ n->admin_opt = $5;
+ $$ = (Node*)n;
+ }
+ ;
+
+RevokeDbStmt:
+ REVOKE db_privileges FROM grantee_list
+ {
+ GrantDbStmt *n = makeNode(GrantDbStmt);
+ n->is_grant = false;
+ n->privileges = $2;
+ n->grantees = $4;
+ n->admin_opt = false;
+ $$ = (Node*)n;
+ }
+ | REVOKE ADMIN OPTION FOR db_privileges FROM grantee_list
+ {
+ GrantDbStmt *n = makeNode(GrantDbStmt);
+ n->is_grant = false;
+ n->privileges = $5;
+ n->grantees = $7;
+ n->admin_opt = true;
+ $$ = (Node*)n;
+ }
+ ;
+
+db_privileges: db_privilege_list { $$ = $1; }
+ ;
+
+db_privilege_list: db_privilege { $$ = list_make1($1); }
+ | db_privilege_list ',' db_privilege { $$ = lappend($1, $3); }
+ ;
+
+db_privilege: CREATE ANY TABLE
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("create any table");
+ $$ = n;
+ }
+ | ALTER ANY TABLE
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("alter any table");
+ $$ = n;
+ }
+ | DROP ANY TABLE
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("drop any table");
+ $$ = n;
+ }
+ | SELECT ANY TABLE
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("select any table");
+ $$ = n;
+ }
+ | INSERT ANY TABLE
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("insert any table");
+ $$ = n;
+ }
+ | UPDATE ANY TABLE
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("update any table");
+ $$ = n;
+ }
+ | DELETE_P ANY TABLE
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("delete any table");
+ $$ = n;
+ }
+ | CREATE ANY SEQUENCE
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("create any sequence");
+ $$ = n;
+ }
+ | CREATE ANY INDEX
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("create any index");
+ $$ = n;
+ }
+ | CREATE ANY FUNCTION
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("create any function");
+ $$ = n;
+ }
+ | EXECUTE ANY FUNCTION
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("execute any function");
+ $$ = n;
+ }
+ | CREATE ANY PACKAGE
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("create any package");
+ $$ = n;
+ }
+ | EXECUTE ANY PACKAGE
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("execute any package");
+ $$ = n;
+ }
+ | CREATE ANY TYPE_P
+ {
+ DbPriv *n = makeNode(DbPriv);
+ n->db_priv_name = pstrdup("create any type");
+ $$ = n;
+ }
+ ;
+
/*****************************************************************************
*
* ALTER DEFAULT PRIVILEGES statement
@@ -11331,6 +11664,7 @@ defacl_privilege_target:
| TYPES_P { $$ = ACL_OBJECT_TYPE; }
| CLIENT_MASTER_KEYS { $$ = ACL_OBJECT_GLOBAL_SETTING; }
| COLUMN_ENCRYPTION_KEYS { $$ = ACL_OBJECT_COLUMN_SETTING; }
+ | PACKAGES { $$ = ACL_OBJECT_PACKAGE; }
;
@@ -11373,7 +11707,7 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name
}
| CREATE opt_unique INDEX opt_concurrently opt_index_name
ON qualified_name access_method_clause '(' index_params ')'
- LOCAL opt_partition_index_def opt_reloptions OptTableSpace
+ LOCAL opt_partition_index_def opt_include opt_reloptions OptTableSpace
{
IndexStmt *n = makeNode(IndexStmt);
@@ -11385,8 +11719,9 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name
n->accessMethod = $8;
n->indexParams = $10;
n->partClause = $13;
- n->options = $14;
- n->tableSpace = $15;
+ n->indexIncludingParams = $14;
+ n->options = $15;
+ n->tableSpace = $16;
n->isPartitioned = true;
n->isGlobal = false;
n->excludeOpNames = NIL;
@@ -11402,7 +11737,7 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name
}
| CREATE opt_unique INDEX opt_concurrently opt_index_name
ON qualified_name access_method_clause '(' index_params ')'
- GLOBAL opt_reloptions OptTableSpace
+ GLOBAL opt_include opt_reloptions OptTableSpace
{
IndexStmt *n = makeNode(IndexStmt);
@@ -11414,8 +11749,9 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name
n->accessMethod = $8;
n->indexParams = $10;
n->partClause = NULL;
- n->options = $13;
- n->tableSpace = $14;
+ n->indexIncludingParams = $13;
+ n->options = $14;
+ n->tableSpace = $15;
n->isPartitioned = true;
n->isGlobal = true;
n->excludeOpNames = NIL;
@@ -11577,7 +11913,43 @@ range_partition_index_item:
$$ = (Node*)def;
}
+ | PARTITION index_name OptTableSpace opt_subpartition_index_def
+ {
+ RangePartitionindexDefState* def = makeNode(RangePartitionindexDefState);
+ def->name = $2;
+ def->tablespace = $3;
+ def->sublist = (List *)$4;
+ $$ = (Node*)def;
+ }
;
+
+opt_subpartition_index_def:
+ '(' range_subpartition_index_list ')'
+ {
+ $$ = (Node *)$2;
+ }
+ ;
+
+range_subpartition_index_list:
+ range_subpartition_index_item
+ {
+ $$ = (Node*)list_make1($1);
+ }
+ | range_subpartition_index_list ',' range_subpartition_index_item
+ {
+ $$ = (Node*)lappend((List*)$1, $3);
+ }
+ ;
+
+range_subpartition_index_item:
+ SUBPARTITION index_name OptTableSpace
+ {
+ RangePartitionindexDefState* def = makeNode(RangePartitionindexDefState);
+ def->name = $2;
+ def->tablespace = $3;
+ $$ = (Node*)def;
+ }
+ ;
/*****************************************************************************
*
* QUERY:
@@ -11661,9 +12033,9 @@ CreateFunctionStmt:
n->options = $8;
n->options = lappend(n->options, makeDefElem("as",
(Node *)list_make1(makeString(funSource->bodySrc))));
-
n->options = lappend(n->options, makeDefElem("language",
(Node *)makeString("plpgsql")));
+
n->withClause = NIL;
n->withClause = NIL;
n->isProcedure = false;
@@ -11673,11 +12045,19 @@ CreateFunctionStmt:
;
CallFuncStmt: CALL func_name '(' ')'
{
+#ifndef ENABLE_MULTIPLE_NODES
$$ = makeCallFuncStmt($2, NULL, enable_out_param_override());
+#else
+ $$ = makeCallFuncStmt($2, NULL, false);
+#endif
}
| CALL func_name '(' callfunc_args ')'
{
+#ifndef ENABLE_MULTIPLE_NODES
$$ = makeCallFuncStmt($2, $4, enable_out_param_override());
+#else
+ $$ = makeCallFuncStmt($2, $4, false);
+#endif
}
;
callfunc_args: func_arg_expr
@@ -11737,11 +12117,12 @@ CreateProcedureStmt:
CreatePackageStmt:
CREATE opt_or_replace PACKAGE pkg_name invoker_rights as_is {pg_yyget_extra(yyscanner)->core_yy_extra.include_ora_comment = true;}
{
- pg_yyget_extra(yyscanner)->core_yy_extra.in_slash_proc_body = true;
u_sess->plsql_cxt.package_as_line = GetLineNumber(t_thrd.postgres_cxt.debug_query_string, @6);
char *pkgNameBegin = NULL;
char *pkgNameEnd = NULL;
char *pkgName = NULL;
+ base_yy_extra_type *yyextra = pg_yyget_extra(yyscanner);
+ yyextra->core_yy_extra.in_slash_proc_body = true;
switch (list_length($4)) {
case 1:
pkgName = strVal(linitial($4));
@@ -11762,7 +12143,6 @@ CreatePackageStmt:
pkgNameBegin = pg_strtolower(pkgNameBegin);
int tok = YYEMPTY;
- base_yy_extra_type *yyextra = pg_yyget_extra(yyscanner);
if (yychar == YYEOF || yychar == YYEMPTY)
tok = YYLEX;
else
@@ -11790,7 +12170,7 @@ CreatePackageStmt:
// append pkgname into toks
toks = lappend_int(toks, tok);
positions = lappend_int(positions, yylloc);
- if (tok == IDENT) {
+ if (tok != ';') {
// append ; into toks
tok = YYLEX;
toks = lappend_int(toks, tok);
@@ -11811,11 +12191,14 @@ CreatePackageStmt:
}
pfree(name_info.data);
pkg_name_temp = NULL;
- }
+ } else {
+ parser_yyerror("package spec is not ended correctly");
+ }
}
tok = YYLEX;
}
-
+ yyextra->core_yy_extra.query_string_locationlist =
+ lappend_int(yyextra->core_yy_extra.query_string_locationlist, yylloc);
if (toks == NULL || toks->length < 1) {
parser_yyerror("package spec is not ended correctly");
}
@@ -11827,10 +12210,6 @@ CreatePackageStmt:
if (toks->length < 2) {
parser_yyerror("package spec is not ended correctly");
}
- last_tok = list_nth_int(toks, toks->length - 2);
- if (last_tok != IDENT) {
- parser_yyerror("variable/func/proc declare in package spec is not ended correctly");
- }
// Package spec content.
int name_start_pos = list_nth_int(positions, positions->length - 2);
@@ -11849,14 +12228,12 @@ CreatePackageStmt:
}
/* Reset the flag which mark whether we are in slash proc. */
- pg_yyget_extra(yyscanner)->core_yy_extra.in_slash_proc_body = false;
+ yyextra->core_yy_extra.in_slash_proc_body = false;
yyextra->core_yy_extra.dolqstart = NULL;
/*
* Add the end location of slash proc to the locationlist for the multi-query
* processed.
*/
- yyextra->core_yy_extra.query_string_locationlist =
- lappend_int(yyextra->core_yy_extra.query_string_locationlist, yylloc);
u_sess->plsql_cxt.package_as_line = GetLineNumber(t_thrd.postgres_cxt.debug_query_string, @6);
#ifndef ENABLE_MULTIPLE_NODES
@@ -11908,11 +12285,11 @@ invoker_rights: AUTHID DEFINER
}
|
{
- if (PLSQL_SECURITY_DEFINER) {
- $$ = true;
- } else {
- $$ = false;
- }
+ if (PLSQL_SECURITY_DEFINER && u_sess->attr.attr_common.upgrade_mode == 0) {
+ $$ = true;
+ } else {
+ $$ = false;
+ }
}
;
@@ -12040,10 +12417,6 @@ pkg_body_subprogram: {
if (toks->length < 2) {
parser_yyerror("package is not ended correctly");
}
- last_tok = list_nth_int(toks, toks->length - 2);
- if (last_tok != IDENT) {
- parser_yyerror("package is not ended correctly");
- }
// package name.
int name_start_pos = list_nth_int(positions, positions->length - 2);
@@ -12530,7 +12903,7 @@ createfunc_opt_item:
createproc_opt_item:
- common_func_opt_item
+ common_func_opt_item
{
$$ = $1;
}
@@ -13215,7 +13588,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
n->missing_ok = false;
$$ = (Node *)n;
}
- | ALTER DATA_P SOURCE_P name RENAME TO name
+ | ALTER DATA_P SOURCE_P name RENAME TO name
{
RenameStmt *n = makeNode(RenameStmt);
n->renameType = OBJECT_DATA_SOURCE;
@@ -14125,6 +14498,14 @@ AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId
n->newowner = $6;
$$ = (Node *)n;
}
+ | ALTER PACKAGE pkg_name OWNER TO RoleId
+ {
+ AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
+ n->objectType = OBJECT_PACKAGE;
+ n->object = $3;
+ n->newowner = $6;
+ $$ = (Node *)n;
+ }
| ALTER opt_procedural LANGUAGE name OWNER TO RoleId
{
AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
@@ -15764,7 +16145,7 @@ VacuumStmt:
if ($5)
{
const char* message = "COMPACT can not be used with PARTITION";
- InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc);
+ InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc);
ereport(errstate, (errcode(ERRCODE_SYNTAX_ERROR),
errmsg("COMPACT can not be used with PARTITION")));
}
@@ -15775,6 +16156,28 @@ VacuumStmt:
$6->partitionname = $9;
$$ = (Node *)n;
}
+ | VACUUM opt_full opt_freeze opt_verbose opt_compact qualified_name SUBPARTITION '('name')'
+ {
+ VacuumStmt *n = makeNode(VacuumStmt);
+ n->options = VACOPT_VACUUM;
+ if ($2)
+ n->options |= VACOPT_FULL;
+ if ($4)
+ n->options |= VACOPT_VERBOSE;
+ if ($5)
+ {
+ const char* message = "COMPACT can not be used with SUBPARTITION";
+ InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc);
+ ereport(errstate, (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("COMPACT can not be used with SUBPARTITION")));
+ }
+ n->freeze_min_age = $3 ? 0 : -1;
+ n->freeze_table_age = $3 ? 0 : -1;
+ n->relation = $6;
+ n->va_cols = NIL;
+ $6->subpartitionname = $9;
+ $$ = (Node *)n;
+ }
| VACUUM opt_full opt_freeze opt_verbose opt_compact AnalyzeStmt
{
VacuumStmt *n = (VacuumStmt *) $6;
@@ -15835,6 +16238,21 @@ VacuumStmt:
$5->partitionname = $9;
$$ = (Node *) n;
}
+ | VACUUM '(' vacuum_option_list ')' qualified_name opt_name_list SUBPARTITION '('name')'
+ {
+ VacuumStmt *n = makeNode(VacuumStmt);
+ n->options = VACOPT_VACUUM | $3;
+ if (n->options & VACOPT_FREEZE)
+ n->freeze_min_age = n->freeze_table_age = 0;
+ else
+ n->freeze_min_age = n->freeze_table_age = -1;
+ n->relation = $5;
+ n->va_cols = $6;
+ if (n->va_cols != NIL) /* implies analyze */
+ n->options |= VACOPT_ANALYZE;
+ $5->subpartitionname = $9;
+ $$ = (Node *) n;
+ }
;
vacuum_option_list:
@@ -17254,6 +17672,7 @@ CreateResourcePoolStmt: CREATE RESOURCE POOL resource_pool_name OptWith
}
;
+
/*****************************************************************************
*
* QUERY:
@@ -17275,6 +17694,14 @@ AlterResourcePoolStmt: ALTER RESOURCE POOL resource_pool_name OptWith
}
;
+AlterGlobalConfigStmt:ALTER GLOBAL CONFIGURATION OptWith
+ {
+ AlterGlobalConfigStmt *n = makeNode(AlterGlobalConfigStmt);
+ n->options = $4;
+ $$ = (Node *)n;
+ }
+ ;
+
/*****************************************************************************
*
* QUERY:
@@ -17301,6 +17728,13 @@ DropResourcePoolStmt: DROP RESOURCE POOL resource_pool_name
resource_pool_name:
ColId { $$ = $1; };
+DropGlobalConfigStmt:DROP GLOBAL CONFIGURATION name_list
+ {
+ DropGlobalConfigStmt *n = makeNode(DropGlobalConfigStmt);
+ n->options = $4;
+ $$ = (Node *)n;
+ }
+ ;
/*****************************************************************************
*
@@ -17784,6 +18218,50 @@ DeallocateStmt: DEALLOCATE name
}
;
+insert_partition_clause: update_delete_partition_clause
+ {
+#ifdef ENABLE_MULTIPLE_NODES
+ const char* message = "In distributed mode, insert/update/delete does not support specified partitions.";
+ InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc);
+ ereport(errstate,
+ (errmodule(MOD_PARSER),
+ errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("In distributed mode, insert/update/delete does not support specified partitions."),
+ errdetail("N/A"),errcause("Feature is not supported this operation."),
+ erraction("Contact engineer to support.")));
+#endif
+ $$ = $1;
+ }
+ | /* EMPTY */ { $$ = NULL; }
+ ;
+
+update_delete_partition_clause: PARTITION '(' name ')'
+ {
+ $$ = makeRangeVar(NULL, NULL, @3);
+ $$->partitionname = $3;
+ $$->ispartition = true;
+ }
+ | SUBPARTITION '(' name ')'
+ {
+ $$ = makeRangeVar(NULL, NULL, @3);
+ $$->subpartitionname = $3;
+ $$->issubpartition = true;
+ }
+ | PARTITION_FOR '(' expr_list ')'
+ {
+ $$ = makeRangeVar(NULL, NULL, @3);
+ $$->partitionKeyValuesList = $3;
+ $$->ispartition = true;
+ }
+ | SUBPARTITION_FOR '(' expr_list ')'
+ {
+ $$ = makeRangeVar(NULL, NULL, @3);
+ $$->partitionKeyValuesList = $3;
+ $$->issubpartition = true;
+ }
+ ;
+
+
/*****************************************************************************
*
* QUERY:
@@ -17791,7 +18269,7 @@ DeallocateStmt: DEALLOCATE name
*
*****************************************************************************/
-InsertStmt: opt_with_clause INSERT hint_string INTO qualified_name insert_rest returning_clause
+InsertStmt: opt_with_clause INSERT hint_string INTO insert_target insert_rest returning_clause
{
$6->relation = $5;
$6->returningList = $7;
@@ -17799,7 +18277,7 @@ InsertStmt: opt_with_clause INSERT hint_string INTO qualified_name insert_rest r
$6->hintState = create_hintstate($3);
$$ = (Node *) $6;
}
- | opt_with_clause INSERT hint_string INTO qualified_name insert_rest upsert_clause returning_clause
+ | opt_with_clause INSERT hint_string INTO insert_target insert_rest upsert_clause returning_clause
{
if ($8 != NIL) {
const char* message = "RETURNING clause is not yet supported whithin INSERT ON DUPLICATE KEY UPDATE statement.";
@@ -17843,6 +18321,7 @@ InsertStmt: opt_with_clause INSERT hint_string INTO qualified_name insert_rest r
}
}
+
MergeStmt *m = makeNode(MergeStmt);
m->is_insert_update = true;
@@ -17898,6 +18377,40 @@ InsertStmt: opt_with_clause INSERT hint_string INTO qualified_name insert_rest r
}
;
+/*
+ * It is difficult to use relation_expr_opt_alias as update or delete statement,
+ * because VALUES in insert_rest would have a shift/reduce conflict with VALUES
+ * as alias if as is optional.
+ * We tried to fix such conflict by adding noassoc/left priority to VALUES, but
+ * it will make delete statement with VALUES as alias name unable to be resolved.
+ * So AS is required for now.
+ */
+insert_target:
+ qualified_name insert_partition_clause
+ {
+ if ($2 != NULL) {
+ $1->partitionname = $2->partitionname;
+ $1->ispartition = $2->ispartition;
+ $1->partitionKeyValuesList = $2->partitionKeyValuesList;
+ $1->subpartitionname = $2->subpartitionname;
+ $1->issubpartition = $2->issubpartition;
+ }
+ $$ = $1;
+ }
+ | qualified_name insert_partition_clause AS ColId
+ {
+ if ($2 != NULL) {
+ $1->partitionname = $2->partitionname;
+ $1->ispartition = $2->ispartition;
+ $1->partitionKeyValuesList = $2->partitionKeyValuesList;
+ $1->subpartitionname = $2->subpartitionname;
+ $1->issubpartition = $2->issubpartition;
+ }
+ $1->alias = makeAlias($4, NIL);
+ $$ = $1;
+ }
+ ;
+
insert_rest:
SelectStmt
{
@@ -17946,7 +18459,7 @@ returning_clause:
;
upsert_clause:
- ON DUPLICATE KEY UPDATE set_clause_list
+ ON DUPLICATE KEY UPDATE set_clause_list where_clause
{
if (u_sess->attr.attr_sql.enable_upsert_to_merge
#ifdef ENABLE_MULTIPLE_NODES
@@ -17970,14 +18483,16 @@ upsert_clause:
InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc);
ereport(errstate,
(errmodule(MOD_PARSER),
- errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("Update with subquery is not yet supported whithin INSERT ON DUPLICATE KEY UPDATE statement.")));
+ errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("Update with subquery is not yet supported whithin INSERT ON DUPLICATE KEY UPDATE statement.")));
}
}
#endif
+
UpsertClause *uc = makeNode(UpsertClause);
uc->targetList = $5;
uc->location = @1;
+ uc->whereClause = $6;
$$ = (Node *) uc;
}
}
@@ -18043,13 +18558,14 @@ using_clause:
*
*****************************************************************************/
-LockStmt: LOCK_P opt_table relation_expr_list opt_lock opt_nowait
+LockStmt: LOCK_P opt_table relation_expr_list opt_lock opt_nowait opt_cancelable
{
LockStmt *n = makeNode(LockStmt);
n->relations = $3;
n->mode = $4;
n->nowait = $5;
+ n->cancelable = $6;
$$ = (Node *)n;
}
;
@@ -18072,6 +18588,12 @@ opt_nowait: NOWAIT { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
+opt_cancelable: CANCELABLE { $$ = TRUE; }
+ | /*EMPTY*/ { $$ = FALSE; }
+ ;
+
+opt_wait: WAIT Iconst { $$ = $2; }
+ ;
/*****************************************************************************
*
@@ -18983,41 +19505,41 @@ having_clause:
;
start_with_clause:
- START WITH start_with_expr connect_by_expr
+ START_WITH start_with_expr connect_by_expr
{
StartWithClause *n = makeNode(StartWithClause);
- n->startWithExpr = $3;
- n->connectByExpr = $4;
+ n->startWithExpr = $2;
+ n->connectByExpr = $3;
n->siblingsOrderBy = NULL;
n->priorDirection = false;
n->nocycle = false;
$$ = (Node *) n;
}
- | START WITH start_with_expr CONNECT BY NOCYCLE a_expr
+ | START_WITH start_with_expr CONNECT_BY NOCYCLE a_expr
{
StartWithClause *n = makeNode(StartWithClause);
- n->startWithExpr = $3;
- n->connectByExpr = $7;
+ n->startWithExpr = $2;
+ n->connectByExpr = $5;
n->siblingsOrderBy = NULL;
n->priorDirection = false;
n->nocycle = true;
$$ = (Node *) n;
}
- | connect_by_expr START WITH start_with_expr
+ | connect_by_expr START_WITH start_with_expr
{
StartWithClause *n = makeNode(StartWithClause);
- n->startWithExpr = $4;
+ n->startWithExpr = $3;
n->connectByExpr = $1;
n->siblingsOrderBy = NULL;
n->priorDirection = false;
n->nocycle = false;
$$ = (Node *) n;
}
- | CONNECT BY NOCYCLE a_expr START WITH start_with_expr
+ | CONNECT_BY NOCYCLE a_expr START_WITH start_with_expr
{
StartWithClause *n = makeNode(StartWithClause);
- n->startWithExpr = $7;
- n->connectByExpr = $4;
+ n->startWithExpr = $5;
+ n->connectByExpr = $3;
n->siblingsOrderBy = NULL;
n->priorDirection = false;
n->nocycle = true;
@@ -19038,7 +19560,7 @@ start_with_expr:
;
connect_by_expr:
- CONNECT BY a_expr
+ CONNECT_BY a_expr
{
#ifdef ENABLE_MULTIPLE_NODES
const char* message = "START WITH CONNECT BY is not yet supported.";
@@ -19046,7 +19568,7 @@ connect_by_expr:
ereport(errstate, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("START WITH CONNECT BY is not yet supported.")));
#endif
- $$ = $3;
+ $$ = $2;
}
;
@@ -19073,6 +19595,22 @@ for_locking_item:
n->forUpdate = TRUE;
n->strength = LCS_FORUPDATE;
n->noWait = $5;
+ n->waitSec = 0;
+ $$ = (Node *) n;
+ }
+ | FOR UPDATE hint_string locked_rels_list opt_wait
+ {
+ LockingClause *n = makeNode(LockingClause);
+ n->lockedRels = $4;
+ n->forUpdate = TRUE;
+ n->strength = LCS_FORUPDATE;
+ n->waitSec = $5;
+ /* When the delay time is 0, the processing is based on the nowait logic. */
+ if (n->waitSec == 0) {
+ n->noWait = true;
+ } else {
+ n->noWait = false;
+ }
$$ = (Node *) n;
}
| for_locking_strength locked_rels_list opt_nowait
@@ -19085,6 +19623,7 @@ for_locking_item:
n->forUpdate = true;
}
n->noWait = $3;
+ n->waitSec = 0;
$$ = (Node *) n;
}
;
@@ -19174,7 +19713,7 @@ table_ref: relation_expr
if (catlist->n_members == 0 && rel == NULL) {
char message[MAXFNAMELEN];
int rc = sprintf_s(message, MAXFNAMELEN, "relation \"%s\" does not exist", r->relname);
- securec_check_ss_c(rc, "", "");
+ securec_check_ss(rc, "", "");
ReleaseSysCacheList(catlist);
InsertErrorMessage(message, u_sess->plsql_cxt.plpgsql_yylloc, true);
ereport(ERROR,
@@ -19237,13 +19776,18 @@ table_ref: relation_expr
$1->isbucket = true;
$$ = (Node *)$1;
}
- | relation_expr PARTITION_FOR '(' maxValueList ')'
+ | relation_expr PARTITION_FOR '(' expr_list ')'
{
$1->partitionKeyValuesList = $4;
$1->ispartition = true;
$$ = (Node *)$1;
}
-
+ | relation_expr SUBPARTITION_FOR '(' expr_list ')'
+ {
+ $1->partitionKeyValuesList = $4;
+ $1->issubpartition = true;
+ $$ = (Node *)$1;
+ }
| relation_expr PARTITION '(' name ')' alias_clause
{
$1->partitionname = $4;
@@ -19251,24 +19795,27 @@ table_ref: relation_expr
$1->ispartition = true;
$$ = (Node *)$1;
}
-
- | relation_expr SUBPARTITION '(' name ')' alias_clause
- {
- $1->subpartitionname = $4;
- $1->alias = $6;
- $1->issubpartition = true;
- $$ = (Node *)$1;
- }
-
-
- | relation_expr PARTITION_FOR '(' maxValueList ')' alias_clause
+ | relation_expr SUBPARTITION '(' name ')' alias_clause
+ {
+ $1->subpartitionname = $4;
+ $1->alias = $6;
+ $1->issubpartition = true;
+ $$ = (Node *)$1;
+ }
+ | relation_expr PARTITION_FOR '(' expr_list ')' alias_clause
{
$1->partitionKeyValuesList = $4;
$1->alias = $6;
$1->ispartition = true;
$$ = (Node *)$1;
}
-
+ | relation_expr SUBPARTITION_FOR '(' expr_list ')' alias_clause
+ {
+ $1->partitionKeyValuesList = $4;
+ $1->alias = $6;
+ $1->issubpartition = true;
+ $$ = (Node *)$1;
+ }
| func_table
{
RangeFunction *n = makeNode(RangeFunction);
@@ -19582,6 +20129,45 @@ relation_expr_opt_alias: relation_expr %prec UMINUS
$1->alias = alias;
$$ = $1;
}
+ | relation_expr update_delete_partition_clause %prec UMINUS
+ {
+ if ($2 != NULL) {
+ $1->partitionname = $2->partitionname;
+ $1->ispartition = $2->ispartition;
+ $1->partitionKeyValuesList = $2->partitionKeyValuesList;
+ $1->subpartitionname = $2->subpartitionname;
+ $1->issubpartition = $2->issubpartition;
+ }
+ $$ = $1;
+ }
+ | relation_expr update_delete_partition_clause ColId
+ {
+ if ($2 != NULL) {
+ $1->partitionname = $2->partitionname;
+ $1->ispartition = $2->ispartition;
+ $1->partitionKeyValuesList = $2->partitionKeyValuesList;
+ $1->subpartitionname = $2->subpartitionname;
+ $1->issubpartition = $2->issubpartition;
+ }
+ Alias *alias = makeNode(Alias);
+ alias->aliasname = $3;
+ $1->alias = alias;
+ $$ = $1;
+ }
+ | relation_expr update_delete_partition_clause AS ColId
+ {
+ if ($2 != NULL) {
+ $1->partitionname = $2->partitionname;
+ $1->ispartition = $2->ispartition;
+ $1->partitionKeyValuesList = $2->partitionKeyValuesList;
+ $1->subpartitionname = $2->subpartitionname;
+ $1->issubpartition = $2->issubpartition;
+ }
+ Alias *alias = makeNode(Alias);
+ alias->aliasname = $4;
+ $1->alias = alias;
+ $$ = $1;
+ }
;
/*
@@ -20085,7 +20671,7 @@ character: CHARACTER opt_varying
| CHAR_P opt_varying
{ $$ = (char *)($2 ? "varchar": "bpchar"); }
| NVARCHAR
- { $$ = "nvarchar2"; }
+ { $$ = "nvarchar2"; }
| NVARCHAR2
{ $$ = "nvarchar2"; }
| VARCHAR
@@ -20340,6 +20926,13 @@ client_logic_type:
* it's factored out just to eliminate redundant coding.
*/
a_expr: c_expr { $$ = $1; }
+ | PRIOR '(' a_expr ')'
+ {
+ List *argList = list_make1($3);
+ FuncCall *funcNode = MakePriorAsFunc();
+ funcNode->args = argList;
+ $$ = (Node *)funcNode;
+ }
| a_expr TYPECAST Typename
{ $$ = makeTypeCast($1, $3, @2); }
| a_expr COLLATE any_name
@@ -20897,17 +21490,20 @@ b_expr: c_expr
* inside parentheses, such as function arguments; that cannot introduce
* ambiguity to the b_expr syntax.
*/
-c_expr: columnref { $$ = $1; }
+c_expr: columnref %prec UMINUS { $$ = $1; }
| AexprConst { $$ = $1; }
- | PRIOR '(' c_expr ')'
+ | PRIOR '(' columnref ')'
{
- Node* n = $3;
- AssertEreport(IsA(n, ColumnRef),
- MOD_OPT,
- "Inconsistent expression after PRIOR");
- ColumnRef *col = (ColumnRef *)$3;
- col->prior = true;
- $$ = n;
+ ColumnRef *col = (ColumnRef *)$3;
+ col->prior = true;
+ $$ = (Node *)col;
+ }
+ | PRIOR '(' c_expr ',' func_arg_list ')'
+ {
+ List* argList = list_concat(list_make1($3), $5);
+ FuncCall* funcNode = MakePriorAsFunc();
+ funcNode->args = argList;
+ $$ = (Node *)funcNode;
}
| PRIOR columnref
{
@@ -22802,6 +23398,15 @@ target_el: a_expr AS ColLabel
$$->indirection = NIL;
$$->val = (Node *)$1;
$$->location = @1;
+
+ ColumnRef* cr = (ColumnRef*) $1;
+ /* PRIOR(x) in target list implies func call */
+ if (IsA($1, ColumnRef) && cr->prior) {
+ FuncCall *fn = MakePriorAsFunc();
+ cr->prior = false;
+ fn->args = list_make1(cr);
+ $$->val = (Node *)fn;
+ }
}
| '*'
{
@@ -23206,6 +23811,7 @@ unreserved_keyword:
| CACHE
| CALL
| CALLED
+ | CANCELABLE
| CASCADE
| CASCADED
| CATALOG_P
@@ -23232,6 +23838,7 @@ unreserved_keyword:
| COMPRESS
| CONDITION
| CONFIGURATION
+ | CONNECT
| CONNECTION
| CONSTANT
| CONSTRAINTS
@@ -23427,6 +24034,7 @@ unreserved_keyword:
| OWNED
| OWNER
| PACKAGE
+ | PACKAGES
| PARSER
| PARTIAL %prec PARTIAL_EMPTY_PREC
| PARTITION
@@ -23450,6 +24058,7 @@ unreserved_keyword:
| PREPARE
| PREPARED
| PRESERVE
+ | PRIOR
| PRIVATE
| PRIVILEGE
| PRIVILEGES
@@ -23517,6 +24126,7 @@ unreserved_keyword:
| SHIPPABLE
| SHOW
| SHUTDOWN
+ | SIBLINGS
| SIMPLE
| SIZE
| SKIP
@@ -23529,6 +24139,7 @@ unreserved_keyword:
| SPLIT
| STABLE
| STANDALONE_P
+ | START
| STATEMENT
| STATEMENT_ID
| STATISTICS
@@ -23591,6 +24202,7 @@ unreserved_keyword:
| VERSION_P
| VIEW
| VOLATILE
+ | WAIT
| WEAK
| WHITESPACE_P
| WITHIN
@@ -23746,7 +24358,6 @@ reserved_keyword:
| COLLATE
| COLUMN
| CONSTRAINT
- | CONNECT
| CREATE
| CURRENT_CATALOG
| CURRENT_DATE
@@ -23796,7 +24407,6 @@ reserved_keyword:
| PERFORMANCE
| PLACING
| PRIMARY
- | PRIOR
| PROCEDURE
| REFERENCES
| REJECT_P
@@ -23804,9 +24414,7 @@ reserved_keyword:
| ROWNUM
| SELECT
| SESSION_USER
- | SIBLINGS
| SOME
- | START
| SYMMETRIC
| SYSDATE
| TABLE
@@ -24173,17 +24781,26 @@ check_indirection(List *indirection, core_yyscan_t yyscanner)
static List *
extractArgTypes(List *parameters)
{
- List *result = NIL;
- ListCell *i;
+ List *result = NIL;
+ ListCell *i;
- foreach(i, parameters)
- {
- FunctionParameter *p = (FunctionParameter *) lfirst(i);
-
- if (p->mode != FUNC_PARAM_OUT && p->mode != FUNC_PARAM_TABLE)
- result = lappend(result, p->argType);
- }
- return result;
+ foreach(i, parameters)
+ {
+ FunctionParameter *p = (FunctionParameter *) lfirst(i);
+#ifndef ENABLE_MULTIPLE_NODES
+ if ((p->mode == FUNC_PARAM_OUT && enable_out_param_override())
+ || p->mode == FUNC_PARAM_IN
+ || p->mode == FUNC_PARAM_INOUT
+ || p->mode == FUNC_PARAM_VARIADIC) {
+#else
+ if (p->mode == FUNC_PARAM_IN
+ || p->mode == FUNC_PARAM_INOUT
+ || p->mode == FUNC_PARAM_VARIADIC) {
+#endif
+ result = lappend(result, p->argType);
+ }
+ }
+ return result;
}
/* insertSelectOptions()
@@ -25795,6 +26412,21 @@ static void RemoveFillerCol(List *filler_list, List *col_list)
return;
}
+static FuncCall* MakePriorAsFunc()
+{
+ List *funcName = list_make1(makeString("prior"));
+ FuncCall *n = makeNode(FuncCall);
+ n->funcname = funcName;
+ n->args = NIL;
+ n->agg_order = NIL;
+ n->agg_star = FALSE;
+ n->agg_distinct = FALSE;
+ n->func_variadic = FALSE;
+ n->over = NULL;
+ n->call_func = false;
+ return n;
+}
+
/*
* Must undefine this stuff before including scan.c, since it has different
* definitions for these macros.
@@ -25804,4 +26436,5 @@ static void RemoveFillerCol(List *filler_list, List *col_list)
#undef yylloc
#undef yylex
+#undef yylex
#include "scan.inc"
diff --git a/src/common/backend/parser/hint_gram.y b/src/common/backend/parser/hint_gram.y
index 2ef455612..d23662c1d 100755
--- a/src/common/backend/parser/hint_gram.y
+++ b/src/common/backend/parser/hint_gram.y
@@ -51,15 +51,16 @@ static double convert_to_numeric(Node *value);
%type join_hint_item join_order_hint join_method_hint stream_hint row_hint scan_hint skew_hint expr_const
- pred_push_hint rewrite_hint gather_hint set_hint plancache_hint guc_value no_expand_hint no_gpc_hint
+ pred_push_hint pred_push_same_level_hint rewrite_hint gather_hint set_hint plancache_hint guc_value no_expand_hint
+ no_gpc_hint
%type relation_list join_hint_list relation_item relation_list_with_p ident_list skew_relist
column_list_p column_list value_list_p value_list value_list_item value_type value_list_with_bracket
%token IDENT FCONST SCONST BCONST XCONST
%token ICONST
%token NestLoop_P MergeJoin_P HashJoin_P No_P Leading_P Rows_P Broadcast_P Redistribute_P BlockName_P
- TableScan_P IndexScan_P IndexOnlyScan_P Skew_P HINT_MULTI_NODE_P NULL_P TRUE_P FALSE_P Predpush_P Rewrite_P
- Gather_P Set_P USE_CPLAN_P USE_GPLAN_P ON_P OFF_P No_expand_P NO_GPC_P
+ TableScan_P IndexScan_P IndexOnlyScan_P Skew_P HINT_MULTI_NODE_P NULL_P TRUE_P FALSE_P Predpush_P
+ PredpushSameLevel_P Rewrite_P Gather_P Set_P USE_CPLAN_P USE_GPLAN_P ON_P OFF_P No_expand_P NO_GPC_P
%nonassoc IDENT NULL_P
@@ -131,6 +132,10 @@ join_hint_item:
$$ = (Node *) multi_node_hint;
}
| pred_push_hint
+ {
+ $$ = $1;
+ }
+ | pred_push_same_level_hint
{
$$ = $1;
}
@@ -305,6 +310,20 @@ pred_push_hint:
$$ = (Node *) predpushHint;
}
+pred_push_same_level_hint:
+ PredpushSameLevel_P '(' ident_list ',' IDENT ')'
+ {
+ PredpushSameLevelHint *predpushSameLevelHint = makeNode(PredpushSameLevelHint);
+ predpushSameLevelHint->base.relnames = $3;
+ predpushSameLevelHint->base.hint_keyword = HINT_KEYWORD_PREDPUSH_SAME_LEVEL;
+ predpushSameLevelHint->base.state = HINT_STATE_NOTUSED;
+ predpushSameLevelHint->dest_name = $5;
+ predpushSameLevelHint->dest_id = 0;
+ predpushSameLevelHint->candidates = NULL;
+ predpushSameLevelHint->negative = false;
+ $$ = (Node *) predpushSameLevelHint;
+ }
+
join_order_hint:
Leading_P '(' relation_list_with_p ')'
{
diff --git a/src/common/backend/parser/hint_scan.l b/src/common/backend/parser/hint_scan.l
index 2c38083e9..efe2e80fb 100755
--- a/src/common/backend/parser/hint_scan.l
+++ b/src/common/backend/parser/hint_scan.l
@@ -41,6 +41,7 @@ static const hintKeyword parsers[] =
{HINT_TRUE, TRUE_P},
{HINT_FALSE, FALSE_P},
{HINT_PRED_PUSH, Predpush_P},
+ {HINT_PRED_PUSH_SAME_LEVEL, PredpushSameLevel_P},
{HINT_REWRITE, Rewrite_P},
{HINT_GATHER, Gather_P},
{HINT_SET, Set_P},
diff --git a/src/common/backend/parser/parse_clause.cpp b/src/common/backend/parser/parse_clause.cpp
index 5e60326fb..76fd8f9e5 100644
--- a/src/common/backend/parser/parse_clause.cpp
+++ b/src/common/backend/parser/parse_clause.cpp
@@ -46,6 +46,7 @@
#include "storage/tcap.h"
#include "utils/guc.h"
#include "utils/lsyscache.h"
+#include "utils/partitionkey.h"
#include "utils/rel.h"
#include "utils/rel_gs.h"
#include "utils/syscache.h"
@@ -219,6 +220,19 @@ int setTargetTable(ParseState* pstate, RangeVar* relation, bool inh, bool alsoSo
* Now build an RTE.
*/
rte = addRangeTableEntryForRelation(pstate, pstate->p_target_relation, relation->alias, inh, false);
+
+ /* IUD contain partition. */
+ if (relation->ispartition) {
+ rte->isContainPartition = true;
+ rte->partitionOid = getPartitionOidForRTE(rte, relation, pstate, pstate->p_target_relation);
+ }
+ /* IUD contain subpartition. */
+ if (relation->issubpartition) {
+ rte->isContainSubPartition = true;
+ rte->subpartitionOid =
+ GetSubPartitionOidForRTE(rte, relation, pstate, pstate->p_target_relation, &rte->partitionOid);
+ }
+
pstate->p_target_rangetblentry = rte;
/* assume new rte is at end */
diff --git a/src/common/backend/parser/parse_compatibility.cpp b/src/common/backend/parser/parse_compatibility.cpp
index 31f2f5bf9..f51ba92f3 100644
--- a/src/common/backend/parser/parse_compatibility.cpp
+++ b/src/common/backend/parser/parse_compatibility.cpp
@@ -143,7 +143,11 @@ static void insert_jointerm(OperatorPlusProcessContext* ctx, Expr* expr, RangeTb
ListCell* lc = NULL;
JoinTerm* jterm = NULL;
+#ifdef ENABLE_MULTIPLE_NODES
+ Assert(IsA(expr, A_Expr));
+#else
Assert(IsA(expr, A_Expr) || IsA(expr, NullTest));
+#endif
/* lrte is the RTE with operator "(+)", it couldn't be NULL */
Assert(lrte != NULL);
@@ -567,8 +571,13 @@ bool plus_outerjoin_precheck(const OperatorPlusProcessContext* ctx, Node* expr,
return false;
}
+#ifdef ENABLE_MULTIPLE_NODES
+ /* Only support A_Expr with "(+)" for now */
+ if (list_length(lhasplus) && !IsA(expr, A_Expr)) {
+#else
/* Only support A_Expr and NullTest with "(+)" for now */
if (list_length(lhasplus) && !IsA(expr, A_Expr) && !IsA(expr, NullTest)) {
+#endif
ereport(
ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("Operator \"(+)\" can only be used in common expression.")));
}
diff --git a/src/common/backend/parser/parse_expr.cpp b/src/common/backend/parser/parse_expr.cpp
index 7b77c3343..00589084f 100644
--- a/src/common/backend/parser/parse_expr.cpp
+++ b/src/common/backend/parser/parse_expr.cpp
@@ -5,6 +5,7 @@
*
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
+ * Portions Copyright (c) 2021, openGauss Contributors
*
*
* IDENTIFICATION
@@ -693,6 +694,10 @@ Node* transformColumnRef(ParseState* pstate, ColumnRef* cref)
return node;
}
}
+ if (pstate->p_bind_describe_hook != NULL) {
+ node = (*pstate->p_bind_describe_hook)(pstate, cref);
+ return node;
+ }
}
}
break;
@@ -977,7 +982,7 @@ static bool isCol2Function(List* fields)
catlist = SearchSysCacheList1(PROCNAMEARGSNSP, CStringGetDatum(funcname));
#endif
for (int i = 0; i < catlist->n_members; i++) {
- HeapTuple proctup = &catlist->members[i]->tuple;
+ HeapTuple proctup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_proc procform = (Form_pg_proc)GETSTRUCT(proctup);
/* get function all args */
Oid *p_argtypes = NULL;
@@ -1412,15 +1417,18 @@ static bool NeedExtractOutParam(FuncCall* fn, Node* result)
* When proc_outparam_override is on, extract all but select func
*/
FuncExpr* funcexpr = (FuncExpr*)result;
+ if (is_function_with_plpgsql_language_and_outparam(funcexpr->funcid) && !fn->call_func) {
+ return true;
+ }
char prokind = get_func_prokind(funcexpr->funcid);
if (!PROC_IS_PRO(prokind) && !fn->call_func) {
return false;
}
-
- if (enable_out_param_override()) {
- return true;
- }
+#ifndef ENABLE_MULTIPLE_NODES
+ return enable_out_param_override();
+#else
return false;
+#endif
}
static Node* transformFuncCall(ParseState* pstate, FuncCall* fn)
@@ -2267,8 +2275,8 @@ static Node* transformCurrentOfExpr(ParseState* pstate, CurrentOfExpr* cexpr)
}
// Locate in the system catalog the information for a model name
-static char* select_prediction_function(Model* model){
-
+static char* select_prediction_function(const Model* model){
+
char* result;
switch(model->return_type){
case BOOLOID:
@@ -2280,6 +2288,9 @@ static char* select_prediction_function(Model* model){
case FLOAT8OID:
result = "db4ai_predict_by_float8";
break;
+ case FLOAT8ARRAYOID:
+ result = "db4ai_predict_by_float8_array";
+ break;
case INT1OID:
case INT2OID:
case INT4OID:
@@ -2300,7 +2311,7 @@ static char* select_prediction_function(Model* model){
default:
ereport(ERROR, (errmodule(MOD_DB4AI), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("Cannot trigger prediction for model with oid %d", model->return_type)));
+ errmsg("Cannot trigger prediction for model with oid %u", model->return_type)));
result = NULL;
break;
}
@@ -2321,7 +2332,7 @@ static Node* transformPredictByFunction(ParseState* pstate, PredictByFunction* p
errmsg("Model name for prediction cannot be null")));
}
- Model* model = get_model(p->model_name, true);
+ const Model* model = get_model(p->model_name, true);
if (model == NULL) {
ereport(ERROR, (errmsg(
"No model found with name %s", p->model_name)));
diff --git a/src/common/backend/parser/parse_func.cpp b/src/common/backend/parser/parse_func.cpp
index 73de82e59..b2c595164 100644
--- a/src/common/backend/parser/parse_func.cpp
+++ b/src/common/backend/parser/parse_func.cpp
@@ -1398,33 +1398,67 @@ FuncCandidateList func_select_candidate(int nargs, Oid* input_typeids, FuncCandi
if (ncandidates == 1)
return candidates;
-#ifndef ENABLE_MULTIPLE_NODES
- Oid caller_pkg_oid = InvalidOid;
- if (u_sess->plsql_cxt.curr_compile_context != NULL &&
- u_sess->plsql_cxt.curr_compile_context->plpgsql_curr_compile_package != NULL) {
- caller_pkg_oid = u_sess->plsql_cxt.curr_compile_context->plpgsql_curr_compile_package->pkg_oid;
- } else {
- caller_pkg_oid = u_sess->plsql_cxt.running_pkg_oid;
- }
- nbestMatch = 0;
- ncandidates = 0;
- last_candidate = NULL;
- for (current_candidate = candidates; current_candidate != NULL; current_candidate = current_candidate->next) {
- nmatch = 0;
- if (current_candidate->packageOid == caller_pkg_oid) {
- nmatch++;
- }
- keep_candidate(nmatch, nbestMatch, current_candidate, last_candidate, candidates, ncandidates);
- }
- if (last_candidate) /* terminate rebuilt list */
- last_candidate->next = NULL;
- if (ncandidates == 1)
- return candidates;
-#endif
return NULL; /* failed to select a best candidate */
} /* func_select_candidate() */
+
+/*
+ * sort_candidate_func_list
+ *
+ * sort the candidate functions by function's all param num.
+ */
+FuncCandidateList sort_candidate_func_list(FuncCandidateList oldCandidates)
+{
+ if (oldCandidates == NULL || oldCandidates->next == NULL) {
+ return oldCandidates;
+ }
+
+ FuncCandidateList cur = oldCandidates;
+ int size = 0;
+ while (cur) {
+ size++;
+ cur = cur->next;
+ }
+
+ cur = oldCandidates;
+ FuncCandidateList* candidates = (FuncCandidateList*)palloc0(sizeof(FuncCandidateList) * size);
+ int index = 0;
+ while (cur) {
+ candidates[index++] = cur;
+ cur = cur->next;
+ }
+
+ FuncCandidateList sortedCandidates = NULL;
+ FuncCandidateList lastCandidate = NULL;
+ for (int i = 0; i < size; i++) {
+ if (candidates[i] == NULL) {
+ continue;
+ }
+ int smallestIndex = i;
+ for (int j = 0; j < size; j++) {
+ FuncCandidateList cur2 = candidates[j];
+ if (cur2 != NULL && candidates[smallestIndex]->allArgNum > cur2->allArgNum) {
+ smallestIndex = j;
+ }
+ }
+
+ FuncCandidateList smallest = candidates[smallestIndex];
+ if (lastCandidate == NULL) {
+ lastCandidate = smallest;
+ sortedCandidates = smallest;
+ } else {
+ lastCandidate->next = smallest;
+ lastCandidate = lastCandidate->next;
+ smallest->next = NULL;
+ }
+ candidates[smallestIndex] = NULL;
+ }
+
+ pfree(candidates);
+ return sortedCandidates;
+}
+
/* func_get_detail()
*
* Find the named function in the system catalogs.
@@ -1510,6 +1544,8 @@ FuncDetailCode func_get_detail(List* funcname, List* fargs, List* fargnames, int
}
}
}
+
+ raw_candidates = sort_candidate_func_list(raw_candidates);
#else
/* Get list of possible candidates from namespace search */
raw_candidates = FuncnameGetCandidates(funcname, nargs, fargnames, expand_variadic, expand_defaults, false);
@@ -1533,6 +1569,7 @@ FuncDetailCode func_get_detail(List* funcname, List* fargs, List* fargnames, int
}
#endif
+
/*
* Quickly check if there is an exact match to the input datatypes (there
* can be only one)
@@ -1969,7 +2006,7 @@ Oid LookupFuncName(List* funcname, int nargs, const Oid* argtypes, bool noError)
clist->args[i] = cl_get_input_param_original_type(clist->oid, i);
}
}
- if (memcmp(argtypes, clist->args, nargs * sizeof(Oid)) == 0)
+ if (memcmp(argtypes, clist->args, nargs * sizeof(Oid)) == 0 && OidIsValid(clist->oid))
return clist->oid;
clist = clist->next;
}
diff --git a/src/common/backend/parser/parse_hint.cpp b/src/common/backend/parser/parse_hint.cpp
index f33cc4927..a531309d7 100755
--- a/src/common/backend/parser/parse_hint.cpp
+++ b/src/common/backend/parser/parse_hint.cpp
@@ -92,6 +92,7 @@ static void drop_duplicate_gather_hint(PlannerInfo* root, HintState* hstate);
static void drop_duplicate_scan_hint(PlannerInfo* root, HintState* hstate);
static void drop_duplicate_skew_hint(PlannerInfo* root, HintState* hstate);
static void drop_duplicate_predpush_hint(PlannerInfo* root, HintState* hstate);
+static void drop_duplicate_predpush_same_level_hint(PlannerInfo* root, HintState* hstate);
static int find_relid_aliasname(Query* parse, const char* aliasname, bool find_in_rtable = false);
static Relids create_bms_of_relids(
PlannerInfo* root, Query* parse, Hint* hint, List* relnamelist = NIL, Relids currelids = NULL);
@@ -184,8 +185,8 @@ static void append_value(StringInfo buf, Value* value, Node* node)
}
}
-#define HINT_NUM 15
-#define HINT_KEYWORD_NUM 20
+#define HINT_NUM 16
+#define HINT_KEYWORD_NUM 21
typedef struct {
HintKeyword keyword;
@@ -206,6 +207,7 @@ const char* G_HINT_KEYWORD[HINT_KEYWORD_NUM] = {
(char*) HINT_INDEXONLYSCAN,
(char*) HINT_SKEW,
(char*) HINT_PRED_PUSH,
+ (char*) HINT_PRED_PUSH_SAME_LEVEL,
(char*) HINT_REWRITE,
(char*) HINT_GATHER,
(char*) HINT_NO_EXPAND,
@@ -298,6 +300,32 @@ Relids predpush_candidates_same_level(PlannerInfo *root)
return result;
}
+/*
+ * is_predpush_same_level_matched
+ * Check if the predpush samwe level is matched.
+ * @param predpush same level hint, relids from baserel, param path info.
+ * @param check_dest: don't check dest id when create paths.
+ * @return true if matched.
+ */
+bool is_predpush_same_level_matched(PredpushSameLevelHint* hint, Relids relids, ParamPathInfo* ppi)
+{
+ if (ppi == NULL) {
+ return false;
+ }
+ if (hint->dest_id == 0 || hint->candidates == NULL) {
+ return false;
+ }
+
+ if (!bms_is_member(hint->dest_id, relids)) {
+ return false;
+ }
+
+ if (!bms_equal(ppi->ppi_req_outer, hint->candidates)) {
+ return false;
+ }
+ return true;
+}
+
/*
* @Description: get the prompts for no_gpc hint into subquery.
* @in hint: subquery no_gpc hint.
@@ -380,6 +408,35 @@ static void PredpushHintDesc(PredpushHint* hint, StringInfo buf)
appendStringInfoString(buf, ")");
}
+/*
+ * @Description: get the prompts for predicate pushdown same level.
+ * @in hint: predicate pushdown same level hint.
+ * @out buf: String buf.
+ */
+static void PredpushSameLevelHintDesc(PredpushSameLevelHint* hint, StringInfo buf)
+{
+ Hint base_hint = hint->base;
+
+ Assert(buf != NULL);
+
+ appendStringInfo(buf, " %s(", KeywordDesc(hint->base.hint_keyword));
+
+ if (hint->candidates != NULL) {
+ appendStringInfo(buf, "(");
+ }
+
+ relnamesToBuf(base_hint.relnames, buf);
+ if (hint->dest_name != NULL) {
+ appendStringInfo(buf, ", %s", hint->dest_name);
+ }
+
+ if (hint->candidates != NULL) {
+ appendStringInfo(buf, ")");
+ }
+
+ appendStringInfoString(buf, ")");
+}
+
/*
* @Description: get the prompts for rewrite hint into subquery.
* @in hint: rewrite hint.
@@ -712,6 +769,9 @@ char* descHint(Hint* hint)
case T_PredpushHint:
PredpushHintDesc((PredpushHint*)hint, &str);
break;
+ case T_PredpushSameLevelHint:
+ PredpushSameLevelHintDesc((PredpushSameLevelHint*)hint, &str);
+ break;
case T_RewriteHint:
RewriteHintDesc((RewriteHint*)hint, &str);
break;
@@ -775,6 +835,7 @@ void desc_hint_in_state(PlannerInfo* root, HintState* hstate)
find_unused_hint_to_buf(hstate->block_name_hint, &str_buf);
find_unused_hint_to_buf(hstate->set_hint, &str_buf);
find_unused_hint_to_buf(hstate->no_gpc_hint, &str_buf);
+ find_unused_hint_to_buf(hstate->predpush_same_level_hint, &str_buf);
/* for skew hint */
ListCell* lc = NULL;
@@ -810,6 +871,21 @@ static void PredpushHintDelete(PredpushHint* hint)
pfree_ext(hint);
}
+/*
+ * @Description: Delete predicate pushdown same level, free memory.
+ * @in hint: predicate pushdown same level hint.
+ */
+static void PredpushSameLevelHintDelete(PredpushSameLevelHint* hint)
+{
+ if (hint == NULL)
+ return;
+
+ HINT_FREE_RELNAMES(hint);
+
+ bms_free(hint->candidates);
+ pfree_ext(hint);
+}
+
/*
* @Description: Delete join method hint, free memory.
* @in hint: Join hint.
@@ -1023,6 +1099,9 @@ void hintDelete(Hint* hint)
case T_PredpushHint:
PredpushHintDelete((PredpushHint*)hint);
break;
+ case T_PredpushSameLevelHint:
+ PredpushSameLevelHintDelete((PredpushSameLevelHint*)hint);
+ break;
case T_RewriteHint:
RewriteHintDelete((RewriteHint*)hint);
break;
@@ -1095,6 +1174,11 @@ void HintStateDelete(HintState* hintState)
PredpushHint* hint = (PredpushHint*)lfirst(lc);
PredpushHintDelete(hint);
}
+
+ foreach (lc, hintState->predpush_same_level_hint) {
+ PredpushSameLevelHint* hint = (PredpushSameLevelHint*)lfirst(lc);
+ PredpushSameLevelHintDelete(hint);
+ }
}
/*
@@ -1117,6 +1201,7 @@ HintState* HintStateCreate()
hstate->hint_warning = NIL;
hstate->multi_node_hint = false;
hstate->predpush_hint = NIL;
+ hstate->predpush_same_level_hint = NIL;
hstate->rewrite_hint = NIL;
hstate->gather_hint = NIL;
hstate->set_hint = NIL;
@@ -1256,6 +1341,11 @@ static void AddPredpushHint(HintState* hstate, Hint* hint)
hstate->predpush_hint = lappend(hstate->predpush_hint, hint);
}
+static void AddPredpushSameLevelHint(HintState* hstate, Hint* hint)
+{
+ hstate->predpush_same_level_hint = lappend(hstate->predpush_same_level_hint, hint);
+}
+
static void AddRewriteHint(HintState* hstate, Hint* hint)
{
hstate->rewrite_hint = lappend(hstate->rewrite_hint, hint);
@@ -1303,6 +1393,7 @@ const AddHintFunc G_HINT_CREATOR[HINT_NUM] = {
AddScanMethodHint,
AddMultiNodeHint,
AddPredpushHint,
+ AddPredpushSameLevelHint,
AddSkewHint,
AddRewriteHint,
AddGatherHint,
@@ -1454,7 +1545,7 @@ static Relids create_bms_of_relids(PlannerInfo* root, Query* parse, Hint* hint,
/* For skew hint we will found relation from parse`s rtable. */
bool find_in_rtable = false;
- if (IsA(hint, SkewHint) || IsA(hint, PredpushHint)) {
+ if (IsA(hint, SkewHint) || IsA(hint, PredpushHint) || IsA(hint, PredpushSameLevelHint)) {
find_in_rtable = true;
}
@@ -1549,6 +1640,9 @@ static List* set_hint_relids(PlannerInfo* root, Query* parse, List* l)
case T_PredpushHint:
((PredpushHint*)hint)->candidates = relids;
break;
+ case T_PredpushSameLevelHint:
+ ((PredpushSameLevelHint*)hint)->candidates = relids;
+ break;
default:
break;
}
@@ -1972,6 +2066,38 @@ static void drop_duplicate_predpush_hint(PlannerInfo* root, HintState* hstate)
}
}
+/*
+ * @Description: Delete duplicate predpush same level hint.
+ * @in hstate: Hint state.
+ */
+static void drop_duplicate_predpush_same_level_hint(PlannerInfo* root, HintState* hstate)
+{
+ bool hasError = false;
+ ListCell* lc = NULL;
+
+ foreach (lc, hstate->predpush_same_level_hint) {
+ PredpushSameLevelHint* predpushSameLevelHint = (PredpushSameLevelHint*)lfirst(lc);
+
+ if (predpushSameLevelHint->base.state != HINT_STATE_DUPLICATION) {
+ ListCell* lc_next = lnext(lc);
+ while (lc_next != NULL) {
+ PredpushSameLevelHint* predpush_same_level_hint = (PredpushSameLevelHint*)lfirst(lc_next);
+
+ if (predpushSameLevelHint->dest_id == predpush_same_level_hint->dest_id) {
+ predpush_same_level_hint->base.state = HINT_STATE_DUPLICATION;
+ hasError = true;
+ }
+
+ lc_next = lnext(lc_next);
+ }
+ }
+ }
+
+ if (hasError) {
+ hstate->predpush_same_level_hint = delete_invalid_hint(root, hstate, hstate->predpush_same_level_hint);
+ }
+}
+
/*
* @Description: Delete duplicate rewrite hint.
* @in hstate: Hint state.
@@ -3204,7 +3330,7 @@ static void transform_skew_hint(PlannerInfo* root, Query* parse, List* skew_hint
* transfrom subquery name
* @in root: query level info.
* @in parse: parse tree.
- * @in skew_hint_list: SkewHint list.
+ * @in predpush_hint_list: predpush hint list.
*/
static void transform_predpush_hint(PlannerInfo* root, Query* parse, List* predpush_hint_list)
{
@@ -3229,6 +3355,37 @@ static void transform_predpush_hint(PlannerInfo* root, Query* parse, List* predp
return;
}
+/*
+ * @Description: Transform predpush same level hint into processible type, including:
+ * transfrom destination name
+ * @in root: query level info.
+ * @in parse: parse tree.
+ * @in predpush_join_hint_list: predpush same level hint list.
+ */
+static void transform_predpush_same_level_hint(PlannerInfo* root, Query* parse, List* predpush_same_level_hint_list)
+{
+ if (predpush_same_level_hint_list == NIL) {
+ return;
+ }
+
+ ListCell* lc = NULL;
+ foreach (lc, predpush_same_level_hint_list) {
+ PredpushSameLevelHint* predpush_same_level_hint = (PredpushSameLevelHint*)lfirst(lc);
+ if (predpush_same_level_hint->dest_name == NULL) {
+ continue;
+ }
+
+ int relid = find_relid_aliasname(parse, predpush_same_level_hint->dest_name, true);
+ if (relid <= NOTFOUNDRELNAME) {
+ continue;
+ }
+
+ predpush_same_level_hint->dest_id = relid;
+ }
+
+ return;
+}
+
/*
* @Description: Transform rewrite hint into bitmap.
* @in root: query level info.
@@ -3392,11 +3549,13 @@ void transform_hints(PlannerInfo* root, Query* parse, HintState* hstate)
hstate->scan_hint = set_hint_relids(root, parse, hstate->scan_hint);
hstate->skew_hint = set_hint_relids(root, parse, hstate->skew_hint);
hstate->predpush_hint = set_hint_relids(root, parse, hstate->predpush_hint);
+ hstate->predpush_same_level_hint = set_hint_relids(root, parse, hstate->predpush_same_level_hint);
transform_leading_hint(root, parse, hstate);
/* Transform predpush hint, for subquery name */
transform_predpush_hint(root, parse, hstate->predpush_hint);
+ transform_predpush_same_level_hint(root, parse, hstate->predpush_same_level_hint);
transform_rewrite_hint(root, parse, hstate->rewrite_hint);
@@ -3407,6 +3566,7 @@ void transform_hints(PlannerInfo* root, Query* parse, HintState* hstate)
drop_duplicate_scan_hint(root, hstate);
drop_duplicate_skew_hint(root, hstate);
drop_duplicate_predpush_hint(root, hstate);
+ drop_duplicate_predpush_same_level_hint(root, hstate);
drop_duplicate_rewrite_hint(root, hstate);
drop_duplicate_gather_hint(root, hstate);
@@ -3582,7 +3742,7 @@ bool permit_predpush(PlannerInfo *root)
return !predpushHint->negative;
}
-const unsigned int G_NUM_SET_HINT_WHITE_LIST = 32;
+const unsigned int G_NUM_SET_HINT_WHITE_LIST = 33;
const char* G_SET_HINT_WHITE_LIST[G_NUM_SET_HINT_WHITE_LIST] = {
/* keep in the ascending alphabetical order of frequency */
(char*)"best_agg_plan",
@@ -3616,7 +3776,8 @@ const char* G_SET_HINT_WHITE_LIST[G_NUM_SET_HINT_WHITE_LIST] = {
(char*)"node_name",
(char*)"query_dop",
(char*)"random_page_cost",
- (char*)"seq_page_cost"};
+ (char*)"seq_page_cost",
+ (char*)"try_vector_engine_strategy"};
static int param_str_cmp(const void *s1, const void *s2)
{
diff --git a/src/common/backend/parser/parse_merge.cpp b/src/common/backend/parser/parse_merge.cpp
index 22d6c1a76..f7d961eff 100644
--- a/src/common/backend/parser/parse_merge.cpp
+++ b/src/common/backend/parser/parse_merge.cpp
@@ -49,9 +49,6 @@ static List* transformUpdateTargetList(ParseState* pstate, List* origTlist);
static void checkUpdateOnJoinKey(
ParseState* pstate, MergeWhenClause* clause, List* join_var_list, bool is_insert_update);
static void checkUpdateOnDistributeKey(RangeTblEntry* rte, List* targetlist);
-static bool contain_subquery(Node* clause);
-static bool contain_subquery_walker(Node* node, void* context);
-static void check_sublink_in_action(List* mergeActionList, bool is_insert_update);
static void check_source_table_replicated(Node* source_relation);
static void check_target_table_columns(ParseState* pstate, bool is_insert_update);
static bool checkTargetTableReplicated(RangeTblEntry* rte);
@@ -820,13 +817,6 @@ static void checkUnsupportedCases(ParseState* pstate, MergeStmt* stmt)
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("Target relation type is not supported for %s",
stmt->is_insert_update ? "INSERT ... ON DUPLICATE KEY UPDATE" : "MERGE INTO")));
-
- if (RelationIsSubPartitioned(pstate->p_target_relation)) {
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("Subpartition is not supported for %s",
- stmt->is_insert_update ? "INSERT ... ON DUPLICATE KEY UPDATE" : "MERGE INTO")));
- }
}
static Query* tryTransformMergeInsertStmt(ParseState* pstate, MergeStmt* stmt)
@@ -846,6 +836,80 @@ static Query* tryTransformMergeInsertStmt(ParseState* pstate, MergeStmt* stmt)
free_parsestate(insert_pstate);
return insert_query;
}
+#ifdef ENABLE_MULTIPLE_NODES
+static bool contain_subquery_walker(Node* node, void* context)
+{
+ if (node == NULL) {
+ return false;
+ }
+ if (IsA(node, SubLink)) {
+ return true;
+ }
+ return expression_tree_walker(node, (bool (*)())contain_subquery_walker, (void*)context);
+}
+
+static bool contain_subquery(Node* clause)
+{
+ return contain_subquery_walker(clause, NULL);
+}
+
+/*
+ * cannot have Subquery in action's qual and targetlist
+ * report error if we found any.
+ */
+static void check_sublink_in_action(List* mergeActionList, bool is_insert_update)
+{
+ ListCell* lc = NULL;
+ /* check action's qual and target list */
+ foreach (lc, mergeActionList) {
+ MergeAction* action = (MergeAction*)lfirst(lc);
+ if (contain_subquery((Node*)action->qual)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("Subquery in WHERE clauses are not yet supported for %s",
+ is_insert_update ? "INSERT ... ON DUPLICATE KEY UPDATE" : "MERGE INTO")));
+ }
+ if (contain_subquery((Node*)action->targetList)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("Subquery in INSERT/UPDATE clauses are not yet supported for %s",
+ is_insert_update ? "INSERT ... ON DUPLICATE KEY UPDATE" : "MERGE INTO")));
+ }
+ }
+}
+#endif
+
+/*
+ * get current namespace for columns in the range of relation, subquery
+ * param idx is the index in RTE collection only including relation, subquery
+ */
+List* get_varnamespace(ParseState* pstate, int idx = 0)
+{
+ List* result = NULL;
+ ListCell* lc = NULL;
+ int cur_idx = 1;
+ foreach (lc, pstate->p_rtable) {
+ RangeTblEntry* rte = (RangeTblEntry*)lfirst(lc);
+ if (rte->rtekind != RTE_RELATION && rte->rtekind != RTE_SUBQUERY) {
+ continue;
+ }
+
+ if (idx <= 0) { // if id is a non-positive integer, all RTEs are obtained.
+ ParseNamespaceItem* tmp = makeNamespaceItem(rte, false, true);
+ result = lappend(result, tmp);
+ cur_idx += 1;
+ continue;
+ }
+
+ if (cur_idx == idx) { // if the value of id is valid, the specified RTE will be obtained
+ ParseNamespaceItem* tmp = makeNamespaceItem(rte, false, true);
+ result = lappend(result, tmp);
+ break;
+ }
+ cur_idx += 1;
+ }
+ return result;
+}
/*
* transformMergeStmt -
@@ -1089,8 +1153,17 @@ Query* transformMergeStmt(ParseState* pstate, MergeStmt* stmt)
List* icolumns = NIL;
List* attrnos = NIL;
List* save_relnamespace = NIL;
+ List* save_varnamespace = NIL;
RangeTblEntry* sourceRelRTE = NULL;
+ /*
+ * For MERGE INTO type SQL, in the RTE list, the object with index 1 is the target table, and the
+ * object with index 2 is the source table (the index starts from 1).
+ * For the insert scenario, var namespace needs to be specified as the source table.
+ */
+ const unsigned int merge_source_rte_index = 2;
+ List* tmp_varnamespace = get_varnamespace(pstate, merge_source_rte_index);
+
/*
* Assume that the top-level join RTE is at the end.
* The source relation is just before that.
@@ -1102,8 +1175,9 @@ Query* transformMergeStmt(ParseState* pstate, MergeStmt* stmt)
* source relation.
*/
save_relnamespace = pstate->p_relnamespace;
+ save_varnamespace = pstate->p_varnamespace;
pstate->p_relnamespace = list_make1(makeNamespaceItem(sourceRelRTE, false, true));
-
+ pstate->p_varnamespace = tmp_varnamespace;
/*
* Transform the when condition.
*
@@ -1112,6 +1186,7 @@ Query* transformMergeStmt(ParseState* pstate, MergeStmt* stmt)
* WHEN MATCHED or WHEN NOT MATCHED actions to execute.
*/
action->qual = transformWhereClause(pstate, mergeWhenClause->condition, "WHEN");
+ pstate->p_varnamespace = save_varnamespace;
pstate->p_is_insert = true;
@@ -1202,6 +1277,12 @@ Query* transformMergeStmt(ParseState* pstate, MergeStmt* stmt)
case CMD_UPDATE: {
List* set_clause_list_copy = mergeWhenClause->targetList;
+ List* save_varnamespace = NIL;
+ List* tmp_varnamespace = get_varnamespace(pstate);
+ save_varnamespace = pstate->p_varnamespace;
+ pstate->p_varnamespace = tmp_varnamespace;
+ pstate->use_level = true;
+
/*
* Transform the when condition.
*
@@ -1210,6 +1291,8 @@ Query* transformMergeStmt(ParseState* pstate, MergeStmt* stmt)
* WHEN MATCHED or WHEN NOT MATCHED actions to execute.
*/
action->qual = transformWhereClause(pstate, mergeWhenClause->condition, "WHEN");
+ pstate->p_varnamespace = save_varnamespace;
+ pstate->use_level = false;
fixResTargetListWithTableNameRef(pstate->p_target_relation, stmt->relation, set_clause_list_copy);
mergeWhenClause->targetList = set_clause_list_copy;
@@ -1227,10 +1310,10 @@ Query* transformMergeStmt(ParseState* pstate, MergeStmt* stmt)
mergeActionList = lappend(mergeActionList, action);
}
-
+#ifdef ENABLE_MULTIPLE_NODES
/* we don't support subqueries in action */
check_sublink_in_action(mergeActionList, stmt->is_insert_update);
-
+#endif
/* cannot reference system column */
check_system_column_reference(join_var_list, mergeActionList, stmt->is_insert_update);
@@ -1625,48 +1708,6 @@ static void checkUpdateOnDistributeKey(RangeTblEntry* rte, List* targetlist)
}
}
-static bool contain_subquery(Node* clause)
-{
- return contain_subquery_walker(clause, NULL);
-}
-
-static bool contain_subquery_walker(Node* node, void* context)
-{
- if (node == NULL) {
- return false;
- }
- if (IsA(node, SubLink)) {
- return true;
- }
- return expression_tree_walker(node, (bool (*)())contain_subquery_walker, (void*)context);
-}
-
-/*
- * cannot have Subquery in action's qual and targetlist
- * report error if we found any.
- */
-static void check_sublink_in_action(List* mergeActionList, bool is_insert_update)
-{
- ListCell* lc = NULL;
- /* check action's qual and target list */
- foreach (lc, mergeActionList) {
- MergeAction* action = (MergeAction*)lfirst(lc);
-
- if (contain_subquery((Node*)action->qual)) {
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("Subquery in WHERE clauses are not yet supported for %s",
- is_insert_update ? "INSERT ... ON DUPLICATE KEY UPDATE" : "MERGE INTO")));
- }
- if (contain_subquery((Node*)action->targetList)) {
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("Subquery in INSERT/UPDATE clauses are not yet supported for %s",
- is_insert_update ? "INSERT ... ON DUPLICATE KEY UPDATE" : "MERGE INTO")));
- }
- }
-}
-
/*
* cannot reference system column in
* 1. on clause
diff --git a/src/common/backend/parser/parse_node.cpp b/src/common/backend/parser/parse_node.cpp
index c38b85e4a..3430ad52e 100644
--- a/src/common/backend/parser/parse_node.cpp
+++ b/src/common/backend/parser/parse_node.cpp
@@ -70,6 +70,10 @@ ParseState* make_parsestate(ParseState* parentParseState)
pstate->p_create_proc_operator_hook = parentParseState->p_create_proc_operator_hook;
pstate->p_create_proc_insert_hook = parentParseState->p_create_proc_insert_hook;
pstate->p_cl_hook_state = parentParseState->p_cl_hook_state;
+ pstate->p_bind_variable_columnref_hook = parentParseState->p_bind_variable_columnref_hook;
+ pstate->p_bind_hook_state = parentParseState->p_bind_hook_state;
+ pstate->p_bind_describe_hook = parentParseState->p_bind_describe_hook;
+ pstate->p_describeco_hook_state = parentParseState->p_describeco_hook_state;
}
return pstate;
diff --git a/src/common/backend/parser/parse_oper.cpp b/src/common/backend/parser/parse_oper.cpp
index 19acb9dc7..cf35bc263 100644
--- a/src/common/backend/parser/parse_oper.cpp
+++ b/src/common/backend/parser/parse_oper.cpp
@@ -963,8 +963,8 @@ static Oid find_oper_cache_entry(OprCacheKey* key)
hash_create("Operator lookup cache", 256, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
/* Arrange to flush cache on pg_operator and pg_cast changes */
- CacheRegisterSyscacheCallback(OPERNAMENSP, InvalidateOprCacheCallBack, (Datum)0);
- CacheRegisterSyscacheCallback(CASTSOURCETARGET, InvalidateOprCacheCallBack, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(OPERNAMENSP, InvalidateOprCacheCallBack, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(CASTSOURCETARGET, InvalidateOprCacheCallBack, (Datum)0);
}
/* Look for an existing entry */
diff --git a/src/common/backend/parser/parse_relation.cpp b/src/common/backend/parser/parse_relation.cpp
index 025341518..9acfa8817 100755
--- a/src/common/backend/parser/parse_relation.cpp
+++ b/src/common/backend/parser/parse_relation.cpp
@@ -37,6 +37,7 @@
#endif
#include "utils/builtins.h"
#include "utils/lsyscache.h"
+#include "utils/partitionkey.h"
#include "utils/rel.h"
#include "utils/rel_gs.h"
#include "utils/syscache.h"
@@ -67,14 +68,11 @@ static void expandTupleDesc(TupleDesc tupdesc, Alias* eref, int rtindex, int sub
bool include_dropped, List** colnames, List** colvars);
static void setRteOrientation(Relation rel, RangeTblEntry* rte);
static int32* getValuesTypmods(RangeTblEntry* rte);
+
#ifndef PGXC
static int specialAttNum(const char* attname);
#endif
-static Oid getPartitionOidForRTE(RangeTblEntry *rte, RangeVar *relation, ParseState *pstate, Relation rel);
-static Oid getSubPartitionOidForRTE(RangeTblEntry *rte, RangeVar *relation, ParseState *pstate, Relation rel,
- Oid *partOid);
-
static char *ReplaceSWCTEOutSrting(ParseState *pstate, RangeTblEntry *rte, char *label)
{
ListCell *lc = NULL;
@@ -584,12 +582,13 @@ Node* scanRTEForColumn(ParseState* pstate, RangeTblEntry* rte, char* colname, in
continue;
}
if (strcmp(strVal(lfirst(c)), colname) == 0) {
+
if (result != NULL) {
ereport(ERROR,
- (errcode(ERRCODE_AMBIGUOUS_COLUMN),
- errmsg("column reference \"%s\" is ambiguous", colname),
- parser_errposition(pstate, location)));
+ (errcode(ERRCODE_AMBIGUOUS_COLUMN), errmsg("column reference \"%s\" is ambiguous", colname),
+ parser_errposition(pstate, location)));
}
+
/*
* When user specifies a query on a hidden column. but it actually invisible to the user.
* So just ignore this column, this only happens on timeseries table.
@@ -684,6 +683,17 @@ Node* colNameToVar(ParseState* pstate, char* colname, bool localonly, int locati
*final_rte = rte;
}
+ /*
+ * Under normal circumstances, the alias of the column with the same name needs to be specified, but in
+ * some cases, it can not be specified. For example, the scene of 'merge into (matched)' takes
+ * priority to find in the target RTE. If it is found, it will jump out. Otherwise, it will be found
+ * in the source RTE. This search order is also found in the order of the RTE list, use_level of pstate
+ * attribute represents whether to use this rule.
+ */
+ if (result != NULL && pstate->use_level) {
+ break;
+ }
+
if (result != NULL) {
ereport(ERROR,
(errcode(ERRCODE_AMBIGUOUS_COLUMN),
@@ -967,159 +977,7 @@ static void buildScalarFunctionAlias(Node* funcexpr, char* funcname, Alias* alia
eref->colnames = list_make1(makeString(eref->aliasname));
}
-/*
- * @@GaussDB@@
- * Target : data partition
- * Brief : select * from partition (partition_name)
- * : or select from partition for (partition_values_list)
- * Description : get partition oid for rte->partitionOid
- */
-static Oid getPartitionOidForRTE(RangeTblEntry* rte, RangeVar* relation, ParseState* pstate, Relation rel)
-{
- Oid partitionOid = InvalidOid;
- if (!PointerIsValid(rte) || !PointerIsValid(relation) || !PointerIsValid(pstate) || !PointerIsValid(rel)) {
- return InvalidOid;
- }
-
- /* relation is not partitioned table. */
- if (!rte->ispartrel || rte->relkind != RELKIND_RELATION) {
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_TABLE), errmsg("relation \"%s\" is not partitioned table", relation->relname)));
- } else {
- /* relation is partitioned table, from clause is partition (partition_name). */
- if (PointerIsValid(relation->partitionname)) {
- partitionOid = partitionNameGetPartitionOid(rte->relid,
- relation->partitionname,
- PART_OBJ_TYPE_TABLE_PARTITION,
- AccessShareLock,
- true,
- false,
- NULL,
- NULL,
- NoLock);
- /* partiton does not exist. */
- if (!OidIsValid(partitionOid)) {
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_TABLE),
- errmsg("partition \"%s\" of relation \"%s\" does not exist",
- relation->partitionname,
- relation->relname)));
- }
-
- rte->pname = makeAlias(relation->partitionname, NIL);
- } else {
- /* from clause is partition for (partition_key_values_list). */
- if (rel->partMap->type == PART_TYPE_LIST) {
- ListPartitionDefState* listPartDef = NULL;
- listPartDef = makeNode(ListPartitionDefState);
- listPartDef->boundary = relation->partitionKeyValuesList;
- listPartDef->boundary = transformListPartitionValue(pstate, listPartDef->boundary, false, true);
- listPartDef->boundary = transformIntoTargetType(
- rel->rd_att->attrs, (((ListPartitionMap*)rel->partMap)->partitionKey)->values[0], listPartDef->boundary);
-
- rte->plist = listPartDef->boundary;
-
- partitionOid =
- partitionValuesGetPartitionOid(rel, listPartDef->boundary, AccessShareLock, true, true, false);
-
- pfree_ext(listPartDef);
- } else if (rel->partMap->type == PART_TYPE_HASH) {
- HashPartitionDefState* hashPartDef = NULL;
- hashPartDef = makeNode(HashPartitionDefState);
- hashPartDef->boundary = relation->partitionKeyValuesList;
- hashPartDef->boundary = transformListPartitionValue(pstate, hashPartDef->boundary, false, true);
- hashPartDef->boundary = transformIntoTargetType(
- rel->rd_att->attrs, (((HashPartitionMap*)rel->partMap)->partitionKey)->values[0], hashPartDef->boundary);
-
- rte->plist = hashPartDef->boundary;
-
- partitionOid =
- partitionValuesGetPartitionOid(rel, hashPartDef->boundary, AccessShareLock, true, true, false);
-
- pfree_ext(hashPartDef);
- } else {
- RangePartitionDefState* rangePartDef = NULL;
- rangePartDef = makeNode(RangePartitionDefState);
- rangePartDef->boundary = relation->partitionKeyValuesList;
-
- transformPartitionValue(pstate, (Node*)rangePartDef, false);
-
- rangePartDef->boundary = transformConstIntoTargetType(
- rel->rd_att->attrs, ((RangePartitionMap*)rel->partMap)->partitionKey, rangePartDef->boundary);
-
- rte->plist = rangePartDef->boundary;
-
- partitionOid =
- partitionValuesGetPartitionOid(rel, rangePartDef->boundary, AccessShareLock, true, true, false);
-
- pfree_ext(rangePartDef);
- }
-
- /* partition does not exist. */
- if (!OidIsValid(partitionOid)) {
- if (rel->partMap->type == PART_TYPE_RANGE ||
- rel->partMap->type == PART_TYPE_LIST || rel->partMap->type == PART_TYPE_HASH) {
- ereport(ERROR,
- (errcode(ERRCODE_WRONG_OBJECT_TYPE),
- errmsg("The partition number is invalid or out-of-range")));
- } else {
- /* shouldn't happen */
- ereport(ERROR, (errcode(ERRCODE_UNRECOGNIZED_NODE_TYPE), errmsg("unsupported partition type")));
- }
- }
- }
- }
-
- return partitionOid;
-}
-
-/*
- * @@GaussDB@@
- * Target : data partition
- * Brief : select * from subpartition (subpartition_name)
- * Description : get partition oid for rte->partitionOid
- */
-static Oid getSubPartitionOidForRTE(RangeTblEntry *rte, RangeVar *relation, ParseState *pstate, Relation rel,
- Oid *partOid)
-{
- Oid subPartitionOid = InvalidOid;
-
- if (!PointerIsValid(rte) || !PointerIsValid(relation) || !PointerIsValid(pstate) || !PointerIsValid(rel)) {
- return InvalidOid;
- }
-
- /* relation is not partitioned table. */
- if (!rte->ispartrel || rte->relkind != RELKIND_RELATION) {
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_TABLE), errmsg("relation \"%s\" is not partitioned table", relation->relname)));
- } else {
- /* relation is partitioned table, from clause is subpartition (subpartition_name). */
- if (PointerIsValid(relation->subpartitionname)) {
- subPartitionOid = partitionNameGetPartitionOid(rte->relid,
- relation->subpartitionname,
- PART_OBJ_TYPE_TABLE_SUB_PARTITION,
- AccessShareLock,
- true,
- false,
- NULL,
- NULL,
- NoLock,
- partOid);
- /* partiton does not exist. */
- if (!OidIsValid(subPartitionOid)) {
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_TABLE),
- errmsg("subpartition \"%s\" of relation \"%s\" does not exist",
- relation->subpartitionname,
- relation->relname)));
- }
-
- rte->pname = makeAlias(relation->subpartitionname, NIL);
- }
- }
- return subPartitionOid;
-}
/*
* Open a table during parse analysis
@@ -1355,7 +1213,7 @@ RangeTblEntry* addRangeTableEntry(ParseState* pstate, RangeVar* relation, Alias*
/* select from clause contain subpartition. */
if (relation->issubpartition) {
rte->isContainSubPartition = true;
- rte->subpartitionOid = getSubPartitionOidForRTE(rte, relation, pstate, rel, &rte->partitionOid);
+ rte->subpartitionOid = GetSubPartitionOidForRTE(rte, relation, pstate, rel, &rte->partitionOid);
}
if (!rte->relhasbucket && relation->isbucket) {
ereport(ERROR, (errmsg("table is normal,cannot contains buckets(0,1,2...)")));
@@ -2906,7 +2764,8 @@ int attnameAttNum(Relation rd, const char* attname, bool sysColOK)
if (sysColOK) {
if ((i = specialAttNum(attname)) != InvalidAttrNumber) {
if ((i != ObjectIdAttributeNumber || rd->rd_rel->relhasoids) &&
- (i != BucketIdAttributeNumber || RELATION_HAS_BUCKET(rd))) {
+ (i != BucketIdAttributeNumber || RELATION_HAS_BUCKET(rd)) &&
+ (i != UidAttributeNumber || RELATION_HAS_UIDS(rd))) {
return i;
}
}
@@ -2952,7 +2811,8 @@ Name attnumAttName(Relation rd, int attid)
if (attid <= 0) {
Form_pg_attribute sysatt;
- sysatt = SystemAttributeDefinition(attid, rd->rd_rel->relhasoids, RELATION_HAS_BUCKET(rd));
+ sysatt = SystemAttributeDefinition(attid, rd->rd_rel->relhasoids,
+ RELATION_HAS_BUCKET(rd), RELATION_HAS_UIDS(rd));
return &sysatt->attname;
}
if (attid > rd->rd_att->natts) {
@@ -2973,7 +2833,8 @@ Oid attnumTypeId(Relation rd, int attid)
if (attid <= 0) {
Form_pg_attribute sysatt;
- sysatt = SystemAttributeDefinition(attid, rd->rd_rel->relhasoids, RELATION_HAS_BUCKET(rd));
+ sysatt = SystemAttributeDefinition(attid, rd->rd_rel->relhasoids,
+ RELATION_HAS_BUCKET(rd), RELATION_HAS_UIDS(rd));
return sysatt->atttypid;
}
if (attid > rd->rd_att->natts) {
diff --git a/src/common/backend/parser/parse_startwith.cpp b/src/common/backend/parser/parse_startwith.cpp
index 5ae0b92db..36ba6938a 100644
--- a/src/common/backend/parser/parse_startwith.cpp
+++ b/src/common/backend/parser/parse_startwith.cpp
@@ -526,13 +526,6 @@ static bool preSkipPLSQLParams(ParseState *pstate, ColumnRef *cref)
}
}
- if (pstate->p_bind_variable_columnref_hook != NULL) {
- node = (*pstate->p_bind_variable_columnref_hook)(pstate, cref);
- if (node != NULL) {
- return true;
- }
- }
-
return false;
}
@@ -776,6 +769,10 @@ static Node *replaceListFakeValue(List *lst)
static Node *tryReplaceFakeValue(Node *node)
{
+ if (node == NULL) {
+ return node;
+ }
+
if (IsA(node, Rownum)) {
node = makeIntConst(CONNECT_BY_ROWNUM_FAKEVALUE, -1);
} else if (is_cref_by_name(node, "level")) {
@@ -1316,7 +1313,13 @@ static SelectStmt *CreateStartWithCTEInnerBranch(ParseState* pstate,
if (whereClause != NULL) {
JoinExpr *final_join = (JoinExpr *)origin_table;
/* pushdown requires deep copying of the quals */
- final_join->quals = (Node *)copyObject(whereClause);
+ Node *whereCopy = (Node *)copyObject(whereClause);
+ if (final_join->quals == NULL) {
+ final_join->quals = whereCopy;
+ } else {
+ final_join->quals =
+ (Node *)makeA_Expr(AEXPR_AND, NULL, whereCopy, final_join->quals, -1);
+ }
}
}
diff --git a/src/common/backend/parser/parse_type.cpp b/src/common/backend/parser/parse_type.cpp
index 4f795f0f2..93ce52500 100644
--- a/src/common/backend/parser/parse_type.cpp
+++ b/src/common/backend/parser/parse_type.cpp
@@ -35,74 +35,6 @@
#include "utils/syscache.h"
#include "utils/pl_package.h"
-const static Oid cstoreSupportType[] = {BOOLOID,
- HLL_OID, // same as BYTEA
- BYTEAOID,
- CHAROID,
- HLL_HASHVAL_OID, // same as INT8
- INT8OID,
- INT2OID,
- INT4OID,
- INT1OID,
- NUMERICOID,
- BPCHAROID,
- VARCHAROID,
- NVARCHAR2OID,
- SMALLDATETIMEOID,
- TEXTOID,
- OIDOID,
- FLOAT4OID,
- FLOAT8OID,
- ABSTIMEOID,
- RELTIMEOID,
- TINTERVALOID,
- INETOID,
- DATEOID,
- TIMEOID,
- TIMESTAMPOID,
- TIMESTAMPTZOID,
- INTERVALOID,
- TIMETZOID,
- CASHOID,
- CIDROID,
- BITOID,
- VARBITOID,
- CLOBOID,
- BOOLARRAYOID, // array
- HLL_ARRAYOID,
- BYTEARRAYOID,
- CHARARRAYOID,
- HLL_HASHVAL_ARRAYOID,
- INT8ARRAYOID,
- INT2ARRAYOID,
- INT4ARRAYOID,
- INT1ARRAYOID,
- ARRAYNUMERICOID,
- BPCHARARRAYOID,
- VARCHARARRAYOID,
- NVARCHAR2ARRAYOID,
- SMALLDATETIMEARRAYOID,
- TEXTARRAYOID,
- FLOAT4ARRAYOID,
- FLOAT8ARRAYOID,
- ABSTIMEARRAYOID,
- RELTIMEARRAYOID,
- ARRAYTINTERVALOID,
- INETARRAYOID,
- DATEARRAYOID,
- TIMEARRAYOID,
- TIMESTAMPARRAYOID,
- TIMESTAMPTZARRAYOID,
- ARRAYINTERVALOID,
- ARRAYTIMETZOID,
- CASHARRAYOID,
- CIDRARRAYOID,
- BITARRAYOID,
- VARBITARRAYOID,
- BYTEAWITHOUTORDERCOLOID,
- BYTEAWITHOUTORDERWITHEQUALCOLOID
-};
-
static int32 typenameTypeMod(ParseState* pstate, const TypeName* typname, Type typ);
static bool IsTypeInBlacklist(Oid typoid);
@@ -408,8 +340,10 @@ Type LookupTypeNameExtended(ParseState* pstate, const TypeName* typname, int32*
}
if (u_sess->plsql_cxt.need_pkg_dependencies && OidIsValid(pkgOid) && !notPkgType) {
+ MemoryContext temp = MemoryContextSwitchTo(SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_OPTIMIZER));
u_sess->plsql_cxt.pkg_dependencies =
list_append_unique_oid(u_sess->plsql_cxt.pkg_dependencies, pkgOid);
+ MemoryContextSwitchTo(temp);
}
if (!OidIsValid(typoid)) {
@@ -982,19 +916,83 @@ fail:
* The performance of this function relies on compiler to flat the branches. But
* it is ok if compiler failed to do its job as it is not in critical code path.
*/
-bool IsTypeSupportedByCStore(_in_ Oid typeOid, _in_ int32 typeMod)
+bool IsTypeSupportedByCStore(Oid typeOid)
{
- // we don't support user defined type.
- //
- if (typeOid >= FirstNormalObjectId) {
- return false;
+ switch (typeOid) {
+ case BOOLOID:
+ case HLL_OID: // same as BYTEA
+ case BYTEAOID:
+ case CHAROID:
+ case HLL_HASHVAL_OID: // same as INT8
+ case INT8OID:
+ case INT2OID:
+ case INT4OID:
+ case INT1OID:
+ case NUMERICOID:
+ case BPCHAROID:
+ case VARCHAROID:
+ case NVARCHAR2OID:
+ case SMALLDATETIMEOID:
+ case TEXTOID:
+ case OIDOID:
+ case FLOAT4OID:
+ case FLOAT8OID:
+ case ABSTIMEOID:
+ case RELTIMEOID:
+ case TINTERVALOID:
+ case INETOID:
+ case DATEOID:
+ case TIMEOID:
+ case TIMESTAMPOID:
+ case TIMESTAMPTZOID:
+ case INTERVALOID:
+ case TIMETZOID:
+ case CASHOID:
+ case CIDROID:
+ case BITOID:
+ case VARBITOID:
+ case CLOBOID:
+ case BOOLARRAYOID: // array
+ case HLL_ARRAYOID:
+ case BYTEARRAYOID:
+ case CHARARRAYOID:
+ case HLL_HASHVAL_ARRAYOID:
+ case INT8ARRAYOID:
+ case INT2ARRAYOID:
+ case INT4ARRAYOID:
+ case INT1ARRAYOID:
+ case ARRAYNUMERICOID:
+ case BPCHARARRAYOID:
+ case VARCHARARRAYOID:
+ case NVARCHAR2ARRAYOID:
+ case SMALLDATETIMEARRAYOID:
+ case TEXTARRAYOID:
+ case FLOAT4ARRAYOID:
+ case FLOAT8ARRAYOID:
+ case ABSTIMEARRAYOID:
+ case RELTIMEARRAYOID:
+ case ARRAYTINTERVALOID:
+ case INETARRAYOID:
+ case DATEARRAYOID:
+ case TIMEARRAYOID:
+ case TIMESTAMPARRAYOID:
+ case TIMESTAMPTZARRAYOID:
+ case ARRAYINTERVALOID:
+ case ARRAYTIMETZOID:
+ case CASHARRAYOID:
+ case CIDRARRAYOID:
+ case BITARRAYOID:
+ case VARBITARRAYOID:
+ case BYTEAWITHOUTORDERCOLOID:
+ case BYTEAWITHOUTORDERWITHEQUALCOLOID:
+ case VOIDOID:
+ return true;
+ default:
+ break;
}
- for (uint32 i = 0; i < sizeof(cstoreSupportType) / sizeof(Oid); ++i) {
- if (cstoreSupportType[i] == typeOid) {
- return true;
- }
- }
+ ereport(DEBUG2, (errmodule(MOD_OPT_PLANNER),
+ errmsg("Vectorize plan failed due to unsupport type: %d", typeOid)));
return false;
}
/*
diff --git a/src/common/backend/parser/parse_utilcmd.cpp b/src/common/backend/parser/parse_utilcmd.cpp
index f00a28ce6..ba6bb716f 100644
--- a/src/common/backend/parser/parse_utilcmd.cpp
+++ b/src/common/backend/parser/parse_utilcmd.cpp
@@ -237,7 +237,7 @@ Oid *namespaceid, bool isFirstNode)
* preexisting relation in that namespace with the same name, and updates
* stmt->relation->relpersistence if the select namespace is temporary.
*/
- *namespaceid = RangeVarGetAndCheckCreationNamespace(stmt->relation, NoLock, &existing_relid);
+ *namespaceid = RangeVarGetAndCheckCreationNamespace(stmt->relation, NoLock, &existing_relid, RELKIND_RELATION);
/*
* Check whether relation is in ledger schema. If it is, we add hash column.
@@ -906,7 +906,11 @@ static void transformColumnDefinition(CreateStmtContext* cxt, ColumnDef* column,
column->typname->names = NIL;
column->typname->typeOid = NUMERICOID;
large = true;
+#ifdef ENABLE_MULTIPLE_NODES
} else if ((is_enc_type(typname) && IS_MAIN_COORDINATOR) ||
+#else
+ } else if (is_enc_type(typname) ||
+#endif
(!u_sess->attr.attr_common.enable_beta_features && strcmp(typname, "int16") == 0)) {
ereport(ERROR,
(errcode(ERRCODE_OPERATE_NOT_SUPPORTED),
@@ -1276,6 +1280,96 @@ static DistributeBy* GetHideTagDistribution(TupleDesc tupleDesc)
return distributeby;
}
+/*
+ * Support Create table like on table with subpartitions
+ * In transform phase, we need fill PartitionState
+ * 1. Recursively fill partitionList in PartitionState also including subpartitionList
+ * 2. Recursively fill PartitionState also including SubPartitionState
+ */
+static PartitionState *transformTblSubpartition(Relation relation, HeapTuple partitionTuple,
+ List* partitionList, List* subPartitionList)
+{
+ ListCell *lc1 = NULL;
+ ListCell *lc2 = NULL;
+ ListCell *lc3 = NULL;
+
+ List *partKeyColumns = NIL;
+ List *partitionDefinitions = NIL;
+ PartitionState *partState = NULL;
+ PartitionState *subPartState = NULL;
+ Form_pg_partition tupleForm = NULL;
+ Form_pg_partition partitionForm = NULL;
+ Form_pg_partition subPartitionForm = NULL;
+
+ tupleForm = (Form_pg_partition)GETSTRUCT(partitionTuple);
+
+ /* prepare partition definitions */
+ transformTableLikePartitionProperty(
+ relation, partitionTuple, &partKeyColumns, partitionList, &partitionDefinitions);
+
+ partState = makeNode(PartitionState);
+ partState->partitionKey = partKeyColumns;
+ partState->partitionList = partitionDefinitions;
+ partState->partitionStrategy = tupleForm->partstrategy;
+
+ partState->rowMovement = relation->rd_rel->relrowmovement ? ROWMOVEMENT_ENABLE : ROWMOVEMENT_DISABLE;
+
+ /* prepare subpartition definitions */
+ forboth(lc1, partitionList, lc2, subPartitionList) {
+ List *subPartKeyColumns = NIL;
+ List *subPartitionDefinitions = NIL;
+ RangePartitionDefState *partitionDef = NULL;
+
+ HeapTuple partTuple = (HeapTuple)lfirst(lc1);
+ List *subPartitions = (List *)lfirst(lc2);
+
+ HeapTuple subPartTuple = (HeapTuple)linitial(subPartitions);
+ subPartitionForm = (Form_pg_partition)GETSTRUCT(subPartTuple);
+ partitionForm = (Form_pg_partition)GETSTRUCT(partTuple);
+
+ if (subPartitionForm->partstrategy != PART_STRATEGY_RANGE) {
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("Un-support feature"),
+ errdetail("Create Table like with subpartition only support range strategy.")));
+ }
+
+ Oid partOid = HeapTupleGetOid(partTuple);
+ Partition part = partitionOpen(relation, partOid, AccessShareLock);
+ Relation partRel = partitionGetRelation(relation, part);
+
+ transformTableLikePartitionProperty(
+ partRel, partTuple, &subPartKeyColumns, subPartitions, &subPartitionDefinitions);
+
+ if (subPartState == NULL) {
+ subPartState = makeNode(PartitionState);
+ subPartState->partitionKey = subPartKeyColumns;
+ subPartState->partitionList = NULL;
+ subPartState->partitionStrategy = subPartitionForm->partstrategy;
+ }
+
+ /* Here do this for reserve origin subpartitions order */
+ foreach(lc3, partitionDefinitions) {
+ RangePartitionDefState *rightDef = (RangePartitionDefState*)lfirst(lc3);
+
+ if (pg_strcasecmp(NameStr(partitionForm->relname), rightDef->partitionName) == 0) {
+ partitionDef = rightDef;
+ break;
+ }
+ }
+
+ Assert(partitionDef != NULL);
+ partitionDef->subPartitionDefState = subPartitionDefinitions;
+
+ releaseDummyRelation(&partRel);
+ partitionClose(relation, part, NoLock);
+ }
+
+ partState->subPartitionState = subPartState;
+
+ return partState;
+}
+
/*
* transformTableLikeClause
*
@@ -1339,15 +1433,6 @@ static void transformTableLikeClause(
cancel_parser_errposition_callback(&pcbstate);
- if (RelationIsSubPartitioned(relation)) {
- ereport(
- ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- (errmsg("Subpartition table does not support create table like."),
- errdetail("N/A."),
- errcause("The feature is not currently supported."), erraction("Use other actions instead."))));
- }
-
// If specify 'INCLUDING ALL' for non-partitioned table, just remove the option 'INCLUDING PARTITION'.
// Right shift 10 bits can handle both 'INCLUDING ALL' and 'INCLUDING ALL EXCLUDING option(s)'.
// if add a new option, the number '10'(see marco 'MAX_TABLE_LIKE_OPTIONS') should be changed.
@@ -1760,23 +1845,29 @@ static void transformTableLikeClause(
HeapTuple partitionTableTuple = NULL;
Form_pg_partition partitionForm = NULL;
List* partitionList = NIL;
+ List* subPartitionList = NIL;
// read out partitioned table tuple, and partition tuple list
partitionTableTuple =
searchPgPartitionByParentIdCopy(PART_OBJ_TYPE_PARTED_TABLE, ObjectIdGetDatum(relation->rd_id));
partitionList = searchPgPartitionByParentId(PART_OBJ_TYPE_TABLE_PARTITION, ObjectIdGetDatum(relation->rd_id));
+ if (RelationIsSubPartitioned(relation)) {
+ subPartitionList = searchPgSubPartitionByParentId(PART_OBJ_TYPE_TABLE_SUB_PARTITION, partitionList);
+ }
+
if (partitionTableTuple != NULL) {
partitionForm = (Form_pg_partition)GETSTRUCT(partitionTableTuple);
- if (partitionForm->partstrategy == PART_STRATEGY_LIST ||
- partitionForm->partstrategy == PART_STRATEGY_HASH) {
- freePartList(partitionList);
- heap_freetuple_ext(partitionTableTuple);
+
+ if (partitionForm->partstrategy == PART_STRATEGY_LIST ||
+ partitionForm->partstrategy == PART_STRATEGY_HASH) {
+ freePartList(partitionList);
+ heap_freetuple_ext(partitionTableTuple);
heap_close(relation, NoLock);
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("Un-support feature"),
- errdetail("The Like feature is not supported currently for List and Hash.")));
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("Un-support feature"),
+ errdetail("The Like feature is not supported currently for List and Hash.")));
}
bool value_partition_rel = (partitionForm->partstrategy == PART_STRATEGY_VALUE);
@@ -1784,7 +1875,7 @@ static void transformTableLikeClause(
* We only have to create PartitionState for a range partition table
* with known partitions or a value partition table(HDFS).
*/
- if ((NIL != partitionList) || value_partition_rel) {
+ if ((NIL != partitionList && subPartitionList == NIL) || value_partition_rel) {
{
List* partKeyColumns = NIL;
List* partitionDefinitions = NIL;
@@ -1815,6 +1906,17 @@ static void transformTableLikeClause(
freePartList(partitionList);
}
+ } else if (subPartitionList != NULL) {
+ n = transformTblSubpartition(relation,
+ partitionTableTuple,
+ partitionList,
+ subPartitionList);
+
+ /* store the produced partition state in CreateStmtContext */
+ cxt->csc_partTableState = n;
+
+ freePartList(partitionList);
+ freePartList(subPartitionList);
}
heap_freetuple_ext(partitionTableTuple);
@@ -3078,7 +3180,7 @@ static IndexStmt* transformIndexConstraint(Constraint* constraint, CreateStmtCon
AssertEreport(attnum <= heap_rel->rd_att->natts, MOD_OPT, "");
attform = heap_rel->rd_att->attrs[attnum - 1];
} else
- attform = SystemAttributeDefinition(attnum, heap_rel->rd_rel->relhasoids, RELATION_HAS_BUCKET(heap_rel));
+ attform = SystemAttributeDefinition(attnum, heap_rel->rd_rel->relhasoids, RELATION_HAS_BUCKET(heap_rel), RELATION_HAS_UIDS(heap_rel));
attname = pstrdup(NameStr(attform->attname));
if (i < indnkeyatts) {
@@ -3593,21 +3695,12 @@ IndexStmt* transformIndexStmt(Oid relid, IndexStmt* stmt, const char* queryStrin
if (!isColStore && (0 != pg_strcasecmp(stmt->accessMethod, DEFAULT_INDEX_TYPE)) &&
(0 != pg_strcasecmp(stmt->accessMethod, DEFAULT_GIN_INDEX_TYPE)) &&
(0 != pg_strcasecmp(stmt->accessMethod, DEFAULT_GIST_INDEX_TYPE)) &&
- (0 != pg_strcasecmp(stmt->accessMethod, DEFAULT_HASH_INDEX_TYPE)) &&
(0 != pg_strcasecmp(stmt->accessMethod, DEFAULT_USTORE_INDEX_TYPE))) {
/* row store only support btree/ubtree/gin/gist index */
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("access method \"%s\" does not support row store", stmt->accessMethod)));
}
-
- if (0 == pg_strcasecmp(stmt->accessMethod, DEFAULT_HASH_INDEX_TYPE) &&
- t_thrd.proc->workingVersionNum < SUPPORT_HASH_XLOG_VERSION_NUM) {
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("access method \"%s\" does not support row store", stmt->accessMethod)));
- }
-
if (isColStore && (!isPsortMothed && !isCBtreeMethod && !isCGinBtreeMethod)) {
/* column store support psort/cbtree/gin index */
ereport(ERROR,
@@ -4025,6 +4118,7 @@ List* transformAlterTableStmt(Oid relid, AlterTableStmt* stmt, const char* query
AlterTableCmd* newcmd = NULL;
Node* rangePartDef = NULL;
AddPartitionState* addDefState = NULL;
+ AddSubPartitionState* addSubdefState = NULL;
SplitPartitionState* splitDefState = NULL;
ListCell* cell = NULL;
@@ -4196,7 +4290,28 @@ List* transformAlterTableStmt(Oid relid, AlterTableStmt* stmt, const char* query
newcmds = lappend(newcmds, cmd);
break;
+ case AT_AddSubPartition:
+ /* transform the boundary of subpartition,
+ * this step transform it from A_Const into Const */
+ addSubdefState = (AddSubPartitionState*)cmd->def;
+ if (!PointerIsValid(addSubdefState)) {
+ ereport(ERROR, (errcode(ERRCODE_UNEXPECTED_NULL_VALUE), errmodule(MOD_OPT),
+ errmsg("Missing definition of adding subpartition"),
+ errdetail("The AddSubPartitionState in ADD SUBPARTITION command is not found"),
+ errcause("Try ADD SUBPARTITION without subpartition defination"),
+ erraction("Please check DDL syntax for \"ADD SUBPARTITION\"")));
+ }
+ /* A_Const -->Const */
+ foreach (cell, addSubdefState->subPartitionList) {
+ rangePartDef = (Node*)lfirst(cell);
+ transformPartitionValue(pstate, rangePartDef, true);
+ }
+
+ newcmds = lappend(newcmds, cmd);
+ break;
+
case AT_DropPartition:
+ case AT_DropSubPartition:
case AT_TruncatePartition:
case AT_ExchangePartition:
case AT_TruncateSubPartition:
@@ -4228,6 +4343,7 @@ List* transformAlterTableStmt(Oid relid, AlterTableStmt* stmt, const char* query
ereport(ERROR,
(errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("can not split LIST/HASH partition table")));
}
+
/* transform the boundary of range partition: from A_Const into Const */
splitDefState = (SplitPartitionState*)cmd->def;
if (!PointerIsValid(splitDefState->split_point)) {
diff --git a/src/common/backend/parser/parser.cpp b/src/common/backend/parser/parser.cpp
index 31640d316..ba75d042c 100644
--- a/src/common/backend/parser/parser.cpp
+++ b/src/common/backend/parser/parser.cpp
@@ -272,6 +272,23 @@ int base_yylex(YYSTYPE* lvalp, YYLTYPE* llocp, core_yyscan_t yyscanner)
break;
}
break;
+ case SUBPARTITION:
+
+ GET_NEXT_TOKEN();
+
+ switch (next_token) {
+ case FOR:
+ cur_token = SUBPARTITION_FOR;
+ break;
+ default:
+ /* save the lookahead token for next time */
+ SET_LOOKAHEAD_TOKEN();
+ /* and back up the output info to cur_token */
+ lvalp->core_yystype = cur_yylval;
+ *llocp = cur_yylloc;
+ break;
+ }
+ break;
case ADD_P:
/*
* ADD PARTITION must be reduced to one token
@@ -282,6 +299,9 @@ int base_yylex(YYSTYPE* lvalp, YYLTYPE* llocp, core_yyscan_t yyscanner)
case PARTITION:
cur_token = ADD_PARTITION;
break;
+ case SUBPARTITION:
+ cur_token = ADD_SUBPARTITION;
+ break;
default:
/* save the lookahead token for next time */
SET_LOOKAHEAD_TOKEN();
@@ -303,6 +323,9 @@ int base_yylex(YYSTYPE* lvalp, YYLTYPE* llocp, core_yyscan_t yyscanner)
case PARTITION:
cur_token = DROP_PARTITION;
break;
+ case SUBPARTITION:
+ cur_token = DROP_SUBPARTITION;
+ break;
default:
/* save the lookahead token for next time */
SET_LOOKAHEAD_TOKEN();
@@ -411,7 +434,44 @@ int base_yylex(YYSTYPE* lvalp, YYLTYPE* llocp, core_yyscan_t yyscanner)
break;
}
break;
+ case START:
+ /*
+ * START WITH must be reduced to one token, to allow START as table / column alias.
+ */
+ GET_NEXT_TOKEN();
+ switch (next_token) {
+ case WITH:
+ cur_token = START_WITH;
+ break;
+ default:
+ /* save the lookahead token for next time */
+ SET_LOOKAHEAD_TOKEN();
+ /* and back up the output info to cur_token */
+ lvalp->core_yystype = cur_yylval;
+ *llocp = cur_yylloc;
+ break;
+ }
+ break;
+ case CONNECT:
+ /*
+ * CONNECT BY must be reduced to one token, to allow CONNECT as table / column alias.
+ */
+ GET_NEXT_TOKEN();
+
+ switch (next_token) {
+ case BY:
+ cur_token = CONNECT_BY;
+ break;
+ default:
+ /* save the lookahead token for next time */
+ SET_LOOKAHEAD_TOKEN();
+ /* and back up the output info to cur_token */
+ lvalp->core_yystype = cur_yylval;
+ *llocp = cur_yylloc;
+ break;
+ }
+ break;
default:
break;
}
diff --git a/src/common/backend/parser/scan.l b/src/common/backend/parser/scan.l
index 75f3c8055..1b86965ab 100755
--- a/src/common/backend/parser/scan.l
+++ b/src/common/backend/parser/scan.l
@@ -51,6 +51,14 @@
*/
#define YYSTYPE core_YYSTYPE
+/*
+ * define core_yylex for flex >= 2.6
+ */
+#if FLEX_MAJOR_VERSION >= 2 && FLEX_MINOR_VERSION >= 6
+#define YY_DECL int core_yylex \
+ (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)
+#endif
+
/*
* Set the type of yyextra. All state variables used by the scanner should
* be in yyextra, *not* statically allocated.
diff --git a/src/common/backend/pgxc_single/CMakeLists.txt b/src/common/backend/pgxc_single/CMakeLists.txt
index 765a53326..cec00e6c0 100755
--- a/src/common/backend/pgxc_single/CMakeLists.txt
+++ b/src/common/backend/pgxc_single/CMakeLists.txt
@@ -1,23 +1,24 @@
-#This is the main CMAKE for build bin.
-
-set(CMAKE_VERBOSE_MAKEFILE ON)
-set(CMAKE_RULE_MESSAGES OFF)
-set(CMAKE_SKIP_RPATH TRUE)
-
-
-set(CMAKE_MODULE_PATH
- ${CMAKE_CURRENT_SOURCE_DIR}/barrier
- ${CMAKE_CURRENT_SOURCE_DIR}/copy
- ${CMAKE_CURRENT_SOURCE_DIR}/locator
- ${CMAKE_CURRENT_SOURCE_DIR}/nodemgr
- ${CMAKE_CURRENT_SOURCE_DIR}/pool
-)
-
-if("${ENABLE_MULTIPLE_NODES}" STREQUAL "OFF")
- add_subdirectory(barrier)
- add_subdirectory(copy)
- add_subdirectory(locator)
- add_subdirectory(nodemgr)
- add_subdirectory(pool)
-endif()
-
+#This is the main CMAKE for build bin.
+
+set(CMAKE_VERBOSE_MAKEFILE ON)
+set(CMAKE_RULE_MESSAGES OFF)
+set(CMAKE_SKIP_RPATH TRUE)
+
+
+set(CMAKE_MODULE_PATH
+ ${CMAKE_CURRENT_SOURCE_DIR}/barrier
+ ${CMAKE_CURRENT_SOURCE_DIR}/copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/locator
+ ${CMAKE_CURRENT_SOURCE_DIR}/nodemgr
+ ${CMAKE_CURRENT_SOURCE_DIR}/pool
+)
+
+add_subdirectory(barrier)
+add_subdirectory(copy)
+
+if("${ENABLE_MULTIPLE_NODES}" STREQUAL "OFF")
+ add_subdirectory(locator)
+ add_subdirectory(nodemgr)
+ add_subdirectory(pool)
+endif()
+
diff --git a/src/common/backend/pgxc_single/Makefile b/src/common/backend/pgxc_single/Makefile
index 6c187da3a..8b893fb5f 100644
--- a/src/common/backend/pgxc_single/Makefile
+++ b/src/common/backend/pgxc_single/Makefile
@@ -8,6 +8,10 @@ subdir = src/common/backend/pgxc_single
top_builddir = ../../../..
include $(top_builddir)/src/Makefile.global
+ifeq ($(enable_multiple_nodes), yes)
+SUBDIRS = barrier
+else
SUBDIRS = barrier locator copy nodemgr pool
+endif
include $(top_srcdir)/src/gausskernel/common.mk
diff --git a/src/common/backend/pgxc_single/barrier/barrier.cpp b/src/common/backend/pgxc_single/barrier/barrier.cpp
index e21db40bc..8d1adb3a5 100755
--- a/src/common/backend/pgxc_single/barrier/barrier.cpp
+++ b/src/common/backend/pgxc_single/barrier/barrier.cpp
@@ -22,6 +22,8 @@
#include "libpq/libpq.h"
#include "libpq/pqformat.h"
#include "pgxc/barrier.h"
+#include "postmaster/barrier_creator.h"
+#include "postmaster/barrier_preparse.h"
#include "pgxc/execRemote.h"
#include "pgxc/locator.h"
#include "pgxc/pgxc.h"
@@ -32,14 +34,24 @@
#include "securec_check.h"
#include "utils/elog.h"
#include "replication/walreceiver.h"
+#include "replication/archive_walreceiver.h"
+
+#define atolsn(x) ((XLogRecPtr)strtoul((x), NULL, 0))
#ifdef ENABLE_MULTIPLE_NODES
-static const char* generate_barrier_id(const char* id);
-static PGXCNodeAllHandles* PrepareBarrier(const char* id);
-static void ExecuteBarrier(const char* id);
-static void EndBarrier(PGXCNodeAllHandles* handles, const char* id);
-static void WriteBarrierLSNFile(XLogRecPtr barrierLSN);
+static void PrepareBarrier(PGXCNodeAllHandles* prepared_handles, const char* id, bool isSwitchoverBarrier);
+static void ExecuteBarrier(const char* id, bool isSwitchoverBarrier = false);
+static void EndBarrier(PGXCNodeAllHandles* handles, const char* id, bool isSwitchoverBarrier = false);
+static void CommitBarrier(PGXCNodeAllHandles* prepared_handles, const char* id);
+static void WriteBarrierLSNFile(XLogRecPtr barrierLSN, const char* barrier_id);
+static void replace_barrier_id_compatible(const char* id, char** log_id);
+static void RequestXLogFromStream();
+static void barrier_redo_pause(char* barrierId);
+static bool TryBarrierLockWithTimeout();
+static void CheckBarrierCommandStatus(PGXCNodeAllHandles* conn_handles, const char* id, const char* command, bool isCn,
+ bool isSwitchoverBarrier = false);
#endif
+static const int BARRIER_LOCK_TIMEOUT_MS = 2000; // 2S
/*
* Prepare ourselves for an incoming BARRIER. We must disable all new 2PC
* commits and let the ongoing commits to finish. We then remember the
@@ -57,32 +69,35 @@ static void WriteBarrierLSNFile(XLogRecPtr barrierLSN);
* set a timeout. The lock should be release after the timeout and the
* barrier should be canceled.
*/
-void ProcessCreateBarrierPrepare(const char* id)
+void ProcessCreateBarrierPrepare(const char* id, bool isSwitchoverBarrier)
{
#ifndef ENABLE_MULTIPLE_NODES
DISTRIBUTED_FEATURE_NOT_SUPPORTED();
return;
#else
-
StringInfoData buf;
+ ereport(DEBUG1,
+ (errmsg("Receive CREATE BARRIER <%s> PREPARE message on Coordinator", id)));
if (!IS_PGXC_COORDINATOR || !IsConnFromCoord())
ereport(ERROR,
- (errcode(ERRCODE_INTERNAL_ERROR),
+ (errcode(ERRCODE_OPERATE_NOT_SUPPORTED),
errmsg("The CREATE BARRIER PREPARE message is expected to "
"arrive at a Coordinator from another Coordinator")));
-
- (void)LWLockAcquire(BarrierLock, LW_EXCLUSIVE);
+ if (isSwitchoverBarrier) {
+ if (!LWLockHeldByMe(BarrierLock))
+ LWLockAcquire(BarrierLock, LW_EXCLUSIVE);
+ } else {
+ if (!TryBarrierLockWithTimeout())
+ ereport(ERROR,
+ (errcode(ERRCODE_OPERATE_NOT_SUPPORTED),
+ errmsg("Wait Barrier lock timeout barrierId:%s", id)));
+ }
pq_beginmessage(&buf, 'b');
pq_sendstring(&buf, id);
pq_endmessage(&buf);
pq_flush();
-
- /*
- * TODO Start a timer to terminate the pending barrier after a specified
- * timeout
- */
#endif
}
@@ -96,28 +111,53 @@ void ProcessCreateBarrierEnd(const char* id)
DISTRIBUTED_FEATURE_NOT_SUPPORTED();
return;
#else
-
StringInfoData buf;
-
+ ereport(DEBUG1,
+ (errmsg("Receive CREATE BARRIER <%s> END message on Coordinator", id)));
if (!IS_PGXC_COORDINATOR || !IsConnFromCoord())
ereport(ERROR,
- (errcode(ERRCODE_INTERNAL_ERROR),
+ (errcode(ERRCODE_OPERATE_NOT_SUPPORTED),
errmsg("The CREATE BARRIER END message is expected to "
"arrive at a Coordinator from another Coordinator")));
-
- LWLockRelease(BarrierLock);
+ if (LWLockHeldByMe(BarrierLock))
+ LWLockRelease(BarrierLock);
pq_beginmessage(&buf, 'b');
pq_sendstring(&buf, id);
pq_endmessage(&buf);
pq_flush();
-
- /*
- * TODO Stop the timer
- */
#endif
}
+
+void ProcessCreateBarrierCommit(const char* id)
+{
+#ifndef ENABLE_MULTIPLE_NODES
+ DISTRIBUTED_FEATURE_NOT_SUPPORTED();
+ return;
+#else
+
+ StringInfoData buf;
+ ereport(DEBUG1,
+ (errmsg("Receive CREATE BARRIER <%s> COMMIT message on Coordinator", id)));
+ if (!IS_PGXC_COORDINATOR || !IsConnFromCoord())
+ ereport(ERROR,
+ (errcode(ERRCODE_OPERATE_NOT_SUPPORTED),
+ errmsg("The CREATE BARRIER COMMIT message is expected to "
+ "arrive at a Coordinator from another Coordinator")));
+ XLogBeginInsert();
+ XLogRegisterData((char*)id, strlen(id) + 1);
+
+ XLogRecPtr recptr = XLogInsert(RM_BARRIER_ID, XLOG_BARRIER_COMMIT, InvalidBktId);
+ XLogWaitFlush(recptr);
+
+
+ pq_beginmessage(&buf, 'b');
+ pq_sendstring(&buf, id);
+ pq_endmessage(&buf);
+ pq_flush();
+#endif
+}
/*
* Execute the CREATE BARRIER command. Write a BARRIER WAL record and flush the
* WAL buffers to disk before returning to the caller. Writing the WAL record
@@ -129,11 +169,36 @@ void ProcessCreateBarrierExecute(const char* id, bool isSwitchoverBarrier)
DISTRIBUTED_FEATURE_NOT_SUPPORTED();
return;
#else
-
StringInfoData buf;
+ XLogRecPtr recptr;
+ char* log_id = (char*)id;
+ char barrierLsn[BARRIER_LSN_LENGTH];
+ int rc;
+
+ ereport(DEBUG1,
+ (errmsg("Receive CREATE BARRIER <%s> EXECUTE message on Coordinator or Datanode", id)));
+ if (!IsConnFromCoord())
+ ereport(ERROR,
+ (errcode(ERRCODE_OPERATE_NOT_SUPPORTED),
+ errmsg("The CREATE BARRIER EXECUTE message is expected to "
+ "arrive from a Coordinator")));
+
+ if (unlikely(t_thrd.proc->workingVersionNum < BACKUP_SLOT_VERSION_NUM)) {
+ replace_barrier_id_compatible(id, &log_id);
+ }
+
+ if (IS_CSN_BARRIER(id)) {
+ CommitSeqNo csn = CsnBarrierNameGetCsn(id);
+ if (csn == 0) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ (errmsg("Wrong barrier CSN."))));
+ }
+ UpdateNextMaxKnownCSN(csn);
+ }
if (isSwitchoverBarrier == true) {
- ereport(LOG, (errmsg("Handling DISASTER RECOVERY SWITCHOVER BARRIER.")));
+ ereport(LOG, (errmsg("Handling DISASTER RECOVERY SWITCHOVER BARRIER:<%s>.", id)));
// The access of all users is not blocked temporarily.
/*
* Force a checkpoint before starting the switchover. This will force dirty
@@ -142,88 +207,159 @@ void ProcessCreateBarrierExecute(const char* id, bool isSwitchoverBarrier)
RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT);
}
- if (!IsConnFromCoord())
- ereport(ERROR,
- (errcode(ERRCODE_INTERNAL_ERROR),
- errmsg("The CREATE BARRIER EXECUTE message is expected to "
- "arrive from a Coordinator")));
- {
- XLogRecData rdata[1];
- XLogRecPtr recptr;
+ XLogBeginInsert();
+ XLogRegisterData((char*)log_id, strlen(log_id) + 1);
- rdata[0].data = (char*)id;
- rdata[0].len = strlen(id) + 1;
- rdata[0].buffer = InvalidBuffer;
- rdata[0].next = NULL;
+ if (u_sess->attr.attr_storage.enable_cbm_tracking && IS_ROACH_BARRIER(id)) {
+ LWLockAcquire(CBMParseXlogLock, LW_EXCLUSIVE);
+ }
+ recptr = XLogInsert(RM_BARRIER_ID, isSwitchoverBarrier? XLOG_BARRIER_SWITCHOVER : XLOG_BARRIER_CREATE,
+ InvalidBktId);
+ XLogWaitFlush(recptr);
- recptr = XLogInsert(RM_BARRIER_ID, XLOG_BARRIER_CREATE, rdata, isSwitchoverBarrier);
- XLogWaitFlush(recptr);
+ if (IS_CSN_BARRIER(id) && !isSwitchoverBarrier) {
+ SpinLockAcquire(&g_instance.streaming_dr_cxt.mutex);
+ rc = strncpy_s((char *)g_instance.streaming_dr_cxt.currentBarrierId, MAX_BARRIER_ID_LENGTH,
+ id, MAX_BARRIER_ID_LENGTH - 1);
+ securec_check(rc, "\0", "\0");
+ SpinLockRelease(&g_instance.streaming_dr_cxt.mutex);
+ ereport(DEBUG4, (errmodule(MOD_RTO_RPO), errmsg("refresh currentBarrier, barrier id %s", id)));
+ }
+
+ // record disaster recovery barrier lsn
+ if (IS_CSN_BARRIER(id) || IS_HADR_BARRIER(id)) {
+ pg_atomic_init_u64(&g_instance.archive_obs_cxt.barrierLsn, recptr);
+ rc = snprintf_s(barrierLsn, BARRIER_LSN_LENGTH, BARRIER_LSN_LENGTH - 1, "0x%lx", recptr);
+ securec_check_ss_c(rc, "\0", "\0");
+ } else {
+ if (u_sess->attr.attr_storage.enable_cbm_tracking) {
+ (void)ForceTrackCBMOnce(recptr, 0, false, true);
+ }
+ WriteBarrierLSNFile(recptr, id);
+ }
+
+ if (isSwitchoverBarrier) {
+ g_instance.streaming_dr_cxt.switchoverBarrierLsn = recptr;
}
pq_beginmessage(&buf, 'b');
pq_sendstring(&buf, id);
+ pq_sendstring(&buf, barrierLsn);
pq_endmessage(&buf);
pq_flush();
+
+ if (unlikely(log_id != id)) {
+ pfree_ext(log_id);
+ }
#endif
}
-void RequestBarrier(const char* id, char* completionTag, bool isSwitchoverBarrier)
+#ifdef ENABLE_MULTIPLE_NODES
+static void ExecBarrierOnFirstExecCnNode(const char* id, const char* firstExecNode, char* completionTag)
+{
+ int rc = 0;
+ char queryString[MAX_BARRIER_SQL_LENGTH] = {0};
+
+ rc = sprintf_s(queryString, MAX_BARRIER_SQL_LENGTH, "create barrier '%s';", id);
+ securec_check_ss(rc, "\0", "\0");
+ ereport(LOG, (errmsg("Send <%s> to First Exec Coordinator <%s>", queryString, firstExecNode)));
+
+ if (!IsConnFromCoord()) {
+ RemoteQuery* step = makeNode(RemoteQuery);
+ step->combine_type = COMBINE_TYPE_SAME;
+ step->sql_statement = pstrdup(queryString);
+ step->force_autocommit = false;
+ step->exec_type = EXEC_ON_COORDS;
+ step->is_temp = false;
+ ExecRemoteUtilityParallelBarrier(step, firstExecNode);
+ pfree_ext(step->sql_statement);
+ pfree_ext(step);
+ if (completionTag != NULL) {
+ rc = sprintf_s(completionTag, COMPLETION_TAG_BUFSIZE, "BARRIER %s", id);
+ securec_check_ss(rc, "\0", "\0");
+ }
+ }
+}
+#endif
+
+void RequestBarrier(char* id, char* completionTag, bool isSwitchoverBarrier)
{
#ifndef ENABLE_MULTIPLE_NODES
DISTRIBUTED_FEATURE_NOT_SUPPORTED();
return;
#else
+ if (id == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_OPERATE_NOT_SUPPORTED), errmsg("CREATE BARRIER with no barrier name.")));
+ PGXCNodeAllHandles* coord_handles = NULL;
+ char* barrier_id = id;
+ bool isCsnBarrier = (strcmp(id, CSN_BARRIER_NAME) == 0);
+ int rc = 0;
- PGXCNodeAllHandles* prepared_handles = NULL;
- const char* barrier_id = NULL;
-
- elog(DEBUG1, "CREATE BARRIER request received");
+ ereport(DEBUG1, (errmsg("CREATE BARRIER request received")));
/*
* Ensure that we are a Coordinator and the request is not from another
* coordinator
*/
if (!IS_PGXC_COORDINATOR)
- ereport(
- ERROR, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("CREATE BARRIER command must be sent to a Coordinator")));
-
- if (IsConnFromCoord())
ereport(ERROR,
- (errcode(ERRCODE_INTERNAL_ERROR),
- errmsg("CREATE BARRIER command is not expected from another Coordinator")));
+ (errcode(ERRCODE_OPERATE_NOT_SUPPORTED), errmsg("CREATE BARRIER command must be sent to a Coordinator")));
+
+ /* only superuser or operation-admin user can create barrier */
+ if (!superuser() && !(isOperatoradmin(GetUserId()) && u_sess->attr.attr_security.operation_mode))
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ (errmsg("Must be system admin or operator admin in operation mode to create barrier."))));
+
+ ereport(LOG, (errmsg("CREATE BARRIER <%s>", barrier_id)));
/*
- * Get a barrier id if the user has not supplied it
+ * Ensure all barrier commond execuet on first coordinator
*/
- barrier_id = generate_barrier_id(id);
-
- elog(DEBUG1, "CREATE BARRIER <%s>", barrier_id);
+ char* firstExecNode = find_first_exec_cn();
+ bool isFirstNode = (strcmp(firstExecNode, g_instance.attr.attr_common.PGXCNodeName) == 0);
+ if (isFirstNode == false) {
+ ExecBarrierOnFirstExecCnNode(barrier_id, firstExecNode, completionTag);
+ return;
+ }
/*
* Step One. Prepare all Coordinators for upcoming barrier request
*/
- prepared_handles = PrepareBarrier(barrier_id);
+ coord_handles = get_handles(NIL, GetAllCoordNodes(), true);
+ PrepareBarrier(coord_handles, barrier_id, isSwitchoverBarrier);
+
+ if (isCsnBarrier)
+ GetCsnBarrierName(barrier_id, isSwitchoverBarrier);
/*
* Step two. Issue BARRIER command to all involved components, including
* Coordinators and Datanodes
*/
- ExecuteBarrier(barrier_id);
+ ExecuteBarrier(barrier_id, isSwitchoverBarrier);
/*
- * Step three. Inform Coordinators about a successfully completed barrier
+ * Step three. Inform Coordinators to release barrier lock
*/
- EndBarrier(prepared_handles, barrier_id);
+ EndBarrier(coord_handles, barrier_id, isSwitchoverBarrier);
+
+ /*
+ * Step four. Inform Coordinators about a successfully completed barrier
+ */
+ if (!isSwitchoverBarrier)
+ CommitBarrier(coord_handles, barrier_id);
+
/* Finally report the barrier to GTM to backup its restart point */
- ReportBarrierGTM((char*)barrier_id);
+ ReportBarrierGTM(barrier_id);
/* Free the handles */
- pfree_pgxc_all_handles(prepared_handles);
+ pfree_pgxc_all_handles(coord_handles);
- if (completionTag) {
- int rc = snprintf_s(completionTag, COMPLETION_TAG_BUFSIZE, COMPLETION_TAG_BUFSIZE - 1, "BARRIER %s", barrier_id);
- securec_check_ss(rc, "", "");
+ if (completionTag != NULL) {
+ rc = sprintf_s(completionTag, COMPLETION_TAG_BUFSIZE, "BARRIER %s", barrier_id);
+ securec_check_ss(rc, "\0", "\0");
}
-
+ ereport(u_sess->attr.attr_storage.HaModuleDebug ? LOG : DEBUG2, (errmsg("Create Barrier Success %s", barrier_id)));
#endif
}
@@ -244,7 +380,7 @@ void DisasterRecoveryRequestBarrier(const char* id, bool isSwitchoverBarrier)
LWLockAcquire(BarrierLock, LW_EXCLUSIVE);
if (isSwitchoverBarrier == true) {
- ereport(LOG, (errmsg("This is DISASTER RECOVERY SWITCHOVER BARRIER.")));
+ ereport(LOG, (errmsg("This is DISASTER RECOVERY SWITCHOVER BARRIER:<%s>.", id)));
// The access of all users is not blocked temporarily.
/*
* Force a checkpoint before starting the switchover. This will force dirty
@@ -256,9 +392,13 @@ void DisasterRecoveryRequestBarrier(const char* id, bool isSwitchoverBarrier)
XLogBeginInsert();
XLogRegisterData((char*)id, strlen(id) + 1);
- recptr = XLogInsert(RM_BARRIER_ID, XLOG_BARRIER_CREATE, false, InvalidBktId, isSwitchoverBarrier);
+ recptr = XLogInsert(RM_BARRIER_ID, XLOG_BARRIER_CREATE, InvalidBktId);
XLogWaitFlush(recptr);
-
+#ifndef ENABLE_LITE_MODE
+ if (t_thrd.role == BARRIER_CREATOR) {
+ UpdateGlobalBarrierListOnMedia(id, g_instance.attr.attr_common.PGXCNodeName);
+ }
+#endif
SpinLockAcquire(&g_instance.archive_obs_cxt.barrier_lock);
pg_atomic_init_u64(&g_instance.archive_obs_cxt.barrierLsn, recptr);
rc = memcpy_s(g_instance.archive_obs_cxt.barrierName, MAX_BARRIER_ID_LENGTH, id, strlen(id));
@@ -293,28 +433,613 @@ void CreateHadrSwitchoverBarrier()
XLogBeginInsert();
XLogRegisterData((char*)barrier_id, strlen(barrier_id) + 1);
- recptr = XLogInsert(RM_BARRIER_ID, XLOG_BARRIER_CREATE, false, InvalidBktId, true);
+ recptr = XLogInsert(RM_BARRIER_ID, XLOG_BARRIER_SWITCHOVER, InvalidBktId);
XLogWaitFlush(recptr);
g_instance.streaming_dr_cxt.switchoverBarrierLsn = recptr;
}
-static void barrier_redo_pause()
+void barrier_redo(XLogReaderState* record)
{
+#ifdef ENABLE_MULTIPLE_NODES
+ int rc = 0;
+ uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
+ if (info == XLOG_BARRIER_COMMIT)
+ return;
+ Assert(!XLogRecHasAnyBlockRefs(record));
volatile WalRcvData *walrcv = t_thrd.walreceiverfuncs_cxt.WalRcv;
- while (IS_DISASTER_RECOVER_MODE) {
- RedoInterruptCallBack();
- if ((strncmp((char *)walrcv->lastRecoveredBarrierId, (char *)walrcv->recoveryTargetBarrierId,
- BARRIER_ID_WITHOUT_TIMESTAMP_LEN) < 0 ||
- strcmp((char *)walrcv->lastRecoveredBarrierId + BARRIER_ID_WITHOUT_TIMESTAMP_LEN + 1,
- (char *)walrcv->recoveryTargetBarrierId + BARRIER_ID_WITHOUT_TIMESTAMP_LEN + 1) < 0) ||
- strcmp((char *)walrcv->lastRecoveredBarrierId, (char *)walrcv->recoveryStopBarrierId) == 0 ||
- strcmp((char *)walrcv->lastRecoveredBarrierId, (char *)walrcv->recoverySwitchoverBarrierId) == 0) {
+ /* Nothing to do */
+ XLogRecPtr barrierLSN = record->EndRecPtr;
+ char* barrierId = XLogRecGetData(record);
+ if (IS_HADR_BARRIER(barrierId) && IS_DISASTER_RECOVER_MODE) {
+ ereport(WARNING, (errmsg("The HADR barrier %s is not for streaming standby cluster", barrierId)));
+ return;
+ }
+ SpinLockAcquire(&walrcv->mutex);
+ if (BARRIER_LE(barrierId, (char *)walrcv->lastRecoveredBarrierId)) {
+ ereport(WARNING, (errmodule(MOD_REDO), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("The new redo barrier is smaller than the last one.")));
+ }
+ SpinLockRelease(&walrcv->mutex);
+
+ if ((strncmp((barrierId + BARRIER_ID_WITHOUT_TIMESTAMP_LEN),
+ HADR_SWITCHOVER_BARRIER_TAIL, strlen(HADR_SWITCHOVER_BARRIER_TAIL)) == 0) &&
+ (info == XLOG_BARRIER_SWITCHOVER)) {
+ walrcv->lastSwitchoverBarrierLSN = barrierLSN;
+ ereport(LOG, (errmsg("GET SWITCHOVER BARRIER <%s>, LSN <%X/%X>", barrierId,
+ (uint32)(walrcv->lastSwitchoverBarrierLSN >> 32),
+ (uint32)(walrcv->lastSwitchoverBarrierLSN))));
+ }
+
+ SpinLockAcquire(&walrcv->mutex);
+ walrcv->lastRecoveredBarrierLSN = barrierLSN;
+ rc = strncpy_s((char *)walrcv->lastRecoveredBarrierId, MAX_BARRIER_ID_LENGTH, barrierId, MAX_BARRIER_ID_LENGTH - 1);
+ securec_check_ss(rc, "\0", "\0");
+ SpinLockRelease(&walrcv->mutex);
+
+ if (info == XLOG_BARRIER_CREATE) {
+ WriteBarrierLSNFile(barrierLSN, barrierId);
+ }
+
+ if (!GTM_FREE_MODE && IS_CSN_BARRIER(barrierId)) {
+ CommitSeqNo csn = CsnBarrierNameGetCsn(barrierId);
+ UpdateXLogMaxCSN(csn);
+ if (t_thrd.xact_cxt.ShmemVariableCache->nextCommitSeqNo < csn + 1)
+ t_thrd.xact_cxt.ShmemVariableCache->nextCommitSeqNo = csn + 1;
+ }
+
+ if (!IS_DISASTER_RECOVER_MODE || XLogRecPtrIsInvalid(t_thrd.xlog_cxt.minRecoveryPoint) ||
+ XLByteLT(barrierLSN, t_thrd.xlog_cxt.minRecoveryPoint) ||
+ t_thrd.shemem_ptr_cxt.ControlFile->backupEndRequired) {
+ return;
+ }
+
+ if (g_instance.csn_barrier_cxt.barrier_hash_table != NULL) {
+ LWLockAcquire(g_instance.csn_barrier_cxt.barrier_hashtbl_lock, LW_EXCLUSIVE);
+ BarrierCacheDeleteBarrierId(barrierId);
+ LWLockRelease(g_instance.csn_barrier_cxt.barrier_hashtbl_lock);
+ ereport(LOG, (errmsg("remove barrierID %s from hash table", barrierId)));
+ }
+
+ SetXLogReplayRecPtr(record->ReadRecPtr, record->EndRecPtr);
+ CheckRecoveryConsistency();
+ UpdateMinRecoveryPoint(barrierLSN, false);
+
+ barrier_redo_pause(barrierId);
+#else
+ int rc = 0;
+ volatile WalRcvData *walrcv = t_thrd.walreceiverfuncs_cxt.WalRcv;
+ /* Nothing to do */
+ XLogRecPtr barrierLSN = record->EndRecPtr;
+ char* barrierId = XLogRecGetData(record);
+ uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
+ if (info == XLOG_BARRIER_COMMIT)
+ return;
+ if (BARRIER_LE(barrierId, (char *)walrcv->lastRecoveredBarrierId)) {
+ ereport(WARNING, (errmodule(MOD_REDO), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("The new redo barrier is smaller than the last one.")));
+ }
+
+ if (BARRIER_EQ(barrierId, HADR_SWITCHOVER_BARRIER_ID) && (info == XLOG_BARRIER_SWITCHOVER)) {
+ walrcv->lastSwitchoverBarrierLSN = barrierLSN;
+ ereport(LOG, (errmsg("GET SWITCHOVER BARRIER <%s>, LSN <%X/%X>", barrierId,
+ (uint32)(walrcv->lastSwitchoverBarrierLSN >> 32),
+ (uint32)(walrcv->lastSwitchoverBarrierLSN))));
+ }
+ SpinLockAcquire(&walrcv->mutex);
+ walrcv->lastRecoveredBarrierLSN = barrierLSN;
+ rc = strncpy_s((char *)walrcv->lastRecoveredBarrierId, MAX_BARRIER_ID_LENGTH, barrierId, MAX_BARRIER_ID_LENGTH - 1);
+ securec_check_ss(rc, "\0", "\0");
+ SpinLockRelease(&walrcv->mutex);
+#endif
+}
+
+bool is_barrier_pausable(const char* id)
+{
+ if (IS_CSN_BARRIER(id))
+ return true;
+ else
+ return false;
+}
+
+#ifdef ENABLE_MULTIPLE_NODES
+
+
+static void SaveAllNodeBarrierLsnInfo(const char* id, const PGXCNodeAllHandles* connHandles)
+{
+ int conn;
+ for (conn = 0; conn < connHandles->co_conn_count + connHandles->dn_conn_count; conn++) {
+ PGXCNodeHandle* handle = NULL;
+ if (conn < connHandles->co_conn_count)
+ handle = connHandles->coord_handles[conn];
+ else
+ handle = connHandles->datanode_handles[conn - connHandles->co_conn_count];
+
+ if (handle == NULL || handle->inBuffer == NULL) {
+ ereport(WARNING, (errmsg("SaveAllNodeBarrierLsnInfo get handle is NULL, conn: %d", conn)));
+ g_instance.archive_obs_cxt.barrier_lsn_info[conn].barrierLsn = 0;
+ g_instance.archive_obs_cxt.barrier_lsn_info[conn].nodeoid = 0;
+ break;
+ }
+
+ char* lsn = handle->inBuffer + 5 + strlen(id) + 1;
+ g_instance.archive_obs_cxt.barrier_lsn_info[conn].barrierLsn = atolsn(lsn);
+ g_instance.archive_obs_cxt.barrier_lsn_info[conn].nodeoid = handle->nodeoid;
+ }
+ errno_t errorno = memcpy_s(g_instance.archive_obs_cxt.barrierName, MAX_BARRIER_ID_LENGTH, id, strlen(id) + 1);
+ securec_check(errorno, "\0", "\0");
+}
+
+void barrier_desc(StringInfo buf, uint8 xl_info, char* rec)
+{
+ Assert(xl_info == XLOG_BARRIER_CREATE);
+ appendStringInfo(buf, "BARRIER %s", rec);
+}
+
+static void SendBarrierRequestToCns(PGXCNodeAllHandles* coord_handles, const char* id, const char* cmd, char type)
+{
+ int conn;
+ int msglen;
+ int barrier_idlen;
+ errno_t rc;
+
+ /* Ensure that get all coordinators cnt not include current node itself */
+ if (u_sess->pgxc_cxt.NumCoords == coord_handles->co_conn_count) {
+ ereport(ERROR,
+ (errcode(ERRCODE_OPERATE_FAILED),
+ errmsg("Failed to send %s request"
+ "get all cn_conn: %d", cmd,
+ coord_handles->co_conn_count)));
+ }
+
+ for (conn = 0; conn < coord_handles->co_conn_count; conn++) {
+ PGXCNodeHandle* handle = coord_handles->coord_handles[conn];
+
+ /* Invalid connection state, return error */
+ if (handle->state != DN_CONNECTION_STATE_IDLE) {
+ ereport(ERROR,
+ (errcode(ERRCODE_OPERATE_FAILED),
+ errmsg("Failed to send %s request "
+ "to the node", cmd)));
+ }
+
+ barrier_idlen = strlen(id) + 1;
+
+ msglen = 4; /* for the length itself */
+ msglen += barrier_idlen;
+ msglen += 1; /* for barrier command itself */
+
+ /* msgType + msgLen */
+ ensure_out_buffer_capacity(1 + msglen, handle);
+
+ Assert(handle->outBuffer != NULL);
+ handle->outBuffer[handle->outEnd++] = 'b';
+ msglen = htonl(msglen);
+ rc = memcpy_s(handle->outBuffer + handle->outEnd, handle->outSize - handle->outEnd, &msglen, sizeof(int));
+ securec_check(rc, "\0", "\0");
+ handle->outEnd += 4;
+
+ handle->outBuffer[handle->outEnd++] = type;
+
+ rc = memcpy_s(handle->outBuffer + handle->outEnd, handle->outSize - handle->outEnd, id, barrier_idlen);
+ securec_check(rc, "\0", "\0");
+ handle->outEnd += barrier_idlen;
+
+ handle->state = DN_CONNECTION_STATE_QUERY;
+
+ pgxc_node_flush(handle);
+ }
+}
+
+static void CheckBarrierCommandStatus(PGXCNodeAllHandles* conn_handles, const char* id, const char* command, bool isCn,
+ bool isSwitchoverBarrier)
+{
+ int conn;
+ int count = isCn? conn_handles->co_conn_count : conn_handles->dn_conn_count;
+ RemoteQueryState* combiner = NULL;
+ struct timeval timeout;
+ timeout.tv_sec = ERROR_CHECK_TIMEOUT;
+ timeout.tv_usec = 0;
+ ereport(DEBUG1, (errmsg("Check CREATE BARRIER <%s> %s command status", id, command)));
+
+ combiner = CreateResponseCombiner(count, COMBINE_TYPE_NONE);
+
+ for (conn = 0; conn < count; conn++) {
+ PGXCNodeHandle* handle = NULL;
+
+ if (isCn)
+ handle = conn_handles->coord_handles[conn];
+ else
+ handle = conn_handles->datanode_handles[conn];
+
+ if (pgxc_node_receive(1, &handle, (isCn && !isSwitchoverBarrier)? &timeout : NULL))
+ ereport(
+ ERROR, (errcode(ERRCODE_OPERATE_FAILED), errmsg("Failed to receive response from the remote side")));
+ if (handle_response(handle, combiner) != RESPONSE_BARRIER_OK)
+ ereport(ERROR,
+ (errcode(ERRCODE_OPERATE_FAILED),
+ errmsg("CREATE BARRIER command %s failed with error %s", command, handle->error)));
+ }
+ CloseCombiner(combiner);
+
+ ereport(DEBUG1,
+ (errmsg("Successfully completed CREATE BARRIER <%s> %s command on "
+ "all nodes",
+ id,
+ command)));
+}
+
+static bool TryBarrierLockWithTimeout()
+{
+ bool getLock = false;
+ if (LWLockHeldByMe(BarrierLock)) {
+ getLock = true;
+ } else {
+ TimestampTz start_time = GetCurrentTimestamp();
+ do {
+ if(LWLockConditionalAcquire(BarrierLock, LW_EXCLUSIVE)) {
+ getLock = true;
+ break;
+ }
+ pg_usleep(1000L);
+ } while (ComputeTimeStamp(start_time) < BARRIER_LOCK_TIMEOUT_MS);
+ }
+ return getLock;
+}
+
+/*
+ * Prepare all Coordinators for barrier. During this step all the Coordinators
+ * are informed to suspend any new 2PC transactions. The Coordinators should
+ * disable new 2PC transactions and then wait for the existing transactions to
+ * complete. Once all "in-flight" 2PC transactions are over, the Coordinators
+ * respond back.
+ *
+ * That completes the first step in barrier generation
+ *
+ * Any errors will be reported via ereport.
+ */
+static void PrepareBarrier(PGXCNodeAllHandles* coord_handles, const char* id, bool isSwitchoverBarrier)
+{
+ ereport(DEBUG1, (errmsg("Preparing Coordinators for BARRIER")));
+ /*
+ * Send a CREATE BARRIER PREPARE message to all the Coordinators. We should
+ * send an asynchronous request so that we can disable local commits and
+ * then wait for the remote Coordinators to finish the work
+ */
+ SendBarrierRequestToCns(coord_handles, id, isSwitchoverBarrier? "CREATE SWITCHOVER BARRIER PREPARE" :
+ "CREATE BARRIER PREPARE", isSwitchoverBarrier? CREATE_SWITCHOVER_BARRIER_PREPARE : CREATE_BARRIER_PREPARE);
+
+ /*
+ * Disable local commits
+ */
+
+ if (isSwitchoverBarrier) {
+ if (!LWLockHeldByMe(BarrierLock))
+ LWLockAcquire(BarrierLock, LW_EXCLUSIVE);
+ } else {
+ if (!TryBarrierLockWithTimeout())
+ ereport(ERROR,
+ (errcode(ERRCODE_OPERATE_NOT_SUPPORTED),
+ errmsg("Wait Barrier lock timeout barrierId:%s", id)));
+ }
+
+ ereport(DEBUG2, (errmsg("Disabled 2PC commits originating at the driving Coordinator")));
+
+ /*
+ * future Start a timer to cancel the barrier request in case of a timeout
+ */
+
+ /*
+ * Local in-flight commits are now over. Check status of the remote
+ * Coordinators
+ */
+ CheckBarrierCommandStatus(coord_handles, id, "PREPARE", true, isSwitchoverBarrier);
+}
+
+
+static void ExecuteBarrierOnNodes(const char* id, bool isSwitchoverBarrier, PGXCNodeAllHandles* conn_handles, bool isCn)
+{
+ int msglen;
+ int barrier_idlen;
+ errno_t rc = 0;
+ /*
+ * Send a CREATE BARRIER request to all nodes
+ */
+ int handleNum = isCn ? conn_handles->co_conn_count : conn_handles->dn_conn_count;
+ for (int conn = 0; conn < handleNum; conn++) {
+ PGXCNodeHandle* handle = NULL;
+
+ if (isCn)
+ handle = conn_handles->coord_handles[conn];
+ else
+ handle = conn_handles->datanode_handles[conn];
+
+ /* Invalid connection state, return error */
+ if (handle->state != DN_CONNECTION_STATE_IDLE)
+ ereport(ERROR,
+ (errcode(ERRCODE_OPERATE_FAILED),
+ errmsg("Failed to send CREATE BARRIER EXECUTE request "
+ "to the node")));
+
+ barrier_idlen = strlen(id) + 1;
+
+ msglen = 4; /* for the length itself */
+ msglen += barrier_idlen;
+ msglen += 1; /* for barrier command itself */
+
+ /* msgType + msgLen */
+ ensure_out_buffer_capacity(1 + msglen, handle);
+
+ Assert(handle->outBuffer != NULL);
+ handle->outBuffer[handle->outEnd++] = 'b';
+ msglen = htonl(msglen);
+ rc = memcpy_s(handle->outBuffer + handle->outEnd, handle->outSize - handle->outEnd, &msglen, sizeof(int));
+ securec_check(rc, "\0", "\0");
+ handle->outEnd += 4;
+
+ if (isSwitchoverBarrier) {
+ handle->outBuffer[handle->outEnd++] = CREATE_SWITCHOVER_BARRIER_EXECUTE;
+ } else {
+ handle->outBuffer[handle->outEnd++] = CREATE_BARRIER_EXECUTE;
+ }
+
+ rc = memcpy_s(handle->outBuffer + handle->outEnd, handle->outSize - handle->outEnd, id, barrier_idlen);
+ securec_check(rc, "\0", "\0");
+ handle->outEnd += barrier_idlen;
+
+ handle->state = DN_CONNECTION_STATE_QUERY;
+ pgxc_node_flush(handle);
+ }
+
+ CheckBarrierCommandStatus(conn_handles, id, "EXECUTE", isCn, isSwitchoverBarrier);
+}
+
+
+/*
+ * Execute the barrier command on all the components, including Datanodes and
+ * Coordinators.
+ */
+static void ExecuteBarrier(const char* id, bool isSwitchoverBarrier)
+{
+ List* barrierDataNodeList = GetAllDataNodes();
+ List* barrierCoordList = GetAllCoordNodes();
+ PGXCNodeAllHandles* conn_handles = NULL;
+ XLogRecPtr recptr;
+ char* log_id = (char*)id;
+ int connCnt;
+ int rc;
+ conn_handles = get_handles(barrierDataNodeList, barrierCoordList, false);
+ connCnt = conn_handles->co_conn_count + conn_handles->dn_conn_count;
+
+ ereport(DEBUG1,
+ (errmsg("Sending CREATE BARRIER <%s> EXECUTE message to "
+ "Datanodes and Coordinator",
+ id)));
+ // first write barrier xlog to all dns
+ ExecuteBarrierOnNodes(id, isSwitchoverBarrier, conn_handles, false);
+ // then write barrier xlog to all other cns
+ ExecuteBarrierOnNodes(id, isSwitchoverBarrier, conn_handles, true);
+
+ if (unlikely(t_thrd.proc->workingVersionNum < BACKUP_SLOT_VERSION_NUM)) {
+ replace_barrier_id_compatible(id, &log_id);
+ }
+
+ if (IS_CSN_BARRIER(id)) {
+ CommitSeqNo csn = CsnBarrierNameGetCsn(id);
+ UpdateNextMaxKnownCSN(csn);
+ }
+
+ if (isSwitchoverBarrier == true) {
+ ereport(LOG, (errmsg("Sending DISASTER RECOVERY SWITCHOVER BARRIER:<%s>.", id)));
+ // The access of all users is not blocked temporarily.
+ /*
+ * Force a checkpoint before starting the switchover. This will force dirty
+ * buffers out to disk, to ensure source database is up-to-date on disk
+ */
+ RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT);
+ }
+
+ /*
+ * Also WAL log the BARRIER locally and flush the WAL buffers to disk
+ */
+ XLogBeginInsert();
+ XLogRegisterData((char*)log_id, strlen(log_id) + 1);
+
+ if (u_sess->attr.attr_storage.enable_cbm_tracking && IS_ROACH_BARRIER(id)) {
+ LWLockAcquire(CBMParseXlogLock, LW_EXCLUSIVE);
+ }
+ recptr = XLogInsert(RM_BARRIER_ID, isSwitchoverBarrier? XLOG_BARRIER_SWITCHOVER : XLOG_BARRIER_CREATE,
+ InvalidBktId);
+ XLogWaitFlush(recptr);
+
+ if (IS_CSN_BARRIER(id) && !isSwitchoverBarrier) {
+ SpinLockAcquire(&g_instance.streaming_dr_cxt.mutex);
+ rc = strncpy_s((char *)g_instance.streaming_dr_cxt.currentBarrierId, MAX_BARRIER_ID_LENGTH,
+ id, MAX_BARRIER_ID_LENGTH - 1);
+ securec_check(rc, "\0", "\0");
+ SpinLockRelease(&g_instance.streaming_dr_cxt.mutex);
+ ereport(DEBUG4, (errmodule(MOD_RTO_RPO), errmsg("refresh currentBarrier, barrier id %s", id)));
+ }
+
+ if (IS_ROACH_BARRIER(id)) {
+ if (u_sess->attr.attr_storage.enable_cbm_tracking) {
+ (void)ForceTrackCBMOnce(recptr, 0, false, true);
+ }
+ WriteBarrierLSNFile(recptr, id);
+ }
+
+ /* Only obs-based disaster recovery needs the following processing */
+ if (g_instance.archive_obs_cxt.archive_slot_num != 0 && g_instance.archive_obs_cxt.barrier_lsn_info != NULL) {
+ if (IS_HADR_BARRIER(id) || IS_CSN_BARRIER(id)) {
+ SpinLockAcquire(&g_instance.archive_obs_cxt.barrier_lock);
+ SaveAllNodeBarrierLsnInfo(id, conn_handles);
+ g_instance.archive_obs_cxt.barrier_lsn_info[connCnt].barrierLsn = recptr;
+ SpinLockRelease(&g_instance.archive_obs_cxt.barrier_lock);
+ }
+
+ if (t_thrd.role == BARRIER_CREATOR && !isSwitchoverBarrier) {
+ UpdateGlobalBarrierListOnMedia(id, g_instance.attr.attr_common.PGXCNodeName);
+ }
+ }
+
+ if (isSwitchoverBarrier) {
+ g_instance.streaming_dr_cxt.switchoverBarrierLsn = recptr;
+ }
+
+ list_free(barrierCoordList);
+ list_free(barrierDataNodeList);
+ pfree_pgxc_all_handles(conn_handles);
+ if (unlikely(log_id != id)) {
+ pfree_ext(log_id);
+ }
+}
+
+void CleanupBarrierLock()
+{
+ List* barrierCoordList = GetAllCoordNodes();
+ PGXCNodeAllHandles* conn_handles = NULL;
+ char* id = "cleanup";
+
+ conn_handles = get_handles(NULL, barrierCoordList, false);
+
+ if (LWLockHeldByMe(BarrierLock))
+ LWLockRelease(BarrierLock);
+
+ SendBarrierRequestToCns(conn_handles, id, "CREATE BARRIER CLEANUP", CREATE_BARRIER_END);
+
+ CheckBarrierCommandStatus(conn_handles, id, "CLEANUP", true);
+ pfree_pgxc_all_handles(conn_handles);
+}
+
+
+static void CommitBarrier(PGXCNodeAllHandles* prepared_handles, const char* id)
+{
+ SendBarrierRequestToCns(prepared_handles, id, "CREATE BARRIER COMMIT", CREATE_BARRIER_COMMIT);
+ CheckBarrierCommandStatus(prepared_handles, id, "COMMIT", true);
+ XLogBeginInsert();
+ XLogRegisterData((char*)id, strlen(id) + 1);
+
+ XLogRecPtr recptr = XLogInsert(RM_BARRIER_ID, XLOG_BARRIER_COMMIT, InvalidBktId);
+ XLogWaitFlush(recptr);
+}
+
+/*
+ * Resume 2PC commits on the local as well as remote Coordinators.
+ */
+static void EndBarrier(PGXCNodeAllHandles* prepared_handles, const char* id, bool isSwitchoverBarrier)
+{
+ /* Resume 2PC locally */
+ LWLockRelease(BarrierLock);
+
+ SendBarrierRequestToCns(prepared_handles, id, "CREATE BARRIER END", CREATE_BARRIER_END);
+
+ CheckBarrierCommandStatus(prepared_handles, id, "END", true, isSwitchoverBarrier);
+}
+
+static void WriteBarrierLSNFile(XLogRecPtr barrier_lsn, const char* barrier_id)
+{
+ char filename[MAXPGPATH] = {0};
+ const char *prefix = NULL;
+ errno_t errorno = EOK;
+ FILE* fp = NULL;
+
+ if (strncmp(barrier_id, ROACH_FULL_BAK_PREFIX, strlen(ROACH_FULL_BAK_PREFIX)) == 0) {
+ prefix = ROACH_FULL_BAK_PREFIX;
+ } else if (strncmp(barrier_id, ROACH_INC_BAK_PREFIX, strlen(ROACH_INC_BAK_PREFIX)) == 0) {
+ prefix = ROACH_INC_BAK_PREFIX;
+ } else {
+ return;
+ }
+
+ errorno = snprintf_s(filename, sizeof(filename), sizeof(filename) - 1, "%s.%s", BARRIER_LSN_FILE, prefix);
+ securec_check_ss(errorno, "\0", "\0");
+
+ fp = AllocateFile(filename, PG_BINARY_W);
+
+ if (fp == NULL)
+ ereport(ERROR, (errcode_for_file_access(), errmsg("could not create file \"%s\": %m", filename)));
+
+ if (fprintf(fp, "%08X/%08X", (uint32)(barrier_lsn >> 32), (uint32)barrier_lsn) != BARRIER_LSN_FILE_LENGTH ||
+ fflush(fp) != 0 || pg_fsync(fileno(fp)) != 0 || ferror(fp) || FreeFile(fp))
+ ereport(ERROR, (errcode_for_file_access(), errmsg("could not write file \"%s\": %m", filename)));
+}
+
+/*
+ * v5r1c20 barrier id: gs_roach_full_backupkey/gs_roach_inc_backupkey
+ * before: roach_barrier_backupkey
+ * To be compatible, during upgrade to v5r1c20, we still use old barrier name.
+ */
+void replace_barrier_id_compatible(const char* id, char** log_id) {
+ const char *prefix = NULL;
+ char *tmp_id = NULL;
+ int rc;
+ int len;
+
+ if (strncmp(id, ROACH_FULL_BAK_PREFIX, strlen(ROACH_FULL_BAK_PREFIX)) == 0) {
+ prefix = ROACH_FULL_BAK_PREFIX;
+ } else if (strncmp(id, ROACH_INC_BAK_PREFIX, strlen(ROACH_INC_BAK_PREFIX)) == 0) {
+ prefix = ROACH_INC_BAK_PREFIX;
+ } else {
+ return;
+ }
+
+ len = strlen(id) + strlen("roach_barrier");
+ tmp_id = (char *)palloc0(len);
+ rc = snprintf_s(tmp_id, len, len - 1, "%s%s", "roach_barrier", id + strlen(prefix));
+ securec_check_ss(rc, "", "");
+
+ *log_id = tmp_id;
+}
+
+static void RequestXLogFromStream()
+{
+ XLogRecPtr replayEndPtr = GetXLogReplayRecPtr(NULL);
+ if (t_thrd.xlog_cxt.is_cascade_standby && (CheckForSwitchoverTrigger() || CheckForFailoverTrigger())) {
+ HandleCascadeStandbyPromote(&replayEndPtr);
+ return;
+ }
+ if (!WalRcvInProgress() && g_instance.pid_cxt.WalReceiverPID == 0) {
+ volatile WalRcvData *walrcv = t_thrd.walreceiverfuncs_cxt.WalRcv;
+ SpinLockAcquire(&walrcv->mutex);
+ walrcv->receivedUpto = 0;
+ SpinLockRelease(&walrcv->mutex);
+ if (t_thrd.xlog_cxt.readFile >= 0) {
+ close(t_thrd.xlog_cxt.readFile);
+ t_thrd.xlog_cxt.readFile = -1;
+ }
+
+ RequestXLogStreaming(&replayEndPtr, t_thrd.xlog_cxt.PrimaryConnInfo, REPCONNTARGET_PRIMARY,
+ u_sess->attr.attr_storage.PrimarySlotName);
+ }
+
+}
+
+static void barrier_redo_pause(char* barrierId)
+{
+ if (!is_barrier_pausable(barrierId)) {
+ return;
+ }
+ volatile WalRcvData *walrcv = t_thrd.walreceiverfuncs_cxt.WalRcv;
+
+ while (true) {
+ SpinLockAcquire(&walrcv->mutex);
+ if (BARRIER_LT((char *)walrcv->lastRecoveredBarrierId, (char *)walrcv->recoveryTargetBarrierId) ||
+ BARRIER_LE((char *)walrcv->lastRecoveredBarrierId, (char *)walrcv->recoveryStopBarrierId)||
+ BARRIER_EQ((char *)walrcv->lastRecoveredBarrierId, (char *)walrcv->recoverySwitchoverBarrierId)) {
+ walrcv->isPauseByTargetBarrier = false;
+ SpinLockRelease(&walrcv->mutex);
break;
} else {
+ walrcv->isPauseByTargetBarrier = true;
+ SpinLockRelease(&walrcv->mutex);
pg_usleep(1000L);
- update_recovery_barrier();
+ RedoInterruptCallBack();
+ if(IS_OBS_DISASTER_RECOVER_MODE) {
+ update_recovery_barrier();
+ } else if (IS_DISASTER_RECOVER_MODE) {
+ RequestXLogFromStream();
+ }
ereport(DEBUG4, ((errmodule(MOD_REDO), errcode(ERRCODE_LOG),
errmsg("Sleeping to get a new target global barrier %s;"
"lastRecoveredBarrierId is %s; lastRecoveredBarrierLSN is %X/%X;"
@@ -331,359 +1056,4 @@ static void barrier_redo_pause()
}
}
}
-
-void barrier_redo(XLogReaderState* record)
-{
- ereport(LOG, (errmsg("barrier_redo begin.")));
- int rc = 0;
- volatile WalRcvData *walrcv = t_thrd.walreceiverfuncs_cxt.WalRcv;
- /* Nothing to do */
- XLogRecPtr barrierLSN = record->EndRecPtr;
- char* barrierId = XLogRecGetData(record);
-
- if (strcmp(barrierId, HADR_SWITCHOVER_BARRIER_ID) == 0) {
- walrcv->lastSwitchoverBarrierLSN = barrierLSN;
- ereport(LOG, (errmsg("GET SWITCHOVER BARRIER <%s>, LSN <%X/%X>", barrierId,
- (uint32)(walrcv->lastSwitchoverBarrierLSN >> 32),
- (uint32)(walrcv->lastSwitchoverBarrierLSN))));
- return;
- }
-
- walrcv->lastRecoveredBarrierLSN = barrierLSN;
- if (strcmp(barrierId, (char *)walrcv->lastRecoveredBarrierId) <= 0) {
- ereport(WARNING, (errmodule(MOD_REDO), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("The new redo barrier is smaller than the last one.")));
- }
-
- rc = strncpy_s((char *)walrcv->lastRecoveredBarrierId, MAX_BARRIER_ID_LENGTH, barrierId, MAX_BARRIER_ID_LENGTH - 1);
- securec_check_ss(rc, "\0", "\0");
-
- if (XLByteLE(barrierLSN, t_thrd.xlog_cxt.minRecoveryPoint)) {
- return;
- }
- UpdateMinRecoveryPoint(barrierLSN, false);
- barrier_redo_pause();
- return;
-}
-
-#ifdef ENABLE_MULTIPLE_NODES
-// 我们删除了的pg源码, 或者编译有问题的死代码
-
-static const char* generate_barrier_id(const char* id)
-{
- static const int LEN_GEN_ID = 1024;
- char genid[LEN_GEN_ID];
- TimestampTz ts;
-
- /*
- * If the caller can passed a NULL value, generate an id which is
- * guaranteed to be unique across the cluster. We use a combination of
- * the Coordinator node id and current timestamp.
- */
-
- if (id)
- return id;
-
- ts = GetCurrentTimestamp();
-#ifdef HAVE_INT64_TIMESTAMP
- int rc = snprintf_s(genid, LEN_GEN_ID, LEN_GEN_ID - 1, "%s_" INT64_FORMAT, PGXCNodeName, ts);
-#else
- int rc = snprintf_s(genid, LEN_GEN_ID, LEN_GEN_ID - 1, "%s_%.0f", PGXCNodeName, ts);
#endif
- securec_check_ss(rc, "", "");
- return pstrdup(genid);
-}
-
-void barrier_desc(StringInfo buf, uint8 xl_info, char* rec)
-{
- Assert(xl_info == XLOG_BARRIER_CREATE);
- appendStringInfo(buf, "BARRIER %s", rec);
-}
-
-static PGXCNodeAllHandles* SendBarrierPrepareRequest(List* coords, const char* id)
-{
- PGXCNodeAllHandles* coord_handles;
- int conn;
- int msglen;
- int barrier_idlen;
-
- coord_handles = get_handles(NIL, coords, true);
-
- for (conn = 0; conn < coord_handles->co_conn_count; conn++) {
- PGXCNodeHandle* handle = coord_handles->coord_handles[conn];
-
- /* Invalid connection state, return error */
- if (handle->state != DN_CONNECTION_STATE_IDLE)
- ereport(ERROR,
- (errcode(ERRCODE_INTERNAL_ERROR),
- errmsg("Failed to send CREATE BARRIER PREPARE request "
- "to the node")));
-
- barrier_idlen = strlen(id) + 1;
-
- msglen = 4; /* for the length itself */
- msglen += barrier_idlen;
- msglen += 1; /* for barrier command itself */
-
- /* msgType + msgLen */
- if (ensure_out_buffer_capacity(handle->outEnd + 1 + msglen, handle) != 0) {
- ereport(ERROR, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("Out of memory")));
- }
-
- handle->outBuffer[handle->outEnd++] = 'b';
- msglen = htonl(msglen);
- int rc = memcpy_s(handle->outBuffer + handle->outEnd, handle->outSize - handle->outEnd, &msglen, 4);
- securec_check(rc, "\0", "\0");
- handle->outEnd += 4;
-
- handle->outBuffer[handle->outEnd++] = CREATE_BARRIER_PREPARE;
-
- rc = memcpy_s(handle->outBuffer + handle->outEnd, handle->outSize - handle->outEnd, id, barrier_idlen);
- securec_check(rc, "\0", "\0");
- handle->outEnd += barrier_idlen;
-
- handle->state = DN_CONNECTION_STATE_QUERY;
-
- pgxc_node_flush(handle);
- }
-
- return coord_handles;
-}
-
-static void CheckBarrierCommandStatus(PGXCNodeAllHandles* conn_handles, const char* id, const char* command)
-{
- int conn;
- int count = conn_handles->co_conn_count + conn_handles->dn_conn_count;
-
- elog(DEBUG1, "Check CREATE BARRIER <%s> %s command status", id, command);
-
- for (conn = 0; conn < count; conn++) {
- PGXCNodeHandle* handle = NULL;
-
- if (conn < conn_handles->co_conn_count)
- handle = conn_handles->coord_handles[conn];
- else
- handle = conn_handles->datanode_handles[conn - conn_handles->co_conn_count];
-
- if (pgxc_node_receive(1, &handle, NULL))
- ereport(
- ERROR, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("Failed to receive response from the remote side")));
-
- if (handle_response(handle, NULL) != RESPONSE_BARRIER_OK)
- ereport(ERROR,
- (errcode(ERRCODE_INTERNAL_ERROR),
- errmsg("CREATE BARRIER PREPARE command failed "
- "with error %s",
- handle->error)));
- }
-
- elog(DEBUG1,
- "Successfully completed CREATE BARRIER <%s> %s command on "
- "all nodes",
- id,
- command);
-}
-
-static void SendBarrierEndRequest(PGXCNodeAllHandles* coord_handles, const char* id)
-{
- int conn;
- int msglen;
- int barrier_idlen;
-
- elog(DEBUG1, "Sending CREATE BARRIER <%s> END command to all Coordinators", id);
-
- for (conn = 0; conn < coord_handles->co_conn_count; conn++) {
- PGXCNodeHandle* handle = coord_handles->coord_handles[conn];
-
- /* Invalid connection state, return error */
- if (handle->state != DN_CONNECTION_STATE_IDLE)
- ereport(ERROR,
- (errcode(ERRCODE_INTERNAL_ERROR),
- errmsg("Failed to send CREATE BARRIER PREPARE request "
- "to the node")));
-
- barrier_idlen = strlen(id) + 1;
-
- msglen = 4; /* for the length itself */
- msglen += barrier_idlen;
- msglen += 1; /* for barrier command itself */
-
- /* msgType + msgLen */
- if (ensure_out_buffer_capacity(handle->outEnd + 1 + msglen, handle) != 0) {
- ereport(ERROR, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("Out of memory")));
- }
-
- handle->outBuffer[handle->outEnd++] = 'b';
- msglen = htonl(msglen);
- int rc = memcpy_s(handle->outBuffer + handle->outEnd, handle->outSize - handle->outEnd, &msglen, 4);
- securec_check(rc, "\0", "\0");
- handle->outEnd += 4;
-
- handle->outBuffer[handle->outEnd++] = CREATE_BARRIER_END;
-
- rc = memcpy_s(handle->outBuffer + handle->outEnd, handle->outSize - handle->outEnd, id, barrier_idlen);
- securec_check(rc, "\0", "\0");
- handle->outEnd += barrier_idlen;
-
- handle->state = DN_CONNECTION_STATE_QUERY;
- pgxc_node_flush(handle);
- }
-}
-
-/*
- * Prepare all Coordinators for barrier. During this step all the Coordinators
- * are informed to suspend any new 2PC transactions. The Coordinators should
- * disable new 2PC transactions and then wait for the existing transactions to
- * complete. Once all "in-flight" 2PC transactions are over, the Coordinators
- * respond back.
- *
- * That completes the first step in barrier generation
- *
- * Any errors will be reported via ereport.
- */
-static PGXCNodeAllHandles* PrepareBarrier(const char* id)
-{
- PGXCNodeAllHandles* coord_handles = NULL;
-
- elog(DEBUG1, "Preparing Coordinators for BARRIER");
-
- /*
- * Send a CREATE BARRIER PREPARE message to all the Coordinators. We should
- * send an asynchronous request so that we can disable local commits and
- * then wait for the remote Coordinators to finish the work
- */
- coord_handles = SendBarrierPrepareRequest(GetAllCoordNodes(), id);
-
- /*
- * Disable local commits
- */
- LWLockAcquire(BarrierLock, LW_EXCLUSIVE);
-
- elog(DEBUG2, "Disabled 2PC commits originating at the driving Coordinator");
-
- /*
- * TODO Start a timer to cancel the barrier request in case of a timeout
- */
-
- /*
- * Local in-flight commits are now over. Check status of the remote
- * Coordinators
- */
- CheckBarrierCommandStatus(coord_handles, id, "PREPARE");
-
- return coord_handles;
-}
-
-/*
- * Execute the barrier command on all the components, including Datanodes and
- * Coordinators.
- */
-static void ExecuteBarrier(const char* id)
-{
- List* barrierDataNodeList = GetAllDataNodes();
- List* barrierCoordList = GetAllCoordNodes();
- PGXCNodeAllHandles* conn_handles;
- int conn;
- int msglen;
- int barrier_idlen;
-
- conn_handles = get_handles(barrierDataNodeList, barrierCoordList, false);
-
- elog(DEBUG1,
- "Sending CREATE BARRIER <%s> EXECUTE message to "
- "Datanodes and Coordinator",
- id);
- /*
- * Send a CREATE BARRIER request to all the Datanodes and the Coordinators
- */
- for (conn = 0; conn < conn_handles->co_conn_count + conn_handles->dn_conn_count; conn++) {
- PGXCNodeHandle* handle = NULL;
-
- if (conn < conn_handles->co_conn_count)
- handle = conn_handles->coord_handles[conn];
- else
- handle = conn_handles->datanode_handles[conn - conn_handles->co_conn_count];
-
- /* Invalid connection state, return error */
- if (handle->state != DN_CONNECTION_STATE_IDLE)
- ereport(ERROR,
- (errcode(ERRCODE_INTERNAL_ERROR),
- errmsg("Failed to send CREATE BARRIER EXECUTE request "
- "to the node")));
-
- barrier_idlen = strlen(id) + 1;
-
- msglen = 4; /* for the length itself */
- msglen += barrier_idlen;
- msglen += 1; /* for barrier command itself */
-
- /* msgType + msgLen */
- if (ensure_out_buffer_capacity(handle->outEnd + 1 + msglen, handle) != 0) {
- ereport(ERROR, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("Out of memory")));
- }
-
- handle->outBuffer[handle->outEnd++] = 'b';
- msglen = htonl(msglen);
- int rc = memcpy_s(handle->outBuffer + handle->outEnd, handle->outSize - handle->outEnd, &msglen, 4);
- securec_check(rc, "\0", "\0");
- handle->outEnd += 4;
-
- handle->outBuffer[handle->outEnd++] = CREATE_BARRIER_EXECUTE;
-
- rc = memcpy_s(handle->outBuffer + handle->outEnd, handle->outSize - handle->outEnd, id, barrier_idlen);
- securec_check(rc, "\0", "\0");
- handle->outEnd += barrier_idlen;
-
- handle->state = DN_CONNECTION_STATE_QUERY;
- pgxc_node_flush(handle);
- }
-
- CheckBarrierCommandStatus(conn_handles, id, "EXECUTE");
-
- pfree_pgxc_all_handles(conn_handles);
-
- /*
- * Also WAL log the BARRIER locally and flush the WAL buffers to disk
- */
- {
- XLogRecData rdata[1];
- XLogRecPtr recptr;
-
- rdata[0].data = (char*)id;
- rdata[0].len = strlen(id) + 1;
- rdata[0].buffer = InvalidBuffer;
- rdata[0].next = NULL;
-
- recptr = XLogInsert(RM_BARRIER_ID, XLOG_BARRIER_CREATE, rdata);
- XLogWaitFlush(recptr);
- }
-}
-
-/*
- * Resume 2PC commits on the local as well as remote Coordinators.
- */
-static void EndBarrier(PGXCNodeAllHandles* prepared_handles, const char* id)
-{
- /* Resume 2PC locally */
- LWLockRelease(BarrierLock);
-
- SendBarrierEndRequest(prepared_handles, id);
-
- CheckBarrierCommandStatus(prepared_handles, id, "END");
-}
-
-static void WriteBarrierLSNFile(XLogRecPtr barrierLSN)
-{
- FILE* fp = NULL;
-
- fp = AllocateFile(BARRIER_LSN_FILE, PG_BINARY_W);
- if (fp == NULL)
- ereport(ERROR, (errcode_for_file_access(), errmsg("could not create file \"%s\": %m", BARRIER_LSN_FILE)));
-
- if (fprintf(fp, "%08X/%08X", (uint32)(barrierLSN >> 32), (uint32)barrierLSN) != BARRIER_LSN_FILE_LENGTH ||
- fflush(fp) != 0 || pg_fsync(fileno(fp)) != 0 || ferror(fp) || FreeFile(fp))
- ereport(ERROR, (errcode_for_file_access(), errmsg("could not write file \"%s\": %m", BARRIER_LSN_FILE)));
-}
-
-#endif
-
diff --git a/src/common/backend/pgxc_single/copy/remotecopy.cpp b/src/common/backend/pgxc_single/copy/remotecopy.cpp
index 197974565..e84d7f47b 100644
--- a/src/common/backend/pgxc_single/copy/remotecopy.cpp
+++ b/src/common/backend/pgxc_single/copy/remotecopy.cpp
@@ -68,8 +68,8 @@ void RemoteCopy_GetRelationLoc(RemoteCopyData* state, Relation rel, List* attnum
}
}
- state->idx_dist_by_col = -1;
- if (state->rel_loc && state->rel_loc->partAttrNum != 0) {
+ state->idx_dist_by_col = NULL;
+ if (state->rel_loc && state->rel_loc->partAttrNum != NULL) {
/*
* Find the column used as key for data distribution.
* First scan attributes of tuple descriptor with the list
@@ -79,15 +79,19 @@ void RemoteCopy_GetRelationLoc(RemoteCopyData* state, Relation rel, List* attnum
*/
if (attnums != NIL) {
ListCell* cur = NULL;
- foreach (cur, attnums) {
+ foreach (cur, state->rel_loc->partAttrNum) {
int attnum = lfirst_int(cur);
- if (state->rel_loc->partAttrNum == attnum) {
- state->idx_dist_by_col = attnum - 1;
- break;
+ if (list_member_int(attnums, attnum)) {
+ state->idx_dist_by_col = lappend_int(state->idx_dist_by_col, attnum - 1);
}
}
} else {
- state->idx_dist_by_col = state->rel_loc->partAttrNum - 1;
+ ListCell* cell = NULL;
+ AttrNumber num;
+ foreach (cell, state->rel_loc->partAttrNum) {
+ num = lfirst_int(cell);
+ state->idx_dist_by_col = lappend_int(state->idx_dist_by_col, num - 1);
+ }
}
}
@@ -126,15 +130,7 @@ void RemoteCopy_BuildStatement(
quote_qualified_identifier(get_namespace_name(RelationGetNamespace(rel)), RelationGetRelationName(rel)));
if (attnamelist != NIL) {
- ListCell* cell = NULL;
- ListCell* prev = NULL;
appendStringInfoString(&state->query_buf, " (");
- foreach (cell, attnamelist) {
- if (prev != NULL)
- appendStringInfoString(&state->query_buf, ", ");
- appendStringInfoString(&state->query_buf, quote_identifier(strVal(lfirst(cell))));
- prev = cell;
- }
/*
* For COPY FROM, we need to append unspecified attributes that have
@@ -151,14 +147,25 @@ void RemoteCopy_BuildStatement(
Expr* defexpr = (Expr*)build_column_default(rel, attnum);
if (defexpr && ((!pgxc_is_expr_shippable(expression_planner(defexpr), NULL)) ||
(list_member_int(state->idx_dist_by_col, attnum - 1)))) {
- appendStringInfoString(&state->query_buf, ", ");
appendStringInfoString(
&state->query_buf, quote_identifier(NameStr(tupDesc->attrs[attnum - 1]->attname)));
+ appendStringInfoString(&state->query_buf, ", ");
}
}
}
}
+ ListCell* cell = NULL;
+ foreach (cell, attnamelist) {
+ appendStringInfoString(&state->query_buf, quote_identifier(strVal(lfirst(cell))));
+ appendStringInfoString(&state->query_buf, ", ");
+ }
+ int blankPos = 1;
+ int delimPos = 1;
+ state->query_buf.data[state->query_buf.len - blankPos] = '\0';
+ state->query_buf.data[state->query_buf.len - blankPos - delimPos] = '\0';
+ state->query_buf.len -= (blankPos + delimPos);
+
appendStringInfoChar(&state->query_buf, ')');
}
@@ -288,6 +295,11 @@ void RemoteCopy_BuildStatement(
if (options->rco_fill_missing_fields)
appendStringInfoString(&state->query_buf, " FILL_MISSING_FIELDS");
+
+ if (options->transform_query_string) {
+ appendStringInfoChar(&state->query_buf, ' ');
+ appendStringInfoString(&state->query_buf, options->transform_query_string);
+ }
}
/*
@@ -301,15 +313,24 @@ RemoteCopyOptions* makeRemoteCopyOptions(void)
return NULL;
#else
RemoteCopyOptions* res = (RemoteCopyOptions*)palloc(sizeof(RemoteCopyOptions));
- res->rco_binary = false;
+ res->rco_format = FORMAT_UNKNOWN;
res->rco_oids = false;
- res->rco_csv_mode = false;
+ res->rco_without_escaping = false;
res->rco_delim = NULL;
res->rco_null_print = NULL;
res->rco_quote = NULL;
res->rco_escape = NULL;
+ res->rco_eol = NULL;
res->rco_force_quote = NIL;
res->rco_force_notnull = NIL;
+ res->rco_eol_type = EOL_NL;
+ res->rco_date_format = NULL;
+ res->rco_time_format = NULL;
+ res->rco_timestamp_format = NULL;
+ res->rco_smalldatetime_format = NULL;
+ res->rco_compatible_illegal_chars = false;
+ res->rco_ignore_extra_data = false;
+ res->rco_fill_missing_fields = false;
return res;
#endif
}
diff --git a/src/common/backend/pgxc_single/nodemgr/groupmgr.cpp b/src/common/backend/pgxc_single/nodemgr/groupmgr.cpp
index 677e8bf31..e290bd3d7 100644
--- a/src/common/backend/pgxc_single/nodemgr/groupmgr.cpp
+++ b/src/common/backend/pgxc_single/nodemgr/groupmgr.cpp
@@ -59,6 +59,7 @@
#include "storage/proc.h"
#include "utils/elog.h"
#include "utils/snapmgr.h"
+#include "utils/knl_relcache.h"
#define CHAR_BUF_SIZE 512
#define BUCKET_MAP_SIZE 32
@@ -2691,7 +2692,7 @@ static void PgxcGroupSetSeqNodes(const char* group_name, bool allnodes)
appendStringInfoString(&str, query);
}
- ReleaseCatCache(tp);
+ ReleaseSysCache(tp);
relation_close(relseq, AccessShareLock);
if (seqName != relName)
@@ -3581,7 +3582,7 @@ char* PgxcGroupGetStmtExecGroupInRedis()
static void BucketMapCacheAddEntry(Oid groupoid, Datum groupanme_datum, Datum bucketmap_datum, ItemPointer ctid)
{
/* BucketmapCache and its underlying element is allocated in u_sess.MEMORY_CONTEXT_EXECUTOR */
- MemoryContext oldcontext = MemoryContextSwitchTo(SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_EXECUTOR));
+ MemoryContext oldcontext = MemoryContextSwitchTo(LocalGBucketMapMemCxt());
/* Create bucketmap element */
BucketMapCache* bmc = (BucketMapCache*)palloc0(sizeof(BucketMapCache));
@@ -3598,7 +3599,7 @@ static void BucketMapCacheAddEntry(Oid groupoid, Datum groupanme_datum, Datum bu
elog(DEBUG2, "Add [%s][%u]'s bucketmap to BucketMapCache", bmc->groupname, groupoid);
/* Insert element into bucketmap */
- u_sess->relcache_cxt.g_bucketmap_cache = lappend(u_sess->relcache_cxt.g_bucketmap_cache, bmc);
+ AppendLocalRelCacheGBucketMapCache((ListCell *)bmc);
/* Swith back to original memory context */
MemoryContextSwitchTo(oldcontext);
@@ -3616,7 +3617,7 @@ static void BucketMapCacheAddEntry(Oid groupoid, Datum groupanme_datum, Datum bu
*/
static void BucketMapCacheRemoveEntry(Oid groupoid)
{
- if (u_sess->relcache_cxt.g_bucketmap_cache == NIL) {
+ if (LocalRelCacheGBucketMapCache() == NIL) {
/*
* We may run into here, when a new node group is drop but no table access
* of its table happened.
@@ -3631,7 +3632,7 @@ static void BucketMapCacheRemoveEntry(Oid groupoid)
ListCell* next = NULL;
bool found = false;
- for (cell = list_head(u_sess->relcache_cxt.g_bucketmap_cache); cell; cell = next) {
+ for (cell = list_head(LocalRelCacheGBucketMapCache()); cell; cell = next) {
BucketMapCache* bmc = (BucketMapCache*)lfirst(cell);
next = lnext(cell);
if (bmc->groupoid == groupoid) {
@@ -3642,8 +3643,7 @@ static void BucketMapCacheRemoveEntry(Oid groupoid)
pfree_ext(bmc->groupname);
/* Remove it from global bucketmap cache list */
- u_sess->relcache_cxt.g_bucketmap_cache =
- list_delete_cell(u_sess->relcache_cxt.g_bucketmap_cache, cell, prev);
+ DeteleLocalRelCacheGBucketMapCache(cell, prev);
pfree_ext(bmc);
break;
} else {
@@ -3704,7 +3704,7 @@ static void BucketMapCacheUpdate(BucketMapCache* bmc)
/*
* Name: ClearInvalidBucketMapCache()
*
- * Brief: clear invalid cell in t_thrd.pgxc_cxt.g_bucketmap_cache
+ * Brief: clear invalid cell in LocalRelCacheGBucketMapCache
*
* Parameters:
* none
@@ -3717,7 +3717,7 @@ static void ClearInvalidBucketMapCache(void)
ListCell* cell = NULL;
ListCell* next = NULL;
- for (cell = list_head(u_sess->relcache_cxt.g_bucketmap_cache); cell; cell = next) {
+ for (cell = list_head(LocalRelCacheGBucketMapCache()); cell; cell = next) {
next = lnext(cell);
BucketMapCache* bmc = (BucketMapCache*)lfirst(cell);
HeapTuple tuple = SearchSysCache1(PGXCGROUPOID, ObjectIdGetDatum(bmc->groupoid));
@@ -3728,8 +3728,8 @@ static void ClearInvalidBucketMapCache(void)
}
ReleaseSysCache(tuple);
}
- if ((unsigned int)list_length(u_sess->relcache_cxt.g_bucketmap_cache) >= u_sess->relcache_cxt.max_bucket_map_size) {
- u_sess->relcache_cxt.max_bucket_map_size *= 2;
+ if ((unsigned int)list_length(LocalRelCacheGBucketMapCache()) >= LocalRelCacheMaxBucketMapSize()) {
+ EnlargeLocalRelCacheMaxBucketMapSize(2);
}
}
@@ -3769,23 +3769,23 @@ uint2* BucketMapCacheGetBucketmap(Oid groupoid, int *bucketlen)
{
Assert(groupoid != InvalidOid);
- if (u_sess->relcache_cxt.g_bucketmap_cache == NIL) {
+ if (LocalRelCacheGBucketMapCache() == NIL) {
elog(DEBUG2, "Global bucketmap cache is not setup");
}
- if ((unsigned int)list_length(u_sess->relcache_cxt.g_bucketmap_cache) >= u_sess->relcache_cxt.max_bucket_map_size) {
+ if ((unsigned int)list_length(LocalRelCacheGBucketMapCache()) >= LocalRelCacheMaxBucketMapSize()) {
ClearInvalidBucketMapCache();
}
- while (u_sess->relcache_cxt.max_bucket_map_size / 2 >
- (unsigned int)list_length(u_sess->relcache_cxt.g_bucketmap_cache) &&
- u_sess->relcache_cxt.max_bucket_map_size / 2 > BUCKET_MAP_SIZE) {
- u_sess->relcache_cxt.max_bucket_map_size /= 2;
+ while (LocalRelCacheMaxBucketMapSize() / 2 >
+ (unsigned int)list_length(LocalRelCacheGBucketMapCache()) &&
+ LocalRelCacheMaxBucketMapSize() / 2 > BUCKET_MAP_SIZE) {
+ EnlargeLocalRelCacheMaxBucketMapSize(0.5);
}
ListCell* cell = NULL;
uint2* bucketmap = NULL;
/* Search bucketmap from cache */
- foreach (cell, u_sess->relcache_cxt.g_bucketmap_cache) {
+ foreach (cell, LocalRelCacheGBucketMapCache()) {
BucketMapCache* bmc = (BucketMapCache*)lfirst(cell);
if (bmc->groupoid == groupoid) {
diff --git a/src/common/backend/pgxc_single/nodemgr/nodemgr.cpp b/src/common/backend/pgxc_single/nodemgr/nodemgr.cpp
index 1ff247e5d..1d8987f76 100644
--- a/src/common/backend/pgxc_single/nodemgr/nodemgr.cpp
+++ b/src/common/backend/pgxc_single/nodemgr/nodemgr.cpp
@@ -742,6 +742,12 @@ void PgxcNodeGetOids(Oid** coOids, Oid** dnOids, int* num_coords, int* num_dns,
LWLockRelease(NodeTableLock);
}
+void PgxcNodeGetOidsForInit(Oid** coOids, Oid** dnOids, int* num_coords, int* num_dns, int * num_primaries, bool update_preferred)
+{
+ Assert(false);
+ DISTRIBUTED_FEATURE_NOT_SUPPORTED();
+}
+
void PgxcNodeGetStandbyOids(Oid** coOids, Oid** dnOids, int* numCoords, int* numStandbyDns, bool needInitPGXC)
{
LWLockAcquire(NodeTableLock, LW_SHARED);
diff --git a/src/common/backend/pgxc_single/pool/execRemote.cpp b/src/common/backend/pgxc_single/pool/execRemote.cpp
index 7d9d8135c..5ea7e91f4 100755
--- a/src/common/backend/pgxc_single/pool/execRemote.cpp
+++ b/src/common/backend/pgxc_single/pool/execRemote.cpp
@@ -303,6 +303,8 @@ RemoteQueryState* CreateResponseCombiner(int node_count, CombineType combine_typ
combiner->currentRow.msgnode = 0;
combiner->row_store = RowStoreAlloc(CurrentMemoryContext, ROW_STORE_MAX_MEM,
t_thrd.utils_cxt.CurrentResourceOwner);
+ combiner->maxCSN = InvalidCommitSeqNo;
+ combiner->hadrMainStandby = false;
combiner->tapenodes = NULL;
combiner->remoteCopyType = REMOTE_COPY_NONE;
combiner->copy_file = NULL;
@@ -2774,14 +2776,6 @@ void pgxc_node_remote_commit(bool barrierLockHeld)
/* white-box test inject end */
}
#endif
- /*
- * only send to the node whose command = commitCmd
- * ignore the commit prepared situation which has been checked in PrepareTransaction()
- */
- if (u_sess->pgxc_cxt.remoteXactState->remoteNodeStatus[i] == RXACT_NODE_NONE) {
- pgxc_node_send_gxid(connections[i], t_thrd.xact_cxt.XactXidStoreForCheck, true);
- }
-
if (pgxc_node_send_queryid(connections[i], u_sess->debug_query_id) != 0) {
const int dest_max = 256;
rc = sprintf_s(errMsg,
@@ -3053,9 +3047,6 @@ int pgxc_node_remote_abort(void)
new_connections[new_conn_count++] = connections[i];
}
} else {
- /* only send to the node whose command is rollbackCmd , not rollback prepared */
- pgxc_node_send_gxid(connections[i], t_thrd.xact_cxt.XactXidStoreForCheck, true);
-
if (pgxc_node_send_query(connections[i], rollbackCmd)) {
rc = sprintf_s(errMsg,
ERRMSG_BUFF_SIZE,
@@ -6800,12 +6791,12 @@ HeapTuple* RecvRemoteSampleMessage(
*/
void PGXCNodeCleanAndRelease(int code, Datum arg)
{
- /* clean gpc cn refcount and plancache in shared memory */
- CNGPCCleanUpSession();
-
/* Clean up prepared transactions before releasing connections */
DropAllPreparedStatements();
+ /* clean saved plan but not save into gpc */
+ GPCCleanUpSessionSavedPlan();
+
/* Release Datanode connections */
release_handles();
diff --git a/src/common/backend/pgxc_single/pool/pgxcnode.cpp b/src/common/backend/pgxc_single/pool/pgxcnode.cpp
index 80be29ceb..e1f0559cb 100644
--- a/src/common/backend/pgxc_single/pool/pgxcnode.cpp
+++ b/src/common/backend/pgxc_single/pool/pgxcnode.cpp
@@ -1444,6 +1444,8 @@ pgxc_node_all_free(void)
u_sess->pgxc_cxt.NumCoords = 0;
u_sess->pgxc_cxt.dn_handles = NULL;
u_sess->pgxc_cxt.NumDataNodes = 0;
+ u_sess->pgxc_cxt.NumTotalDataNodes = 0;
+ u_sess->pgxc_cxt.NumStandbyDataNodes = 0;
u_sess->pgxc_cxt.primary_data_node = InvalidOid;
u_sess->pgxc_cxt.num_preferred_data_nodes = 0;
}
diff --git a/src/common/backend/pgxc_single/pool/poolutils.cpp b/src/common/backend/pgxc_single/pool/poolutils.cpp
index 650096aec..55e64f67a 100755
--- a/src/common/backend/pgxc_single/pool/poolutils.cpp
+++ b/src/common/backend/pgxc_single/pool/poolutils.cpp
@@ -61,6 +61,30 @@ Datum pgxc_pool_check(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(PoolManagerCheckConnectionInfo());
}
+Datum pgxc_disaster_read_set(PG_FUNCTION_ARGS)
+{
+ DISTRIBUTED_FEATURE_NOT_SUPPORTED();
+ PG_RETURN_BOOL(false);
+}
+
+Datum pgxc_disaster_read_init(PG_FUNCTION_ARGS)
+{
+ DISTRIBUTED_FEATURE_NOT_SUPPORTED();
+ PG_RETURN_BOOL(false);
+}
+
+Datum pgxc_disaster_read_clear(PG_FUNCTION_ARGS)
+{
+ DISTRIBUTED_FEATURE_NOT_SUPPORTED();
+ PG_RETURN_BOOL(false);
+}
+
+Datum pgxc_disaster_read_status(PG_FUNCTION_ARGS)
+{
+ DISTRIBUTED_FEATURE_NOT_SUPPORTED();
+ PG_RETURN_NULL();
+}
+
/*
* pgxc_pool_reload
*
diff --git a/src/common/backend/tsearch/ts_utils.cpp b/src/common/backend/tsearch/ts_utils.cpp
index 3b00e6a8a..f12b01d7e 100644
--- a/src/common/backend/tsearch/ts_utils.cpp
+++ b/src/common/backend/tsearch/ts_utils.cpp
@@ -55,7 +55,7 @@ char* get_tsfile_prefix_tmp(bool isExecCN)
"%s/tsearch_data/%ld%lu",
tmpSharepath,
GetCurrentTransactionStartTimestamp(),
- (GTM_MODE) ? (GetCurrentTransactionId()) : (isExecCN ? GetCurrentTransactionId() : t_thrd.xact_cxt.cn_xid));
+ (isExecCN ? GetCurrentTransactionId() : t_thrd.xact_cxt.cn_xid));
/* We need to check for my_exec_path */
check_backend_env(strinfo.data);
diff --git a/src/common/backend/utils/adt/CMakeLists.txt b/src/common/backend/utils/adt/CMakeLists.txt
index 78c07a9c9..b33909070 100755
--- a/src/common/backend/utils/adt/CMakeLists.txt
+++ b/src/common/backend/utils/adt/CMakeLists.txt
@@ -8,7 +8,6 @@ set(TGT_adt_INC
${PROJECT_TRUNK_DIR}/distribute/include
${PROJECT_SRC_DIR}/include
${PROJECT_SRC_DIR}/lib/gstrace
- ${LIBXML_INCLUDE_PATH}/libxml2
${LZ4_INCLUDE_PATH}
${ZLIB_INCLUDE_PATH}
${LIBOPENSSL_INCLUDE_PATH}
diff --git a/src/common/backend/utils/adt/Makefile b/src/common/backend/utils/adt/Makefile
index 59699cb22..c18e3f113 100644
--- a/src/common/backend/utils/adt/Makefile
+++ b/src/common/backend/utils/adt/Makefile
@@ -34,12 +34,12 @@ OBJS = acl.o arrayfuncs.o array_selfuncs.o array_typanalyze.o \
tid.o timestamp.o varbit.o varchar.o varlena.o version.o xid.o \
network.o mac.o inet_cidr_ntop.o inet_net_pton.o \
ri_triggers.o pg_lzcompress.o pg_lsn.o pg_locale.o formatting.o \
- ascii.o quote.o pgstatfuncs.o encode.o dbsize.o genfile.o trigfuncs.o \
+ ascii.o quote.o pgxlogstatfuncs.o pgundostatfuncs.o pgstatfuncs.o encode.o dbsize.o genfile.o trigfuncs.o \
tsginidx.o tsgistidx.o tsquery.o tsquery_cleanup.o tsquery_gist.o \
tsquery_op.o tsquery_rewrite.o tsquery_util.o tsrank.o \
tsvector.o tsvector_op.o tsvector_parser.o \
txid.o uuid.o windowfuncs.o xml.o extended_statistics.o clientlogic_bytea.o clientlogicsettings.o \
- median_aggs.o expr_distinct.o nlssort.o first_last_agg.o
+ median_aggs.o expr_distinct.o nlssort.o memory_func.o first_last_agg.o
like.o: like.cpp like_match.cpp
diff --git a/src/common/backend/utils/adt/a_compat.cpp b/src/common/backend/utils/adt/a_compat.cpp
index 3432b6eaf..9078e49cf 100644
--- a/src/common/backend/utils/adt/a_compat.cpp
+++ b/src/common/backend/utils/adt/a_compat.cpp
@@ -39,6 +39,11 @@ static text* dotrim(const char* string, int stringlen, const char* set, int setl
Datum lower(PG_FUNCTION_ARGS)
{
text* in_string = PG_GETARG_TEXT_PP(0);
+ if (unlikely(VARATT_IS_HUGE_TOAST_POINTER(in_string))) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("lower() arguments cannot exceed 1GB")));
+ }
char* out_string = NULL;
text* result = NULL;
@@ -66,6 +71,11 @@ Datum lower(PG_FUNCTION_ARGS)
Datum upper(PG_FUNCTION_ARGS)
{
text* in_string = PG_GETARG_TEXT_PP(0);
+ if (unlikely(VARATT_IS_HUGE_TOAST_POINTER(in_string))) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("upper() arguments cannot exceed 1GB")));
+ }
char* out_string = NULL;
text* result = NULL;
@@ -637,7 +647,15 @@ Datum rtrim1(PG_FUNCTION_ARGS)
text* string = PG_GETARG_TEXT_PP(0);
text* ret = NULL;
- ret = dotrim(VARDATA_ANY(string), VARSIZE_ANY_EXHDR(string), " ", 1, false, true);
+ if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT && CHAR_COERCE_COMPAT) {
+ /*
+ * char(n) will not ignore the tailing blanks in A_FORMAT compatibility.
+ * here, we just return original input.
+ */
+ PG_RETURN_TEXT_P(string);
+ } else {
+ ret = dotrim(VARDATA_ANY(string), VARSIZE_ANY_EXHDR(string), " ", 1, false, true);
+ }
if ((ret == NULL || 0 == VARSIZE_ANY_EXHDR(ret)) && u_sess->attr.attr_sql.sql_compatibility == A_FORMAT)
PG_RETURN_NULL();
diff --git a/src/common/backend/utils/adt/acl.cpp b/src/common/backend/utils/adt/acl.cpp
index b7518f376..6a30f0ed2 100644
--- a/src/common/backend/utils/adt/acl.cpp
+++ b/src/common/backend/utils/adt/acl.cpp
@@ -81,7 +81,6 @@ static AclResult pg_role_aclcheck(Oid role_oid, Oid roleid, AclMode mode);
static void RoleMembershipCacheCallback(Datum arg, int cacheid, uint32 hashvalue);
static Oid get_role_oid_or_public(const char* rolname);
-static List * roles_has_privs_of(Oid roleid);
static Oid convert_cmk_name(text *keyname);
static Oid convert_column_key_name(text *keyname);
static AclMode convert_cmk_priv_string(text *priv_type_text);
@@ -1351,10 +1350,10 @@ static bool has_privs_of_role_without_sysadmin(Oid member, Oid role)
/*
- * aclmask_dbe_perf --- compute bitmask of all privileges of held by roleid
- * when related to schema dbe_perf and objects in schema dbe_perf.
+ * aclmask_without_sysadmin --- compute bitmask of all privileges of held by roleid
+ * when related to schema dbe_perf, snapshot and pg_catalog.
*/
-AclMode aclmask_dbe_perf(const Acl *acl, Oid roleid, Oid ownerId, AclMode mask, AclMaskHow how)
+AclMode aclmask_without_sysadmin(const Acl *acl, Oid roleid, Oid ownerId, AclMode mask, AclMaskHow how)
{
AclMode result;
AclMode remaining;
@@ -5220,7 +5219,7 @@ void initialize_acl(void)
* In normal mode, set a callback on any syscache invalidation of
* pg_auth_members rows
*/
- CacheRegisterSyscacheCallback(AUTHMEMROLEMEM, RoleMembershipCacheCallback, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(AUTHMEMROLEMEM, RoleMembershipCacheCallback, (Datum)0);
}
}
@@ -5263,7 +5262,7 @@ static bool has_rolinherit(Oid roleid)
* For the benefit of select_best_grantor, the result is defined to be
* in breadth-first order, ie, closer relationships earlier.
*/
-static List* roles_has_privs_of(Oid roleid)
+List* roles_has_privs_of(Oid roleid)
{
List* roles_list = NIL;
ListCell* l = NULL;
@@ -5299,7 +5298,7 @@ static List* roles_has_privs_of(Oid roleid)
/* Find roles that memberid is directly a member of */
memlist = SearchSysCacheList1(AUTHMEMMEMROLE, ObjectIdGetDatum(memberid));
for (i = 0; i < memlist->n_members; i++) {
- HeapTuple tup = &memlist->members[i]->tuple;
+ HeapTuple tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(memlist, i);
Oid otherid = ((Form_pg_auth_members)GETSTRUCT(tup))->roleid;
/*
@@ -5373,7 +5372,7 @@ static List* roles_is_member_of(Oid roleid)
/* Find roles that memberid is directly a member of */
memlist = SearchSysCacheList1(AUTHMEMMEMROLE, ObjectIdGetDatum(memberid));
for (i = 0; i < memlist->n_members; i++) {
- HeapTuple tup = &memlist->members[i]->tuple;
+ HeapTuple tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(memlist, i);
Oid otherid = ((Form_pg_auth_members)GETSTRUCT(tup))->roleid;
/*
@@ -5587,7 +5586,7 @@ bool is_admin_of_role(Oid member, Oid role)
/* Find roles that memberid is directly a member of */
memlist = SearchSysCacheList1(AUTHMEMMEMROLE, ObjectIdGetDatum(memberid));
for (i = 0; i < memlist->n_members; i++) {
- HeapTuple tup = &memlist->members[i]->tuple;
+ HeapTuple tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(memlist, i);
Oid otherid = ((Form_pg_auth_members)GETSTRUCT(tup))->roleid;
if (otherid == role && ((Form_pg_auth_members)GETSTRUCT(tup))->admin_option) {
@@ -5644,12 +5643,13 @@ static int count_one_bits(AclMode mask)
* *grantorId: receives the OID of the role to do the grant as
* *grantOptions: receives the grant options actually held by grantorId
* isDbePerf: if the object in question belonging to schema dbe_perf
+ * isPgCatalog: if the object in question belonging to schema pg_catalog
*
* If no grant options exist, we set grantorId to roleId, grantOptions to 0.
*/
void select_best_grantor(
Oid roleId, AclMode privileges, AclMode ddlPrivileges, const Acl* acl, Oid ownerId,
- Oid* grantorId, AclMode* grantOptions, AclMode* grantDdlOptions, bool isDbePerf)
+ Oid* grantorId, AclMode* grantOptions, AclMode* grantDdlOptions, bool isDbePerf, bool isPgCatalog)
{
/* remove ddl privileges flag from Aclitem */
ddlPrivileges = REMOVE_DDL_FLAG(ddlPrivileges);
@@ -5674,6 +5674,13 @@ void select_best_grantor(
*grantDdlOptions = ddl_needed_goptions;
return;
}
+ } else if (isPgCatalog) {
+ if (roleId == ownerId || roleId == INITIAL_USER_ID) {
+ *grantorId = ownerId;
+ *grantOptions = needed_goptions;
+ *grantDdlOptions = ddl_needed_goptions;
+ return;
+ }
} else {
if (roleId == ownerId || (superuser_arg(roleId) && !is_role_independent(ownerId))) {
*grantorId = ownerId;
diff --git a/src/common/backend/utils/adt/arrayfuncs.cpp b/src/common/backend/utils/adt/arrayfuncs.cpp
index 3ec36d6f2..60f8da6f0 100644
--- a/src/common/backend/utils/adt/arrayfuncs.cpp
+++ b/src/common/backend/utils/adt/arrayfuncs.cpp
@@ -96,6 +96,7 @@ static ArrayType* create_array_envelope(int ndims, int* dimv, const int* lbv, in
static ArrayType* array_fill_internal(
ArrayType* dims, ArrayType* lbs, Datum value, bool isnull, Oid elmtype, FunctionCallInfo fcinfo);
static ArrayType* array_deleteidx_internal(ArrayType *v, int delIndex);
+static void checkEnv();
/*
* complex_array_in :
@@ -1672,6 +1673,7 @@ Datum array_length(PG_FUNCTION_ARGS)
Datum array_indexby_length(PG_FUNCTION_ARGS)
{
+ checkEnv();
if (PG_ARGISNULL(0)) {
PG_RETURN_INT32(0);
}
@@ -1712,6 +1714,9 @@ Datum array_indexby_length(PG_FUNCTION_ARGS)
*/
Datum array_exists(PG_FUNCTION_ARGS)
{
+ if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) {
+ PG_RETURN_BOOL(false);
+ }
ArrayType* v = PG_GETARG_ARRAYTYPE_P(0);
int index = PG_GETARG_INT32(1);
int* dimv = NULL;
@@ -1781,7 +1786,7 @@ static bool array_index_exists_internal(ArrayType* v, HTAB* table_index, Oid tab
Datum array_varchar_exists(PG_FUNCTION_ARGS)
{
checkEnv();
- if (PG_ARGISNULL(0)) {
+ if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) {
PG_RETURN_BOOL(false);
}
ArrayType* v = PG_GETARG_ARRAYTYPE_P(0);
@@ -1795,17 +1800,27 @@ Datum array_varchar_exists(PG_FUNCTION_ARGS)
errmsg("array_varchar_exists must be call in procedure")));
}
+ /* transfer varchar format */
+ bool isTran = false;
+ if (VARATT_IS_1B(index_datum)) {
+ index_datum = transVaratt1BTo4B(index_datum);
+ isTran = true;
+ }
+
bool result = array_index_exists_internal(v,
u_sess->SPI_cxt.cur_tableof_index->tableOfIndex,
u_sess->SPI_cxt.cur_tableof_index->tableOfIndexType,
index_datum);
+ if (isTran) {
+ pfree(DatumGetPointer(index_datum));
+ }
PG_RETURN_BOOL(result);
}
Datum array_integer_exists(PG_FUNCTION_ARGS)
{
checkEnv();
- if (PG_ARGISNULL(0)) {
+ if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) {
PG_RETURN_BOOL(false);
}
ArrayType* v = PG_GETARG_ARRAYTYPE_P(0);
@@ -1963,6 +1978,14 @@ Datum array_varchar_next(PG_FUNCTION_ARGS)
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("array_varchar_next must be call in procedure")));
}
+
+ /* transfer varchar format */
+ bool isTran = false;
+ if (VARATT_IS_1B(index_datum)) {
+ index_datum = transVaratt1BTo4B(index_datum);
+ isTran = true;
+ }
+
/* turn varchar index */
HTAB* table_index = u_sess->SPI_cxt.cur_tableof_index->tableOfIndex;
TableOfIndexKey key;
@@ -1971,9 +1994,15 @@ Datum array_varchar_next(PG_FUNCTION_ARGS)
index = getTableOfIndexByDatumValue(key, table_index, NULL);
/* if exist index? */
if (index < 0) {
+ if (isTran) {
+ pfree(DatumGetPointer(index_datum));
+ }
PG_RETURN_NULL();
}
Datum next_datum = tableOfIndexVarcharNextValue(table_index, &key);
+ if (isTran) {
+ pfree(DatumGetPointer(index_datum));
+ }
if (next_datum == Datum(0)) {
PG_RETURN_NULL();
} else {
@@ -1999,6 +2028,12 @@ Datum array_varchar_prior(PG_FUNCTION_ARGS)
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("array_varchar_prior must be call in procedure")));
}
+ /* transfer varchar format */
+ bool isTran = false;
+ if (VARATT_IS_1B(index_datum)) {
+ index_datum = transVaratt1BTo4B(index_datum);
+ isTran = true;
+ }
/* turn varchar index */
HTAB* table_index = u_sess->SPI_cxt.cur_tableof_index->tableOfIndex;
TableOfIndexKey key;
@@ -2006,10 +2041,15 @@ Datum array_varchar_prior(PG_FUNCTION_ARGS)
key.exprdatum = index_datum;
index = getTableOfIndexByDatumValue(key, table_index, NULL);
if (index < 0) {
+ if (isTran) {
+ pfree(DatumGetPointer(index_datum));
+ }
PG_RETURN_NULL();
}
Datum prior_datum = tableOfIndexVarcharPriorValue(table_index, &key);
- /* check ? */
+ if (isTran) {
+ pfree(DatumGetPointer(index_datum));
+ }
if (prior_datum == Datum(0)) {
PG_RETURN_NULL();
} else {
@@ -2274,7 +2314,8 @@ static ArrayType* array_index_delete_internal(ArrayType* v, HTAB* table_index, O
TableOfIndexKey key;
key.exprtypeid = tableOfIndexType;
key.exprdatum = index_datum;
- int index = getTableOfIndexByDatumValue(key, table_index, NULL);
+ PLpgSQL_var* var = NULL;
+ int index = getTableOfIndexByDatumValue(key, table_index, &var);
if (index < 0) {
return v;
}
@@ -2283,6 +2324,17 @@ static ArrayType* array_index_delete_internal(ArrayType* v, HTAB* table_index, O
bool found = false;
(void)hash_search(table_index, (const void*)&key, HASH_REMOVE, &found);
+ /* for nest table, need delete inner vars */
+ if (var != NULL && var->tableOfIndex != NULL) {
+ HASH_SEQ_STATUS hashSeq;
+ hash_seq_init(&hashSeq, var->tableOfIndex);
+ TableOfIndexEntry* srcEntry = NULL;
+ while ((srcEntry = (TableOfIndexEntry*)hash_seq_search(&hashSeq)) != NULL) {
+ var->value = (Datum)array_index_delete_internal(DatumGetArrayTypeP(var->value), var->tableOfIndex,
+ var->tableOfIndexType, srcEntry->key.exprdatum);
+ }
+ }
+
return array;
}
@@ -2328,10 +2380,19 @@ Datum array_varchar_deleteidx(PG_FUNCTION_ARGS)
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("array_varchar_deleteidx must be call in procedure")));
}
+ /* transfer varchar format */
+ bool isTran = false;
+ if (VARATT_IS_1B(index_datum)) {
+ index_datum = transVaratt1BTo4B(index_datum);
+ isTran = true;
+ }
ArrayType* array = array_index_delete_internal(v,
u_sess->SPI_cxt.cur_tableof_index->tableOfIndex,
u_sess->SPI_cxt.cur_tableof_index->tableOfIndexType,
index_datum);
+ if (isTran) {
+ pfree(DatumGetPointer(index_datum));
+ }
PG_RETURN_ARRAYTYPE_P(array);
}
@@ -2500,6 +2561,37 @@ Datum array_delete(PG_FUNCTION_ARGS)
PG_RETURN_ARRAYTYPE_P(array);
}
+static void deleteTableOfIndexElement(HTAB* tableOfIndex)
+{
+ if (tableOfIndex == NULL) {
+ return;
+ }
+ HASH_SEQ_STATUS hashSeq;
+ hash_seq_init(&hashSeq, tableOfIndex);
+ TableOfIndexEntry* srcEntry = NULL;
+ bool found = false;
+ while ((srcEntry = (TableOfIndexEntry*)hash_seq_search(&hashSeq)) != NULL) {
+ if (srcEntry->var != NULL) {
+ deleteTableOfIndexElement(srcEntry->var->tableOfIndex);
+ }
+ (void)hash_search(tableOfIndex, (const void*)&srcEntry->key, HASH_REMOVE, &found);
+ }
+}
+
+Datum array_indexby_delete(PG_FUNCTION_ARGS)
+{
+ checkEnv();
+ ArrayType* v = PG_GETARG_ARRAYTYPE_P(0);
+ ArrayType* array = construct_empty_array(ARR_ELEMTYPE(v));
+ if (u_sess->SPI_cxt.cur_tableof_index->tableOfIndex == NULL) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("array_indexby_delete must be call in procedure")));
+ }
+ deleteTableOfIndexElement(u_sess->SPI_cxt.cur_tableof_index->tableOfIndex);
+
+ PG_RETURN_ARRAYTYPE_P(array);
+}
+
Datum array_trim(PG_FUNCTION_ARGS)
{
ArrayType *v = PG_GETARG_ARRAYTYPE_P(0);
@@ -5531,279 +5623,6 @@ Datum array_unnest(PG_FUNCTION_ARGS)
}
}
-/*
- * check if search is same as replace
- */
-static bool array_same_replace(FunctionCallInfo locfcinfo, Datum search, bool search_isnull,
- Datum replace, bool replace_isnull)
-{
- if (search_isnull != replace_isnull) {
- return false;
- } else if (search_isnull == true) {
- Assert(replace_isnull);
- return true;
- } else {
- locfcinfo->arg[0] = search;
- locfcinfo->arg[1] = replace;
- locfcinfo->argnull[0] = search_isnull;
- locfcinfo->argnull[1] = replace_isnull;
- locfcinfo->isnull = false;
- return DatumGetBool(FunctionCallInvoke(locfcinfo));
- }
-}
-
-/*
- * array_replace/array_remove support
- *
- * Find all array entries matching (not distinct from) search/search_isnull,
- * and delete them if remove is true, else replace them with
- * replace/replace_isnull. Comparisons are done using the specified
- * collation. fcinfo is passed only for caching purposes.
- */
-static ArrayType *array_replace_internal(ArrayType *array, Datum search, bool search_isnull, Datum replace,
- bool replace_isnull, bool remove, Oid collation, FunctionCallInfo fcinfo)
-{
-
- ArrayType *result = NULL;
- Oid element_type;
- Datum *values = NULL;
- bool *nulls = NULL;
- int *dim = NULL;
- int ndim;
- int nitems;
- int nresult;
- int i;
- int32 nbytes = 0;
- int32 dataoffset;
- bool hasnulls = false;
- int typlen;
- bool typbyval = false;
- char typalign;
- char *arraydataptr = NULL;
- bits8 *bitmap = NULL;
- int bitmask;
- bool changed = false;
- TypeCacheEntry *typentry = NULL;
- FunctionCallInfoData locfcinfo;
- errno_t rc = EOK;
-
- element_type = ARR_ELEMTYPE(array);
- ndim = ARR_NDIM(array);
- dim = ARR_DIMS(array);
- nitems = ArrayGetNItems(ndim, dim);
- /* Return input array unmodified if it is empty */
- if (nitems <= 0)
- return array;
- /*
- * We can't remove elements from multi-dimensional arrays, since the
- * result might not be rectangular.
- */
- if (remove && ndim > 1)
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("removing elements from multidimensional arrays is not supported")));
- /*
- * We arrange to look up the equality function only once per series of
- * calls, assuming the element type doesn't change underneath us.
- */
- typentry = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
- if (typentry == NULL || typentry->type_id != element_type) {
- typentry = lookup_type_cache(element_type, TYPECACHE_EQ_OPR_FINFO);
- if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_FUNCTION),
- errmsg("could not identify an equality operator for type %s",
- format_type_be(element_type))));
- fcinfo->flinfo->fn_extra = (void *) typentry;
- }
- typlen = typentry->typlen;
- typbyval = typentry->typbyval;
- typalign = typentry->typalign;
- /*
- * Detoast values if they are toasted. The replacement value must be
- * detoasted for insertion into the result array, while detoasting the
- * search value only once saves cycles.
- */
- if (typlen == -1) {
- if (!search_isnull)
- search = PointerGetDatum(PG_DETOAST_DATUM(search));
- if (!replace_isnull)
- replace = PointerGetDatum(PG_DETOAST_DATUM(replace));
- }
- /* Prepare to apply the comparison operator */
- InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2, collation, NULL, NULL);
- /* directly return if search is same as replace */
- if (!remove && array_same_replace(&locfcinfo, search, search_isnull, replace, replace_isnull)) {
- return array;
- }
- /* Allocate temporary arrays for new values */
- values = (Datum *) palloc(nitems * sizeof(Datum));
- nulls = (bool *) palloc(nitems * sizeof(bool));
- /* Loop over source data */
- arraydataptr = ARR_DATA_PTR(array);
- bitmap = ARR_NULLBITMAP(array);
- bitmask = 1;
- hasnulls = false;
- nresult = 0;
- for (i = 0; i < nitems; i++) {
- Datum elt;
- bool isNull = false;
- bool oprresult = false;
- bool skip = false;
- /* Get source element, checking for NULL */
- if (bitmap && (*bitmap & bitmask) == 0) {
- isNull = true;
- /* If searching for NULL, we have a match */
- if (search_isnull) {
- if (remove) {
- skip = true;
- changed = true;
- } else if (!replace_isnull) {
- values[nresult] = replace;
- isNull = false;
- changed = true;
- }
- }
- } else {
- isNull = false;
- elt = fetch_att(arraydataptr, typbyval, typlen);
- arraydataptr = att_addlength_datum(arraydataptr, typlen, elt);
- arraydataptr = (char *) att_align_nominal(arraydataptr, typalign);
- if (search_isnull) {
- /* no match possible, keep element */
- values[nresult] = elt;
- } else {
- /* Compare the pair of elements */
- locfcinfo.arg[0] = elt;
- locfcinfo.arg[1] = search;
- locfcinfo.argnull[0] = false;
- locfcinfo.argnull[1] = false;
- locfcinfo.isnull = false;
- oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
- if (locfcinfo.isnull || !oprresult) {
- /* no match, keep element */
- values[nresult] = elt;
- } else {
- /* match, so replace or delete */
- changed = true;
- if (remove) {
- skip = true;
- } else {
- values[nresult] = replace;
- isNull = replace_isnull;
- }
- }
- }
- }
- if (!skip) {
- nulls[nresult] = isNull;
- if (isNull) {
- hasnulls = true;
- } else {
- /* Update total result size */
- nbytes = att_addlength_datum(nbytes, typlen, values[nresult]);
- nbytes = att_align_nominal(nbytes, typalign);
- /* check for overflow of total request */
- if (!AllocSizeIsValid(nbytes))
- ereport(ERROR,
- (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
- errmsg("array size exceeds the maximum allowed (%d)",
- (int) MaxAllocSize)));
- }
- nresult++;
- }
- /* advance bitmap pointer if any */
- if (bitmap) {
- bitmask <<= 1;
- if (bitmask == 0x100) {
- bitmap++;
- bitmask = 1;
- }
- }
- }
- /*
- * If not changed just return the original array
- */
- if (!changed) {
- pfree(values);
- pfree(nulls);
- return array;
- }
- /* If all elements were removed return an empty array */
- if (nresult == 0) {
- pfree(values);
- pfree(nulls);
- return construct_empty_array(element_type);
- }
- /* Allocate and initialize the result array */
- if (hasnulls) {
- dataoffset = ARR_OVERHEAD_WITHNULLS(ndim, nresult);
- nbytes += dataoffset;
- } else {
- dataoffset = 0; /* marker for no null bitmap */
- nbytes += ARR_OVERHEAD_NONULLS(ndim);
- }
- result = (ArrayType *) palloc0(nbytes);
- SET_VARSIZE(result, nbytes);
- result->ndim = ndim;
- result->dataoffset = dataoffset;
- result->elemtype = element_type;
- rc = memcpy_s(ARR_DIMS(result), nbytes - sizeof(ArrayType), ARR_DIMS(array), ndim * sizeof(int));
- securec_check(rc, "\0", "\0");
- rc = memcpy_s(ARR_LBOUND(result), nbytes - (sizeof(ArrayType) + sizeof(int) * ndim),
- ARR_LBOUND(array), ndim * sizeof(int));
- securec_check(rc, "\0", "\0");
-
- if (remove) {
- /* Adjust the result length */
- ARR_DIMS(result)[0] = nresult;
- }
- /* Insert data into result array */
- CopyArrayEls(result, values, nulls, nresult, typlen, typbyval, typalign, false);
- pfree(values);
- pfree(nulls);
- return result;
-}
-
-/*
- * Remove any occurrences of an element from an array
- *
- * If used on a multi-dimensional array this will raise an error.
- */
-Datum array_remove(PG_FUNCTION_ARGS)
-{
- ArrayType *array = NULL;
- Datum search = PG_GETARG_DATUM(1);
- bool search_isnull = PG_ARGISNULL(1);
-
- if (PG_ARGISNULL(0))
- PG_RETURN_NULL();
-
- array = PG_GETARG_ARRAYTYPE_P(0);
- array = array_replace_internal(array, search, search_isnull, (Datum) 0, true, true, PG_GET_COLLATION(), fcinfo);
- PG_RETURN_ARRAYTYPE_P(array);
-}
-
-/*
- * Replace any occurrences of an element in an array
- */
-Datum array_replace(PG_FUNCTION_ARGS)
-{
- ArrayType *array = NULL;
- Datum search = PG_GETARG_DATUM(1);
- bool search_isnull = PG_ARGISNULL(1);
- Datum replace = PG_GETARG_DATUM(2);
- bool replace_isnull = PG_ARGISNULL(2);
-
- if (PG_ARGISNULL(0))
- PG_RETURN_NULL();
-
- array = PG_GETARG_ARRAYTYPE_P(0);
- array = array_replace_internal(array, search, search_isnull, replace, replace_isnull, false, PG_GET_COLLATION(),
- fcinfo);
- PG_RETURN_ARRAYTYPE_P(array);
-}
-
/*
* The type, dimension needs to be checked during collection operations.
*/
@@ -6084,6 +5903,9 @@ Datum array_union(PG_FUNCTION_ARGS)
rc = memcpy_s(ARR_LBOUND(result), ndims * sizeof(int), lbs, ndims * sizeof(int));
securec_check(rc, "", "");
+ pfree_ext(dims);
+ pfree_ext(lbs);
+
/* data area is arg1 then arg2. And make sure the destMax of memcpy_s should never be zero. */
if (ndatabytes1 > 0) {
rc = memcpy_s(ARR_DATA_PTR(result), ndatabytes1, dat1, ndatabytes1);
@@ -6357,3 +6179,295 @@ Datum array_except_distinct(PG_FUNCTION_ARGS)
ArrayType* result = array_except_internal(v1, v2, typentry, true);
PG_RETURN_ARRAYTYPE_P(result);
}
+
+/*
+ * check if search is same as replace
+ */
+static bool array_same_replace(FunctionCallInfo locfcinfo, Datum search, bool search_isnull,
+ Datum replace, bool replace_isnull)
+{
+ if (search_isnull != replace_isnull) {
+ return false;
+ } else if (search_isnull) {
+ Assert(replace_isnull);
+ return true;
+ } else {
+ locfcinfo->arg[0] = search;
+ locfcinfo->arg[1] = replace;
+ locfcinfo->argnull[0] = search_isnull;
+ locfcinfo->argnull[1] = replace_isnull;
+ locfcinfo->isnull = false;
+ return DatumGetBool(FunctionCallInvoke(locfcinfo));
+ }
+}
+
+/*
+ * array_replace/array_remove support
+ *
+ * Find all array entries matching (not distinct from) search/search_isnull,
+ * and delete them if remove is true, else replace them with
+ * replace/replace_isnull. Comparisons are done using the specified
+ * collation. fcinfo is passed only for caching purposes.
+ */
+static ArrayType *array_replace_internal(ArrayType *array, Datum search, bool search_isnull, Datum replace,
+ bool replace_isnull, bool remove, Oid collation, FunctionCallInfo fcinfo)
+{
+ ArrayType *result = NULL;
+ Oid element_type;
+ Datum *values = NULL;
+ bool *nulls = NULL;
+ int *dim = NULL;
+ int ndim;
+ int nitems;
+ int nresult;
+ int i;
+ int32 nbytes = 0;
+ int32 dataoffset;
+ bool hasnulls = false;
+ int typlen;
+ bool typbyval = false;
+ char typalign;
+ char *arraydataptr = NULL;
+ bits8 *bitmap = NULL;
+ int bitmask;
+ bool changed = false;
+ TypeCacheEntry *typentry = NULL;
+ FunctionCallInfoData locfcinfo;
+ errno_t rc = EOK;
+
+ element_type = ARR_ELEMTYPE(array);
+ ndim = ARR_NDIM(array);
+ dim = ARR_DIMS(array);
+ nitems = ArrayGetNItems(ndim, dim);
+
+ /* Return input array unmodified if it is empty */
+ if (nitems <= 0)
+ return array;
+
+ /*
+ * We can't remove elements from multi-dimensional arrays, since the
+ * result might not be rectangular.
+ */
+ if (remove && ndim > 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("removing elements from multidimensional arrays is not supported")));
+
+ /*
+ * We arrange to look up the equality function only once per series of
+ * calls, assuming the element type doesn't change underneath us.
+ */
+ typentry = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
+ if (typentry == NULL || typentry->type_id != element_type) {
+ typentry = lookup_type_cache(element_type, TYPECACHE_EQ_OPR_FINFO);
+ if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_FUNCTION),
+ errmsg("could not identify an equality operator for type %s",
+ format_type_be(element_type))));
+ fcinfo->flinfo->fn_extra = (void *) typentry;
+ }
+ typlen = typentry->typlen;
+ typbyval = typentry->typbyval;
+ typalign = typentry->typalign;
+
+ /*
+ * Detoast values if they are toasted. The replacement value must be
+ * detoasted for insertion into the result array, while detoasting the
+ * search value only once saves cycles.
+ */
+ if (typlen == -1) {
+ if (!search_isnull)
+ search = PointerGetDatum(PG_DETOAST_DATUM(search));
+ if (!replace_isnull)
+ replace = PointerGetDatum(PG_DETOAST_DATUM(replace));
+ }
+
+ /* Prepare to apply the comparison operator */
+ InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2, collation, NULL, NULL);
+
+ /* directly return if search is same as replace */
+ if (!remove && array_same_replace(&locfcinfo, search, search_isnull, replace, replace_isnull)) {
+ return array;
+ }
+
+ /* Allocate temporary arrays for new values */
+ values = (Datum *) palloc(nitems * sizeof(Datum));
+ nulls = (bool *) palloc(nitems * sizeof(bool));
+
+ /* Loop over source data */
+ arraydataptr = ARR_DATA_PTR(array);
+ bitmap = ARR_NULLBITMAP(array);
+ bitmask = 1;
+ hasnulls = false;
+ nresult = 0;
+
+ for (i = 0; i < nitems; i++) {
+ Datum elt;
+ bool isNull = false;
+ bool oprresult = false;
+ bool skip = false;
+
+ /* Get source element, checking for NULL */
+ if (bitmap && (*bitmap & bitmask) == 0) {
+ isNull = true;
+ /* If searching for NULL, we have a match */
+ if (search_isnull) {
+ if (remove) {
+ skip = true;
+ changed = true;
+ } else if (!replace_isnull) {
+ values[nresult] = replace;
+ isNull = false;
+ changed = true;
+ }
+ }
+ } else {
+ isNull = false;
+ elt = fetch_att(arraydataptr, typbyval, typlen);
+ arraydataptr = att_addlength_datum(arraydataptr, typlen, elt);
+ arraydataptr = (char *) att_align_nominal(arraydataptr, typalign);
+
+ if (search_isnull) {
+ /* no match possible, keep element */
+ values[nresult] = elt;
+ } else {
+ /* Compare the pair of elements */
+ locfcinfo.arg[0] = elt;
+ locfcinfo.arg[1] = search;
+ locfcinfo.argnull[0] = false;
+ locfcinfo.argnull[1] = false;
+ locfcinfo.isnull = false;
+ oprresult = DatumGetBool(FunctionCallInvoke(&locfcinfo));
+ if (locfcinfo.isnull || !oprresult) {
+ /* no match, keep element */
+ values[nresult] = elt;
+ } else {
+ /* match, so replace or delete */
+ changed = true;
+ if (remove) {
+ skip = true;
+ } else {
+ values[nresult] = replace;
+ isNull = replace_isnull;
+ }
+ }
+ }
+ }
+
+ if (!skip) {
+ nulls[nresult] = isNull;
+ if (isNull) {
+ hasnulls = true;
+ } else {
+ /* Update total result size */
+ nbytes = att_addlength_datum(nbytes, typlen, values[nresult]);
+ nbytes = att_align_nominal(nbytes, typalign);
+ /* check for overflow of total request */
+ if (!AllocSizeIsValid(nbytes))
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("array size exceeds the maximum allowed (%d)",
+ (int) MaxAllocSize)));
+ }
+ nresult++;
+ }
+
+ /* advance bitmap pointer if any */
+ if (bitmap) {
+ bitmask <<= 1;
+ if (bitmask == 0x100) {
+ bitmap++;
+ bitmask = 1;
+ }
+ }
+ }
+
+ /*
+ * If not changed just return the original array
+ */
+ if (!changed) {
+ pfree(values);
+ pfree(nulls);
+ return array;
+ }
+
+ /* If all elements were removed return an empty array */
+ if (nresult == 0) {
+ pfree(values);
+ pfree(nulls);
+ return construct_empty_array(element_type);
+ }
+
+ /* Allocate and initialize the result array */
+ if (hasnulls) {
+ dataoffset = ARR_OVERHEAD_WITHNULLS(ndim, nresult);
+ nbytes += dataoffset;
+ } else {
+ dataoffset = 0; /* marker for no null bitmap */
+ nbytes += ARR_OVERHEAD_NONULLS(ndim);
+ }
+ result = (ArrayType *) palloc0(nbytes);
+ SET_VARSIZE(result, nbytes);
+ result->ndim = ndim;
+ result->dataoffset = dataoffset;
+ result->elemtype = element_type;
+ rc = memcpy_s(ARR_DIMS(result), nbytes - sizeof(ArrayType), ARR_DIMS(array), ndim * sizeof(int));
+ securec_check(rc, "\0", "\0");
+ rc = memcpy_s(ARR_LBOUND(result), nbytes - (sizeof(ArrayType) + sizeof(int) * ndim),
+ ARR_LBOUND(array), ndim * sizeof(int));
+ securec_check(rc, "\0", "\0");
+
+ if (remove) {
+ /* Adjust the result length */
+ ARR_DIMS(result)[0] = nresult;
+ }
+
+ /* Insert data into result array */
+ CopyArrayEls(result, values, nulls, nresult, typlen, typbyval, typalign, false);
+
+ pfree(values);
+ pfree(nulls);
+
+ return result;
+}
+
+/*
+ * Remove any occurrences of an element from an array
+ *
+ * If used on a multi-dimensional array this will raise an error.
+ */
+Datum array_remove(PG_FUNCTION_ARGS)
+{
+ ArrayType *array = NULL;
+ Datum search = PG_GETARG_DATUM(1);
+ bool search_isnull = PG_ARGISNULL(1);
+
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+ array = PG_GETARG_ARRAYTYPE_P(0);
+
+ array = array_replace_internal(array, search, search_isnull, (Datum) 0, true, true, PG_GET_COLLATION(), fcinfo);
+ PG_RETURN_ARRAYTYPE_P(array);
+}
+
+/*
+ * Replace any occurrences of an element in an array
+ */
+Datum array_replace(PG_FUNCTION_ARGS)
+{
+ ArrayType *array = NULL;
+ Datum search = PG_GETARG_DATUM(1);
+ bool search_isnull = PG_ARGISNULL(1);
+ Datum replace = PG_GETARG_DATUM(2);
+ bool replace_isnull = PG_ARGISNULL(2);
+
+ if (PG_ARGISNULL(0))
+ PG_RETURN_NULL();
+ array = PG_GETARG_ARRAYTYPE_P(0);
+
+ array = array_replace_internal(array, search, search_isnull, replace, replace_isnull, false, PG_GET_COLLATION(),
+ fcinfo);
+ PG_RETURN_ARRAYTYPE_P(array);
+}
+
diff --git a/src/common/backend/utils/adt/dbsize.cpp b/src/common/backend/utils/adt/dbsize.cpp
index 3cfcbf594..7c49ad544 100644
--- a/src/common/backend/utils/adt/dbsize.cpp
+++ b/src/common/backend/utils/adt/dbsize.cpp
@@ -70,7 +70,6 @@
#include "storage/custorage.h"
#include "storage/smgr/segment.h"
#include "storage/cstore/cstore_compress.h"
-#include "storage/page_compression.h"
#include "vecexecutor/vecnodes.h"
#ifdef PGXC
@@ -793,7 +792,6 @@ int64 calculate_relation_size(RelFileNode* rfn, BackendId backend, ForkNumber fo
relationpath = relpathbackend(*rfn, backend, forknum);
- bool rowCompress = IS_COMPRESSED_RNODE((*rfn), forknum);
for (segcount = 0;; segcount++) {
struct stat fst;
@@ -810,7 +808,7 @@ int64 calculate_relation_size(RelFileNode* rfn, BackendId backend, ForkNumber fo
else
ereport(ERROR, (errcode_for_file_access(), errmsg("could not stat file \"%s\": %m", pathname)));
}
- totalsize += rowCompress ? CalculateMainForkSize((char*)pathname, rfn, forknum) : fst.st_size;
+ totalsize += fst.st_size;
}
pfree_ext(relationpath);
@@ -1326,7 +1324,8 @@ static int64 CalculateIndexSize(Relation rel, int forkNumOption)
Relation partIndexRel = NULL;
Relation cstorePartIndexRel = NULL;
- partOids = relationGetPartitionOidList(baseRel);
+ partOids = RelationIsSubPartitioned(baseRel) ? RelationGetSubPartitionOidList(baseRel) :
+ relationGetPartitionOidList(baseRel);
foreach (cell, partOids) {
partOid = lfirst_oid(cell);
diff --git a/src/common/backend/utils/adt/extended_statistics.cpp b/src/common/backend/utils/adt/extended_statistics.cpp
index eaf9ab977..287d7fd40 100644
--- a/src/common/backend/utils/adt/extended_statistics.cpp
+++ b/src/common/backend/utils/adt/extended_statistics.cpp
@@ -621,7 +621,7 @@ bool es_is_type_supported_by_cstore(VacAttrStats* stats)
return false;
for (unsigned int i = 0; i < stats->num_attrs; ++i) {
- if (!IsTypeSupportedByCStore(stats->attrtypid[i], stats->attrtypmod[i])) {
+ if (!IsTypeSupportedByCStore(stats->attrtypid[i])) {
return false;
}
}
diff --git a/src/common/backend/utils/adt/float.cpp b/src/common/backend/utils/adt/float.cpp
index a3c077ac7..77a1c3a89 100644
--- a/src/common/backend/utils/adt/float.cpp
+++ b/src/common/backend/utils/adt/float.cpp
@@ -25,7 +25,6 @@
#include "libpq/pqformat.h"
#include "utils/array.h"
#include "utils/builtins.h"
-#include "utils/guc_sql.h"
#include "optimizer/pgxcship.h"
#include "miscadmin.h"
@@ -369,20 +368,6 @@ Datum float4in(PG_FUNCTION_ARGS)
Datum float4out(PG_FUNCTION_ARGS)
{
float4 num = PG_GETARG_FLOAT4(0);
-
- if (u_sess->attr.attr_sql.for_print_tuple) {
- char *result = NULL;
- double var = (double)num;
- if (strcmp(u_sess->attr.attr_common.pset_num_format, "")) {
- result = apply_num_format(var);
- } else if (u_sess->attr.attr_common.pset_num_width > 0) {
- result = apply_num_width(var);
- }
- if (result != NULL) {
- PG_RETURN_CSTRING(result);
- }
- }
-
char* ascii = (char*)palloc(MAXFLOATWIDTH + 1);
errno_t rc = EOK;
@@ -597,20 +582,6 @@ Datum float8in(PG_FUNCTION_ARGS)
Datum float8out(PG_FUNCTION_ARGS)
{
float8 num = PG_GETARG_FLOAT8(0);
-
- if (u_sess->attr.attr_sql.for_print_tuple) {
- char *result = NULL;
- double var = num;
- if (strcmp(u_sess->attr.attr_common.pset_num_format, "")) {
- result = apply_num_format(var);
- } else if (u_sess->attr.attr_common.pset_num_width > 0) {
- result = apply_num_width(var);
- }
- if (result != NULL) {
- PG_RETURN_CSTRING(result);
- }
- }
-
char* ascii = (char*)palloc(MAXDOUBLEWIDTH + 1);
errno_t rc = EOK;
diff --git a/src/common/backend/utils/adt/genfile.cpp b/src/common/backend/utils/adt/genfile.cpp
index a96365143..67322b8cb 100644
--- a/src/common/backend/utils/adt/genfile.cpp
+++ b/src/common/backend/utils/adt/genfile.cpp
@@ -316,132 +316,6 @@ Datum pg_read_binary_file_all(PG_FUNCTION_ARGS)
PG_RETURN_BYTEA_P(read_binary_file(filename, 0, -1, false));
}
-struct CompressAddressItemState {
- uint32 blkno;
- int segmentNo;
- ReadBlockChunksStruct rbStruct;
- FILE *pcaFile;
-};
-
-static void ReadBinaryFileBlocksFirstCall(PG_FUNCTION_ARGS, int32 startBlockNum, int32 blockCount)
-{
- char* path = convert_and_check_filename(PG_GETARG_TEXT_PP(0));
- int segmentNo = 0;
- UndoFileType undoFileType = UNDO_INVALID;
- if (!is_row_data_file(path, &segmentNo, &undoFileType)) {
- ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_RESOURCES), errmsg("%s is not a relation file.", path)));
- }
- /* create a function context for cross-call persistence */
- FuncCallContext* fctx = SRF_FIRSTCALL_INIT();
-
- /* switch to memory context appropriate for multiple function calls */
- MemoryContext mctx = MemoryContextSwitchTo(fctx->multi_call_memory_ctx);
-
- /* initialize file scanning code */
- CompressAddressItemState* itemState = (CompressAddressItemState*)palloc(sizeof(CompressAddressItemState));
-
- /* save mmap to inter_call_data->pcMap */
- char pcaFilePath[MAXPGPATH];
- errno_t rc = snprintf_s(pcaFilePath, MAXPGPATH, MAXPGPATH - 1, PCA_SUFFIX, path);
- securec_check_ss(rc, "\0", "\0");
- FILE* pcaFile = AllocateFile((const char*)pcaFilePath, "rb");
- if (pcaFile == NULL) {
- ereport(ERROR, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", pcaFilePath)));
- }
- PageCompressHeader* map = pc_mmap(fileno(pcaFile), ReadChunkSize(pcaFile, pcaFilePath, MAXPGPATH), true);
- if (map == MAP_FAILED) {
- ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_RESOURCES), errmsg("Failed to mmap %s: %m", pcaFilePath)));
- }
- if ((BlockNumber)startBlockNum + (BlockNumber)blockCount > map->nblocks) {
- auto blockNum = map->nblocks;
- ReleaseMap(map, pcaFilePath);
- ereport(ERROR,
- (ERRCODE_INVALID_PARAMETER_VALUE,
- errmsg("invalid blocknum \"%d\" and block count \"%d\", the max blocknum is \"%u\"",
- startBlockNum,
- blockCount,
- blockNum)));
- }
- /* construct ReadBlockChunksStruct */
- char* pcdFilePath = (char*)palloc0(MAXPGPATH);
- rc = snprintf_s(pcdFilePath, MAXPGPATH, MAXPGPATH - 1, PCD_SUFFIX, path);
- securec_check_ss(rc, "\0", "\0");
- FILE* fp = AllocateFile(pcdFilePath, "rb");
- if (fp == NULL) {
- ereport(ERROR, (errcode_for_file_access(), errmsg("could not open file \"%s\": %m", pcdFilePath)));
- }
- char* pageBuffer = (char*)palloc(BLCKSZ);
- itemState->pcaFile = pcaFile;
- itemState->rbStruct.header = map;
- itemState->rbStruct.pageBuffer = pageBuffer;
- itemState->rbStruct.pageBufferLen = BLCKSZ;
- itemState->rbStruct.fp = fp;
- itemState->rbStruct.segmentNo = segmentNo;
- itemState->rbStruct.fileName = pcdFilePath;
-
- /*
- * build tupdesc for result tuples. This must match this function's
- * pg_proc entry!
- */
- TupleDesc tupdesc = CreateTemplateTupleDesc(4, false, TAM_HEAP);
- TupleDescInitEntry(tupdesc, (AttrNumber)1, "path", TEXTOID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)2, "blocknum", INT4OID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)3, "len", INT4OID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)4, "data", BYTEAOID, -1, 0);
- fctx->tuple_desc = BlessTupleDesc(tupdesc);
-
- itemState->blkno = startBlockNum;
- fctx->max_calls = blockCount;
- fctx->user_fctx = itemState;
-
- MemoryContextSwitchTo(mctx);
-}
-
-Datum pg_read_binary_file_blocks(PG_FUNCTION_ARGS)
-{
- int32 startBlockNum = PG_GETARG_INT32(1);
- int32 blockCount = PG_GETARG_INT32(2);
-
- if (startBlockNum < 0 || blockCount <= 0 || startBlockNum + blockCount > RELSEG_SIZE) {
- ereport(ERROR, (ERRCODE_INVALID_PARAMETER_VALUE,
- errmsg("invalid blocknum \"%d\" or block count \"%d\"", startBlockNum, blockCount)));
- }
-
- /* stuff done only on the first call of the function */
- if (SRF_IS_FIRSTCALL()) {
- ReadBinaryFileBlocksFirstCall(fcinfo, startBlockNum, blockCount);
- }
-
- /* stuff done on every call of the function */
- FuncCallContext *fctx = SRF_PERCALL_SETUP();
- CompressAddressItemState *itemState = (CompressAddressItemState *)fctx->user_fctx;
-
- if (fctx->call_cntr < fctx->max_calls) {
- bytea *buf = (bytea *)palloc(BLCKSZ + VARHDRSZ);
- size_t len = ReadAllChunkOfBlock(VARDATA(buf), BLCKSZ, itemState->blkno, itemState->rbStruct);
- SET_VARSIZE(buf, len + VARHDRSZ);
- Datum values[4];
- values[0] = PG_GETARG_DATUM(0);
- values[1] = Int32GetDatum(itemState->blkno);
- values[2] = Int32GetDatum(len);
- values[3] = PointerGetDatum(buf);
-
- /* Build and return the result tuple. */
- bool nulls[4];
- securec_check(memset_s(nulls, sizeof(nulls), 0, sizeof(nulls)), "\0", "\0");
- HeapTuple tuple = heap_form_tuple(fctx->tuple_desc, (Datum*)values, (bool*)nulls);
- Datum result = HeapTupleGetDatum(tuple);
- itemState->blkno++;
- SRF_RETURN_NEXT(fctx, result);
- } else {
- if (itemState->rbStruct.header != NULL) {
- pc_munmap(itemState->rbStruct.header);
- }
- FreeFile(itemState->pcaFile);
- FreeFile(itemState->rbStruct.fp);
- SRF_RETURN_DONE(fctx);
- }
-}
/*
* stat a file
diff --git a/src/common/backend/utils/adt/int.cpp b/src/common/backend/utils/adt/int.cpp
index 10eb1be59..c39654b13 100644
--- a/src/common/backend/utils/adt/int.cpp
+++ b/src/common/backend/utils/adt/int.cpp
@@ -39,7 +39,6 @@
#include "libpq/pqformat.h"
#include "utils/array.h"
#include "utils/builtins.h"
-#include "utils/guc_sql.h"
#define SAMESIGN(a, b) (((a) < 0) == ((b) < 0))
@@ -70,23 +69,10 @@ Datum int2in(PG_FUNCTION_ARGS)
*/
Datum int2out(PG_FUNCTION_ARGS)
{
- char* result = NULL;
int16 arg1 = PG_GETARG_INT16(0);
+ char* result = (char*)palloc(7); /* sign, 5 digits, '\0' */
- if (u_sess->attr.attr_sql.for_print_tuple) {
- double var = (double)arg1;
- if (strcmp(u_sess->attr.attr_common.pset_num_format, "")) {
- result = apply_num_format(var);
- } else if (u_sess->attr.attr_common.pset_num_width > 0) {
- result = apply_num_width(var);
- }
- }
-
- if (result == NULL) {
- result = (char*)palloc(7); /* sign, 5 digits, '\0' */
- pg_itoa(arg1, result);
- }
-
+ pg_itoa(arg1, result);
PG_RETURN_CSTRING(result);
}
@@ -318,23 +304,10 @@ Datum int4in(PG_FUNCTION_ARGS)
*/
Datum int4out(PG_FUNCTION_ARGS)
{
- char* result = NULL;
int32 arg1 = PG_GETARG_INT32(0);
+ char* result = (char*)palloc(12); /* sign, 10 digits, '\0' */
- if (u_sess->attr.attr_sql.for_print_tuple) {
- double var = (double)arg1;
- if (strcmp(u_sess->attr.attr_common.pset_num_format, "")) {
- result = apply_num_format(var);
- } else if (u_sess->attr.attr_common.pset_num_width > 0) {
- result = apply_num_width(var);
- }
- }
-
- if (result == NULL) {
- result = (char*)palloc(12); /* sign, 10 digits, '\0' */
- pg_ltoa(arg1, result);
- }
-
+ pg_ltoa(arg1, result);
PG_RETURN_CSTRING(result);
}
@@ -1252,23 +1225,10 @@ Datum int1in(PG_FUNCTION_ARGS)
// int1out - converts uint8 to "num"
Datum int1out(PG_FUNCTION_ARGS)
{
- char* result = NULL;
uint8 arg1 = PG_GETARG_UINT8(0);
+ char* result = (char*)palloc(5); /* sign, 3 digits, '\0' */
- if (u_sess->attr.attr_sql.for_print_tuple) {
- double var = (double)arg1;
- if (strcmp(u_sess->attr.attr_common.pset_num_format, "")) {
- result = apply_num_format(var);
- } else if (u_sess->attr.attr_common.pset_num_width > 0) {
- result = apply_num_width(var);
- }
- }
-
- if (result == NULL) {
- result = (char*)palloc(5); /* sign, 3 digits, '\0' */
- pg_ctoa(arg1, result);
- }
-
+ pg_ctoa(arg1, result);
PG_RETURN_CSTRING(result);
}
diff --git a/src/common/backend/utils/adt/int16.cpp b/src/common/backend/utils/adt/int16.cpp
index 3b07fe2e5..dd27c8dd7 100644
--- a/src/common/backend/utils/adt/int16.cpp
+++ b/src/common/backend/utils/adt/int16.cpp
@@ -18,7 +18,6 @@
* Internal 128-bit integer operations.
*
* Portions Copyright (c) 2018, Huawei Tech. Co., Ltd.
- * Portions Copyright (c) 2021, openGauss Contributors
*
* IDENTIFICATION
* src/common/backend/utils/adt/int16.cpp
diff --git a/src/common/backend/utils/adt/int8.cpp b/src/common/backend/utils/adt/int8.cpp
index a05ed0653..6dface912 100644
--- a/src/common/backend/utils/adt/int8.cpp
+++ b/src/common/backend/utils/adt/int8.cpp
@@ -24,7 +24,6 @@
#include "libpq/pqformat.h"
#include "utils/int8.h"
#include "utils/builtins.h"
-#include "utils/guc_sql.h"
#define MAXINT8LEN 25
@@ -154,23 +153,11 @@ Datum int8in(PG_FUNCTION_ARGS)
Datum int8out(PG_FUNCTION_ARGS)
{
int64 val = PG_GETARG_INT64(0);
+ char buf[MAXINT8LEN + 1];
char* result = NULL;
- if (u_sess->attr.attr_sql.for_print_tuple) {
- double var = (double)val;
- if (strcmp(u_sess->attr.attr_common.pset_num_format, "")) {
- result = apply_num_format(var);
- } else if (u_sess->attr.attr_common.pset_num_width > 0) {
- result = apply_num_width(var);
- }
- }
-
- if (result == NULL) {
- char buf[MAXINT8LEN + 1];
- pg_lltoa(val, buf);
- result = pstrdup(buf);
- }
-
+ pg_lltoa(val, buf);
+ result = pstrdup(buf);
PG_RETURN_CSTRING(result);
}
diff --git a/src/common/backend/utils/adt/like.cpp b/src/common/backend/utils/adt/like.cpp
index 811cb1952..9aafceeaf 100644
--- a/src/common/backend/utils/adt/like.cpp
+++ b/src/common/backend/utils/adt/like.cpp
@@ -252,6 +252,11 @@ Datum textlike(PG_FUNCTION_ARGS)
{
text* str = PG_GETARG_TEXT_PP(0);
text* pat = PG_GETARG_TEXT_PP(1);
+ if (unlikely(VARATT_IS_HUGE_TOAST_POINTER(str))) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("like 'partten' cannot exceed 1GB")));
+ }
bool result = false;
char *s, *p;
int slen, plen;
diff --git a/src/common/backend/utils/adt/lockfuncs.cpp b/src/common/backend/utils/adt/lockfuncs.cpp
index e559daf96..a028373c1 100644
--- a/src/common/backend/utils/adt/lockfuncs.cpp
+++ b/src/common/backend/utils/adt/lockfuncs.cpp
@@ -54,7 +54,8 @@ const char* const LockTagTypeNames[] = {"relation",
"userlock",
"advisory",
"filenode",
- "subtransactionid"};
+ "subtransactionid",
+ "tuple_uid"};
/* This must match enum PredicateLockTargetType (predicate_internals.h) */
static const char* const PredicateLockTagTypeNames[] = {"relation", "page", "tuple"};
@@ -347,6 +348,20 @@ Datum pg_lock_status(PG_FUNCTION_ARGS)
values[5] = UInt16GetDatum(instance->locktag.locktag_field5);
nulls[6] = true;
nulls[7] = true;
+ nulls[8] = true;
+ nulls[9] = true;
+ nulls[10] = true;
+ break;
+ case LOCKTAG_UID:
+ values[1] = ObjectIdGetDatum(instance->locktag.locktag_field1);
+ values[2] = ObjectIdGetDatum(instance->locktag.locktag_field2);
+ nulls[3] = true;
+ nulls[4] = true;
+ nulls[5] = true;
+ nulls[6] = true;
+ values[7] = TransactionIdGetDatum((uint64)instance->locktag.locktag_field3 << 32 |
+ ((uint64)instance->locktag.locktag_field4));
+
nulls[8] = true;
nulls[9] = true;
nulls[10] = true;
@@ -639,9 +654,9 @@ static bool pgxc_advisory_lock(int64 key64, int32 key1, int32 key2, bool iskeybi
* can not process SIGUSR1 of "pgxc_pool_reload" command immediately.
*/
#ifdef ENABLE_MULTIPLE_NODES
- if (u_sess->sig_cxt.got_PoolReload) {
+ if (IsGotPoolReload()) {
processPoolerReload();
- u_sess->sig_cxt.got_PoolReload = false;
+ ResetGotPoolReload(false);
}
#endif
PgxcNodeGetOids(&coOids, &dnOids, &numcoords, &numdnodes, false);
@@ -1460,6 +1475,23 @@ Datum pgxc_lock_for_sp_database(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(true);
}
+bool pg_try_advisory_lock_for_redis(Relation rel)
+{
+ LOCKMODE lockmode = u_sess->attr.attr_sql.enable_cluster_resize ? ExclusiveLock : ShareLock;
+ LockLevel locklevel = u_sess->attr.attr_sql.enable_cluster_resize ? SESSION_LOCK : TRANSACTION_LOCK;
+ TryType locktry = u_sess->attr.attr_sql.enable_cluster_resize ? WAIT : DONT_WAIT;
+ bool result = pgxc_advisory_lock(0, 65534, RelationGetRelCnOid(rel), false, lockmode, locklevel, locktry, NULL);
+ if (u_sess->attr.attr_sql.enable_cluster_resize && result) {
+ return true;
+ } else if (result) {
+ LOCKTAG tag;
+ SET_LOCKTAG_INT32_DB(tag, u_sess->proc_cxt.MyDatabaseId, 65534, RelationGetRelCnOid(rel));
+ (void)LockRelease(&tag, ShareLock, false);
+ return true;
+ }
+ return false;
+}
+
/*
* pgxc_lock_for_backup
*
diff --git a/src/common/backend/utils/adt/memory_func.cpp b/src/common/backend/utils/adt/memory_func.cpp
new file mode 100644
index 000000000..c193aebb0
--- /dev/null
+++ b/src/common/backend/utils/adt/memory_func.cpp
@@ -0,0 +1,522 @@
+
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "memory_func.h"
+
+#ifdef MEMORY_CONTEXT_TRACK
+/*
+ * for view gs_get_shared_memctx_detail;
+ */
+void gs_recursive_shared_memory_context(const MemoryContext context,
+ const char* ctx_name, StringInfoData* buf, bool isShared)
+{
+ bool checkLock = false;
+
+ if (context == NULL) {
+ return;
+ }
+
+ PG_TRY();
+ {
+ CHECK_FOR_INTERRUPTS();
+ check_stack_depth();
+
+ if (isShared) {
+ MemoryContextLock(context);
+ checkLock = true;
+ }
+
+ if (context->type == T_SharedAllocSetContext && strcmp(ctx_name, context->name) == 0) {
+#ifndef ENABLE_MEMORY_CHECK
+ GetAllocBlockInfo((AllocSet)context, buf);
+#else
+ appendStringInfo(buf, "context : %s\n", context->name);
+ GetAsanBlockInfo((AsanSet)context, buf);
+#endif
+ }
+
+ /* recursive MemoryContext's child */
+ for (MemoryContext child = context->firstchild; child != NULL; child = child->nextchild) {
+ if (child->is_shared) {
+ gs_recursive_shared_memory_context(child, ctx_name, buf, child->is_shared);
+ }
+ }
+ }
+ PG_CATCH();
+ {
+ if (isShared && checkLock) {
+ MemoryContextUnlock(context);
+ }
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ if (isShared) {
+ MemoryContextUnlock(context);
+ }
+
+ return;
+}
+
+/*
+ * for view gs_get_thread_memctx_detail and gs_get_session_memctx_detail;
+ */
+void gs_recursive_unshared_memory_context(const MemoryContext context,
+ const char* ctx_name, StringInfoData* buf)
+{
+ if (context == NULL) {
+ return;
+ }
+
+#ifndef ENABLE_MEMORY_CHECK
+ if ((context->type == T_AllocSetContext) && strcmp(ctx_name, context->name) == 0) {
+ GetAllocBlockInfo((AllocSet)context, buf);
+ }
+#else
+ if ((context->type == T_AsanSetContext) && strcmp(ctx_name, context->name) == 0) {
+ appendStringInfo(buf, "context : %s\n", context->name);
+ GetAsanBlockInfo((AsanSet)context, buf);
+ }
+#endif
+
+ CHECK_FOR_INTERRUPTS();
+ check_stack_depth();
+
+ /* recursive MemoryContext's child */
+ for (MemoryContext child = context->firstchild; child != NULL; child = child->nextchild) {
+ gs_recursive_unshared_memory_context(child, ctx_name, buf);
+ }
+
+ return;
+}
+
+/*
+ * file dictionary order, line number from small to large
+ */
+static int gs_alloc_chunk_cmp(const void* cmp_a, const void* cmp_b)
+{
+ if (cmp_a == NULL && cmp_b == NULL) {
+ return 0;
+ } else if (cmp_a == NULL) {
+ return 1;
+ } else if (cmp_b == NULL) {
+ return -1;
+ }
+
+ AllocChunk chunk_a = (AllocChunk)cmp_a;
+ AllocChunk chunk_b = (AllocChunk)cmp_b;
+
+ int cmp_file = strcmp(chunk_a->file, chunk_b->file);
+ if (cmp_file != 0) {
+ return cmp_file;
+ }
+
+ if (chunk_a->line < chunk_b->line) {
+ return -1;
+ } else if (chunk_a->line == chunk_b->line) {
+ return 0;
+ } else {
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
+ * file dictionary order, line number from small to large; the size of same file and line will be summation;
+ */
+static void gs_sort_memctx_info(AllocChunk memctx_info_res, int memctx_info_cnt, int* res_len)
+{
+ int i = 0;
+ int j = 1;
+
+ qsort(memctx_info_res, memctx_info_cnt, sizeof(AllocChunkData), gs_alloc_chunk_cmp);
+
+ while (j < memctx_info_cnt) {
+ AllocChunk chunk_i = &memctx_info_res[i];
+ AllocChunk chunk_j = &memctx_info_res[j];
+ if (strcmp(chunk_i->file, chunk_j->file) == 0 && chunk_i->line == chunk_j->line) {
+ chunk_i->size += chunk_j->size;
+ ++j;
+ continue;
+ }
+
+ ++i;
+ chunk_i = &memctx_info_res[i];
+ const char* tmp = chunk_i->file;
+ chunk_i->file = chunk_j->file;
+ chunk_j->file = tmp;
+ chunk_i->line = chunk_j->line;
+ chunk_i->size = chunk_j->size;
+ ++j;
+ }
+ *res_len = i + 1;
+}
+
+/*
+ * collect the file and line info
+ */
+static AllocChunk gs_collate_memctx_info(StringInfo mem_info, int* res_len)
+{
+ if (mem_info == NULL) {
+ *res_len = 0;
+ return NULL;
+ }
+
+ int i = 0;
+ int memctx_info_cnt = 0;
+
+ /* find alloc chunk info count */
+ for (int i = 0; i < mem_info->len; ++i) {
+ if (mem_info->data[i] == ':') {
+ ++memctx_info_cnt;
+ }
+ }
+
+ if (memctx_info_cnt == 0) {
+ *res_len = 0;
+ return NULL;
+ }
+
+ /* Traverse memory application information */
+ AllocChunk memctx_info_res = (AllocChunk)palloc(sizeof(AllocChunkData) * memctx_info_cnt);
+ char* file_name = mem_info->data;
+ char* tmp_file_name = mem_info->data;
+ char* line = NULL;
+ char* real_size = NULL;
+ const int divide_size = 2;
+ for (i = 0; i < memctx_info_cnt; ++i) {
+ file_name = tmp_file_name;
+ line = strchr(file_name, ':');
+ if (line == NULL) {
+ continue;
+ }
+ *line = '\0';
+ ++line;
+
+ real_size = strchr(line, ',');
+ if (real_size == NULL) {
+ continue;
+ }
+ *real_size = '\0';
+ real_size += divide_size;
+
+ tmp_file_name = strchr(real_size, '\n');
+ if (tmp_file_name == NULL) {
+ continue;
+ }
+ *tmp_file_name = '\0';
+ ++tmp_file_name;
+
+ if (strcmp(file_name, "(null)") == 0 || strcmp(line, "0") == 0) {
+ continue;
+ }
+
+ char* file_name_begin_pos = strrchr(file_name, '/');
+ if (file_name_begin_pos != NULL) {
+ file_name = file_name_begin_pos + 1;
+ }
+
+ AllocChunk chunk_res = &memctx_info_res[i];
+ int file_name_len = strlen(file_name);
+ chunk_res->file = (char*)palloc(sizeof(char) * (file_name_len + 1));
+ int rc = memcpy_s((char*)chunk_res->file, file_name_len, file_name, file_name_len);
+ securec_check_c(rc, "\0", "\0");
+ ((char*)chunk_res->file)[file_name_len] = '\0';
+ chunk_res->line = atoi(line);
+ chunk_res->size = atoi(real_size);
+ }
+
+ gs_sort_memctx_info(memctx_info_res, memctx_info_cnt, res_len);
+
+ return memctx_info_res;
+}
+
+static TupleDesc get_memctx_view_first_row(const unsigned col_num)
+{
+ /* the col num of view */
+ TupleDesc tupdesc = CreateTemplateTupleDesc(col_num, false);
+
+ TupleDescInitEntry(tupdesc, (AttrNumber)ARG_1, "file", TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)ARG_2, "line", INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)ARG_3, "size", INT8OID, -1, 0);
+
+ return BlessTupleDesc(tupdesc);
+}
+
+static HeapTuple fetch_memctx_view_values(FuncCallContext* funcctx, AllocChunk memctx_chunk,
+ const unsigned col_num)
+{
+ Datum values[col_num];
+ bool nulls[col_num];
+
+ errno_t rc;
+ rc = memset_s(values, sizeof(values), 0, sizeof(values));
+ securec_check_c(rc, "\0", "\0");
+ rc = memset_s(nulls, sizeof(nulls), 0, sizeof(nulls));
+ securec_check_c(rc, "\0", "\0");
+
+ values[ARG_0] = CStringGetTextDatum(memctx_chunk->file);
+ values[ARG_1] = Int64GetDatum(memctx_chunk->line);
+ values[ARG_2] = Int64GetDatum(memctx_chunk->size);
+
+ return heap_form_tuple(funcctx->tuple_desc, values, nulls);
+}
+
+void gs_check_context_name_valid(const char* ctx_name)
+{
+ if (!t_thrd.utils_cxt.gs_mp_inited) {
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unsupported view for memory protection feature is disabled.")));
+ }
+
+ if (ctx_name == NULL || strlen(ctx_name) == 0) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_NAME), errmsg("invalid name of memory context: NULL or \"\"")));
+ }
+
+ if (strlen(ctx_name) >= MEMORY_CONTEXT_NAME_LEN) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_NAME),
+ errmsg("The name of memory context is too long(>=%dbytes)", MEMORY_CONTEXT_NAME_LEN)));
+ }
+}
+#endif
+/*
+ * select gs_get_thread_memctx_detail(tid, 'CBBTopMemoryContext');
+ * tid is from the 2sd item of pv_thread_memory_context();
+ */
+Datum gs_get_thread_memctx_detail(PG_FUNCTION_ARGS)
+{
+#ifndef MEMORY_CONTEXT_TRACK
+ FuncCallContext* funcctx = NULL;
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unsupported view in lite mode or numa mode.")));
+ SRF_RETURN_DONE(funcctx);
+#else
+
+ if (!superuser() && !isMonitoradmin(GetUserId())) {
+ aclcheck_error(ACLCHECK_NO_PRIV, ACL_KIND_PROC, "gs_get_thread_memctx_detail");
+ }
+
+ const ThreadId tid = PG_GETARG_INT64(0);
+ char* ctx_name = TextDatumGetCString(PG_GETARG_TEXT_PP(1));
+
+ gs_check_context_name_valid(ctx_name);
+
+ if (tid == 0) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid thread id %ld .", tid)));
+ }
+
+#define GS_THREAD_MEMCTX_VIEW_ATTRNUM 3
+ FuncCallContext* funcctx = NULL;
+ AllocChunk memctx_info_res;
+
+ if (SRF_IS_FIRSTCALL()) {
+ funcctx = SRF_FIRSTCALL_INIT();
+ MemoryContext oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ StringInfoData mem_info;
+ initStringInfo(&mem_info);
+
+ if (tid == PostmasterPid) {
+ if (!IsNormalProcessingMode()) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("the thread state is abnormal %ld\n", tid)));
+ }
+ gs_recursive_unshared_memory_context(PmTopMemoryContext, ctx_name, &mem_info);
+ } else {
+ bool find_thread = false;
+ MemoryContext thrd_top_cxt = NULL;
+ uint32 max_thread_count = g_instance.proc_base->allProcCount -
+ g_instance.attr.attr_storage.max_prepared_xacts * NUM_TWOPHASE_PARTITIONS;
+ volatile PGPROC* proc = NULL;
+ for (uint32 idx = 0; idx < max_thread_count; idx++) {
+ proc = g_instance.proc_base_all_procs[idx];
+ if (proc->pid == tid) {
+ thrd_top_cxt = proc->topmcxt;
+ find_thread = true;
+ break;
+ }
+ }
+
+ if (find_thread == false) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("can not find pid %ld\n", tid)));
+ }
+
+ PG_TRY();
+ {
+ (void)syscalllockAcquire(&((PGPROC*)proc)->deleMemContextMutex);
+ gs_recursive_unshared_memory_context(thrd_top_cxt, ctx_name, &mem_info);
+ (void)syscalllockRelease(&((PGPROC*)proc)->deleMemContextMutex);
+ }
+ PG_CATCH();
+ {
+ (void)syscalllockRelease(&((PGPROC*)proc)->deleMemContextMutex);
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+ }
+
+ int memctx_info_len = 0;
+ memctx_info_res = gs_collate_memctx_info(&mem_info, &memctx_info_len);
+
+ funcctx->tuple_desc = get_memctx_view_first_row(GS_THREAD_MEMCTX_VIEW_ATTRNUM);
+ funcctx->max_calls = memctx_info_len;
+ funcctx->user_fctx = memctx_info_res;
+
+ FreeStringInfo(&mem_info);
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ memctx_info_res = (AllocChunk)(funcctx->user_fctx);
+ if (funcctx->call_cntr < funcctx->max_calls) {
+ AllocChunk memctx_chunk = memctx_info_res + funcctx->call_cntr;
+ HeapTuple tuple = fetch_memctx_view_values(funcctx, memctx_chunk, GS_THREAD_MEMCTX_VIEW_ATTRNUM);
+ pfree_ext(ctx_name);
+ SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
+ }
+
+ pfree_ext(memctx_info_res);
+ pfree_ext(ctx_name);
+ SRF_RETURN_DONE(funcctx);
+#endif
+}
+
+/*
+ * select gs_get_session_memctx_detail('CBBTopMemoryContext');
+ */
+Datum gs_get_session_memctx_detail(PG_FUNCTION_ARGS)
+{
+#ifndef MEMORY_CONTEXT_TRACK
+ FuncCallContext* funcctx = NULL;
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unsupported view in lite mode or numa mode.")));
+ SRF_RETURN_DONE(funcctx);
+#else
+
+ if (!superuser() && !isMonitoradmin(GetUserId())) {
+ aclcheck_error(ACLCHECK_NO_PRIV, ACL_KIND_PROC, "gs_get_session_memctx_detail");
+ }
+
+ char* ctx_name = TextDatumGetCString(PG_GETARG_TEXT_PP(0));
+
+ gs_check_context_name_valid(ctx_name);
+
+ if (!ENABLE_THREAD_POOL) {
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unsupported view for thread pool is disabled.")));
+ }
+
+#define GS_SESSION_MEMCTX_VIEW_ATTRNUM 3
+ FuncCallContext* funcctx = NULL;
+ AllocChunk memctx_info_res;
+ knl_sess_control* sess = NULL;
+
+ if (SRF_IS_FIRSTCALL()) {
+ funcctx = SRF_FIRSTCALL_INIT();
+ MemoryContext oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ StringInfoData mem_info;
+ initStringInfo(&mem_info);
+ g_threadPoolControler->GetSessionCtrl()->getSessionMemoryContextInfo(ctx_name, &mem_info, &sess);
+
+ int memctx_info_len = 0;
+ memctx_info_res = gs_collate_memctx_info(&mem_info, &memctx_info_len);
+
+ funcctx->tuple_desc = get_memctx_view_first_row(GS_SESSION_MEMCTX_VIEW_ATTRNUM);
+ funcctx->max_calls = memctx_info_len;
+ funcctx->user_fctx = memctx_info_res;
+
+ FreeStringInfo(&mem_info);
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ memctx_info_res = (AllocChunk)(funcctx->user_fctx);
+ if (funcctx->call_cntr < funcctx->max_calls) {
+ AllocChunk memctx_chunk = memctx_info_res + funcctx->call_cntr;
+ HeapTuple tuple = fetch_memctx_view_values(funcctx, memctx_chunk, GS_SESSION_MEMCTX_VIEW_ATTRNUM);
+ pfree_ext(ctx_name);
+ SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
+ }
+
+ pfree_ext(memctx_info_res);
+ pfree_ext(ctx_name);
+ SRF_RETURN_DONE(funcctx);
+#endif
+}
+
+/*
+ * select gs_get_shared_memctx_detail('CBBTopMemoryContext');
+ */
+Datum gs_get_shared_memctx_detail(PG_FUNCTION_ARGS)
+{
+#ifndef MEMORY_CONTEXT_TRACK
+ FuncCallContext* funcctx = NULL;
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unsupported view in lite mode or numa mode.")));
+ SRF_RETURN_DONE(funcctx);
+#else
+
+ if (!superuser() && !isMonitoradmin(GetUserId())) {
+ aclcheck_error(ACLCHECK_NO_PRIV, ACL_KIND_PROC, "gs_get_shared_memctx_detail");
+ }
+
+ char* ctx_name = TextDatumGetCString(PG_GETARG_TEXT_PP(0));
+
+ gs_check_context_name_valid(ctx_name);
+
+#define GS_SHARED_MEMCTX_VIEW_ATTRNUM 3
+ FuncCallContext* funcctx = NULL;
+ AllocChunk memctx_info_res;
+
+ if (SRF_IS_FIRSTCALL()) {
+ funcctx = SRF_FIRSTCALL_INIT();
+ MemoryContext oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ StringInfoData mem_info;
+ initStringInfo(&mem_info);
+ gs_recursive_shared_memory_context(g_instance.instance_context, ctx_name, &mem_info, true);
+
+ int memctx_info_len = 0;
+ memctx_info_res = gs_collate_memctx_info(&mem_info, &memctx_info_len);
+
+ funcctx->tuple_desc = get_memctx_view_first_row(GS_SHARED_MEMCTX_VIEW_ATTRNUM);
+ funcctx->max_calls = memctx_info_len;
+ funcctx->user_fctx = memctx_info_res;
+
+ FreeStringInfo(&mem_info);
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ memctx_info_res = (AllocChunk)(funcctx->user_fctx);
+ if (funcctx->call_cntr < funcctx->max_calls) {
+ AllocChunk memctx_chunk = memctx_info_res + funcctx->call_cntr;
+ HeapTuple tuple = fetch_memctx_view_values(funcctx, memctx_chunk, GS_SHARED_MEMCTX_VIEW_ATTRNUM);
+ pfree_ext(ctx_name);
+ SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
+ }
+
+ pfree_ext(memctx_info_res);
+ pfree_ext(ctx_name);
+ SRF_RETURN_DONE(funcctx);
+#endif
+}
+
diff --git a/src/common/backend/utils/adt/misc.cpp b/src/common/backend/utils/adt/misc.cpp
index f577eb533..a544ca3e2 100644
--- a/src/common/backend/utils/adt/misc.cpp
+++ b/src/common/backend/utils/adt/misc.cpp
@@ -74,10 +74,15 @@ Datum current_database(PG_FUNCTION_ARGS)
Datum current_query(PG_FUNCTION_ARGS)
{
/* there is no easy way to access the more concise 'query_string' */
- if (t_thrd.postgres_cxt.debug_query_string)
- PG_RETURN_TEXT_P(cstring_to_text(t_thrd.postgres_cxt.debug_query_string));
- else
+ if (t_thrd.postgres_cxt.debug_query_string) {
+ char *mask_string = maskPassword(t_thrd.postgres_cxt.debug_query_string);
+ if (mask_string == NULL) {
+ mask_string = (char *)t_thrd.postgres_cxt.debug_query_string;
+ }
+ PG_RETURN_TEXT_P(cstring_to_text(mask_string));
+ } else {
PG_RETURN_NULL();
+ }
}
/*
@@ -274,11 +279,7 @@ Datum pg_cancel_invalid_query(PG_FUNCTION_ARGS)
(errmsg("must be system admin to cancel invalid queries running in all server processes"))));
PG_RETURN_BOOL(false);
} else {
- if (GTM_LITE_MODE) {
- proc_cancel_invalid_gtm_lite_conn();
- } else {
- pgstat_cancel_invalid_gtm_conn();
- }
+ proc_cancel_invalid_gtm_lite_conn();
PG_RETURN_BOOL(true);
}
#endif
diff --git a/src/common/backend/utils/adt/nlssort.cpp b/src/common/backend/utils/adt/nlssort.cpp
index 78195c725..5358be459 100644
--- a/src/common/backend/utils/adt/nlssort.cpp
+++ b/src/common/backend/utils/adt/nlssort.cpp
@@ -25,6 +25,7 @@
#include "postgres.h"
#include "mb/pg_wchar.h"
#include "utils/builtins.h"
+#include "knl/knl_session.h"
#include "../mb/nlssort/nlssort_pinyin_map1_simple.map"
#include "../mb/nlssort/nlssort_pinyin_map1_complex.map"
@@ -67,6 +68,13 @@ Datum nlssort(PG_FUNCTION_ARGS)
if (PG_ARGISNULL(0)) {
PG_RETURN_NULL();
}
+ if (VARSIZE_ANY_EXHDR(PG_GETARG_TEXT_P(0)) == 0) {
+ if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT) {
+ PG_RETURN_NULL();
+ } else {
+ PG_RETURN_TEXT_P(cstring_to_text("\0"));
+ }
+ }
/* encode the first argument with "gb18030" */
Datum tmp = DirectFunctionCall3(pg_convert, PG_GETARG_DATUM(0), CStringGetDatum(GetDatabaseEncodingName()),
@@ -80,6 +88,8 @@ Datum nlssort(PG_FUNCTION_ARGS)
errcause("Error in the nlssort parameter."), erraction("Please check and revise your parameter.")));
}
+ pfree_ext(chars_to_be_encoded);
+ pfree_ext(nlssort_arg);
pfree_ext(sort_method);
PG_RETURN_TEXT_P(cstring_to_text(chars_encoded));
@@ -223,6 +233,7 @@ char *remove_trailing_spaces(const char *src_str)
{
bool is_all_space = true;
int len = strlen(src_str);
+ Assert(len > 0);
int buf_size = strlen(src_str) + 1;
char *dst_str = (char *)palloc(buf_size);
diff --git a/src/common/backend/utils/adt/numeric.cpp b/src/common/backend/utils/adt/numeric.cpp
index 48471ec04..e77a2e38a 100644
--- a/src/common/backend/utils/adt/numeric.cpp
+++ b/src/common/backend/utils/adt/numeric.cpp
@@ -39,7 +39,6 @@
#include "utils/biginteger.h"
#include "utils/gs_bitmap.h"
#include "utils/guc.h"
-#include "utils/guc_sql.h"
#include "utils/int8.h"
#include "utils/numeric.h"
#include "utils/sortsupport.h"
@@ -161,7 +160,6 @@ static void zero_var(NumericVar* var);
static const char* set_var_from_str(const char* str, const char* cp, NumericVar* dest);
static void set_var_from_num(Numeric value, NumericVar* dest);
-static void init_var_from_num(Numeric num, NumericVar* dest);
static void set_var_from_var(const NumericVar* value, NumericVar* dest);
static char* get_str_from_var(NumericVar* var);
static char* get_str_from_var_sci(NumericVar* var, int rscale);
@@ -169,7 +167,6 @@ static char* get_str_from_var_sci(NumericVar* var, int rscale);
static void apply_typmod(NumericVar* var, int32 typmod);
static int32 numericvar_to_int32(const NumericVar* var);
-static bool numericvar_to_int64(const NumericVar* var, int64* result);
static double numeric_to_double_no_overflow(Numeric num);
static double numericvar_to_double_no_overflow(NumericVar* var);
@@ -336,22 +333,6 @@ Datum numeric_out(PG_FUNCTION_ARGS)
char* str = NULL;
int scale = 0;
- if (u_sess->attr.attr_sql.for_print_tuple && !u_sess->attr.attr_sql.numeric_out_for_format) {
- char *result = NULL;
- /* to prevent stack overflow*/
- u_sess->attr.attr_sql.numeric_out_for_format = true;
- double var = DatumGetFloat8(DirectFunctionCall1(numeric_float8, NumericGetDatum(num)));
- u_sess->attr.attr_sql.numeric_out_for_format = false;
- if (strcmp(u_sess->attr.attr_common.pset_num_format, "")) {
- result = apply_num_format(var);
- } else if (u_sess->attr.attr_common.pset_num_width > 0) {
- result = apply_num_width(var);
- }
- if (result != NULL) {
- PG_RETURN_CSTRING(result);
- }
- }
-
/*
* Handle NaN
*/
@@ -1395,7 +1376,7 @@ static Datum numeric_abbrev_convert(Datum original_datum, SortSupport ssup)
* This is to handle packed datums without needing a palloc/pfree cycle;
* we keep and reuse a buffer large enough to handle any short datum.
*/
- if (VARATT_IS_SHORT(original_varatt)) {
+ if (!VARATT_IS_HUGE_TOAST_POINTER(original_varatt) && VARATT_IS_SHORT(original_varatt)) {
void* buf = nss->buf;
Size sz = VARSIZE_SHORT(original_varatt) - VARHDRSZ_SHORT;
@@ -4122,9 +4103,7 @@ static const char* set_var_from_str(const char* str, const char* cp, NumericVar*
static void set_var_from_num(Numeric num, NumericVar* dest)
{
Assert(!NUMERIC_IS_BI(num));
- int ndigits;
-
- ndigits = NUMERIC_NDIGITS(num);
+ int ndigits = NUMERIC_NDIGITS(num);
alloc_var(dest, ndigits);
@@ -4152,7 +4131,7 @@ static void set_var_from_num(Numeric num, NumericVar* dest)
* propagate to the original Numeric! It's OK to use it as the destination
* argument of one of the calculational functions, though.
*/
-static inline void init_var_from_num(Numeric num, NumericVar* dest)
+void init_var_from_num(Numeric num, NumericVar* dest)
{
Assert(!NUMERIC_IS_BI(num));
dest->ndigits = NUMERIC_NDIGITS(num);
@@ -4617,7 +4596,7 @@ static void apply_typmod(NumericVar* var, int32 typmod)
*
* If overflow, return false (no error is raised). Return true if okay.
*/
-static bool numericvar_to_int64(const NumericVar* var, int64* result)
+bool numericvar_to_int64(const NumericVar* var, int64* result)
{
NumericDigit* digits = NULL;
int ndigits;
@@ -18565,7 +18544,7 @@ int convert_int128_to_short_numeric_byscale(_out_ char* outBuf, _in_ int128 v, _
* @IN value: input numeric value.
* @return: Numeric - Datum points to fast numeric format
*/
-Datum try_convert_numeric_normal_to_fast(Datum value)
+Datum try_convert_numeric_normal_to_fast(Datum value, ScalarVector *arr)
{
Numeric val = DatumGetNumeric(value);
@@ -18580,7 +18559,7 @@ Datum try_convert_numeric_normal_to_fast(Datum value)
// should be ( whole_scale <= MAXINT64DIGIT)
if (CAN_CONVERT_BI64(whole_scale)) {
int64 result = convert_short_numeric_to_int64_byscale(val, numVar.dscale);
- return makeNumeric64(result, numVar.dscale);
+ return makeNumeric64(result, numVar.dscale, arr);
} else if (CAN_CONVERT_BI128(whole_scale)) {
int128 result = 0;
convert_short_numeric_to_int128_byscale(val, numVar.dscale, result);
diff --git a/src/common/backend/utils/adt/pg_lzcompress.cpp b/src/common/backend/utils/adt/pg_lzcompress.cpp
index f78152f56..6ff680251 100644
--- a/src/common/backend/utils/adt/pg_lzcompress.cpp
+++ b/src/common/backend/utils/adt/pg_lzcompress.cpp
@@ -320,9 +320,6 @@ const PGLZ_Strategy* const PGLZ_strategy_always = &strategy_always_data;
#define HIST_START_LEN (sizeof(PGLZ_HistEntry*) * PGLZ_HISTORY_LISTS)
#define HIST_ENTRIES_LEN (sizeof(PGLZ_HistEntry) * PGLZ_HISTORY_SIZE)
-#define MAX_GOOD_DROP 100
-#define MAX_NEED_RATE 99
-
/* ----------
* pglz_find_match -
*
@@ -667,281 +664,3 @@ void pglz_decompress(const PGLZ_Header* source, char* dest)
* That's it.
*/
}
-
-/* ----------
- * lz_compress -
- *
- * Compresses source into dest using strategy. Returns the number of
- * bytes written in buffer dest, or -1 if compression fails.
- * ----------
- */
-int32 lz_compress(const char* source, int32 slen, char* dest)
-{
- unsigned char* bp = (unsigned char*) dest;
- unsigned char* bstart = bp;
- int hist_next = 0;
- bool hist_recycle = false;
- const char* dp = source;
- const char* dend = source + slen;
- unsigned char ctrl_dummy = 0;
- unsigned char* ctrlp = &ctrl_dummy;
- unsigned char ctrlb = 0;
- unsigned char ctrl = 0;
- bool found_match = false;
- int32 match_len;
- int32 match_off;
- int32 good_match;
- int32 good_drop;
- int32 result_size;
- int32 result_max;
- int32 need_rate;
- errno_t rc;
-
- const PGLZ_Strategy* strategy = PGLZ_strategy_always;
- /*
- * Our fallback strategy is the default.
- */
- if (strategy == NULL) {
- strategy = PGLZ_strategy_default;
- }
-
- /*
- * If the strategy forbids compression (at all or if source chunk size out
- * of range), fail.
- */
- if (strategy->match_size_good <= 0 || slen < strategy->min_input_size || slen > strategy->max_input_size) {
- return -1;
- }
-
- /*
- * Limit the match parameters to the supported range.
- */
- good_match = strategy->match_size_good;
- if (good_match > PGLZ_MAX_MATCH) {
- good_match = PGLZ_MAX_MATCH;
- } else if (good_match < 17) {
- good_match = 17;
- }
-
- good_drop = strategy->match_size_drop;
- if (good_drop < 0) {
- good_drop = 0;
- } else if (good_drop > MAX_GOOD_DROP) {
- good_drop = MAX_GOOD_DROP;
- }
-
- need_rate = strategy->min_comp_rate;
- if (need_rate < 0) {
- need_rate = 0;
- } else if (need_rate > MAX_NEED_RATE) {
- need_rate = MAX_NEED_RATE;
- }
-
- /*
- * Compute the maximum result size allowed by the strategy, namely the
- * input size minus the minimum wanted compression rate. This had better
- * be <= slen, else we might overrun the provided output buffer.
- */
- if (slen > (INT_MAX / 100)) {
- /* Approximate to avoid overflow */
- result_max = (slen / 100) * (100 - need_rate);
- } else {
- result_max = (slen * (100 - need_rate)) / 100;
- }
-
- /*
- * Initialize the history lists to empty. We do not need to zero the
- * hist_entries[] array; its entries are initialized as they are used.
- */
- rc = memset_s(u_sess->utils_cxt.hist_start, HIST_START_LEN, 0, HIST_START_LEN);
- securec_check(rc, "\0", "\0");
-
- /*
- * Compress the source directly into the output buffer.
- */
- while (dp < dend) {
- /*
- * If we already exceeded the maximum result size, fail.
- *
- * We check once per loop; since the loop body could emit as many as 4
- * bytes (a control byte and 3-byte tag), PGLZ_MAX_OUTPUT() had better
- * allow 4 slop bytes.
- */
- if (bp - bstart >= result_max) {
- return -1;
- }
-
- /*
- * If we've emitted more than first_success_by bytes without finding
- * anything compressible at all, fail. This lets us fall out
- * reasonably quickly when looking at incompressible input (such as
- * pre-compressed data).
- */
- if (!found_match && bp - bstart >= strategy->first_success_by) {
- return -1;
- }
-
- /*
- * Try to find a match in the history
- */
- if (pglz_find_match(u_sess->utils_cxt.hist_start, dp, dend, &match_len, &match_off, good_match, good_drop)) {
- /*
- * Create the tag and add history entries for all matched
- * characters.
- */
- pglz_out_tag(ctrlp, ctrlb, ctrl, bp, match_len, match_off);
- while (match_len--) {
- pglz_hist_add(
- u_sess->utils_cxt.hist_start, u_sess->utils_cxt.hist_entries, hist_next, hist_recycle, dp,
- dend);
- dp++; /* Do not do this ++ in the line above! */
- /* The macro would do it four times - Jan. */
- }
- found_match = true;
- } else {
- /*
- * No match found. Copy one literal byte.
- */
- pglz_out_literal(ctrlp, ctrlb, ctrl, bp, *dp);
- pglz_hist_add(
- u_sess->utils_cxt.hist_start, u_sess->utils_cxt.hist_entries, hist_next, hist_recycle, dp, dend);
- dp++; /* Do not do this ++ in the line above! */
- /* The macro would do it four times - Jan. */
- }
- }
-
- /*
- * Write out the last control byte and check that we haven't overrun the
- * output size allowed by the strategy.
- */
- *ctrlp = ctrlb;
- result_size = bp - bstart;
- if (result_size >= result_max) {
- return -1;
- }
-
- /* success */
- return result_size;
-}
-
-/* ----------
- * pglz_decompress -
- *
- * Decompresses source into dest. Returns the number of bytes
- * decompressed in the destination buffer, and *optionally*
- * checks that both the source and dest buffers have been
- * fully read and written to, respectively.
- * ----------
- */
-int32 lz_decompress(const char* source, int32 slen, char* dest, int32 rawsize, bool check_complete)
-{
- const unsigned char* sp;
- const unsigned char* srcend;
- unsigned char* dp;
- unsigned char* destend;
- errno_t rc = 0;
-
- sp = (const unsigned char*) source;
- srcend = ((const unsigned char*) source) + slen;
- dp = (unsigned char*) dest;
- destend = dp + rawsize;
-
- while (sp < srcend && dp < destend) {
- /*
- * Read one control byte and process the next 8 items (or as many as
- * remain in the compressed input).
- */
- unsigned char ctrl = *sp++;
- int ctrlc;
-
- for (ctrlc = 0; ctrlc < 8 && sp < srcend && dp < destend; ctrlc++) {
- if (ctrl & 1) {
- /*
- * Set control bit means we must read a match tag. The match
- * is coded with two bytes. First byte uses lower nibble to
- * code length - 3. Higher nibble contains upper 4 bits of the
- * offset. The next following byte contains the lower 8 bits
- * of the offset. If the length is coded as 18, another
- * extension tag byte tells how much longer the match really
- * was (0-255).
- */
- int32 len;
- int32 off;
-
- len = (sp[0] & 0x0f) + 3;
- off = ((sp[0] & 0xf0) << 4) | sp[1];
- sp += 2;
- if (len == 18) {
- len += *sp++;
- }
-
- /*
- * Now we copy the bytes specified by the tag from OUTPUT to
- * OUTPUT (copy len bytes from dp - off to dp). The copied
- * areas could overlap, to preven possible uncertainty, we
- * copy only non-overlapping regions.
- */
- len = Min(len, destend - dp);
- while (off < len) {
- /*---------
- * When offset is smaller than length - source and
- * destination regions overlap. memmove() is resolving
- * this overlap in an incompatible way with pglz. Thus we
- * resort to memcpy()-ing non-overlapping regions.
- *
- * Consider input: 112341234123412341234
- * At byte 5 here ^ we have match with length 16 and
- * offset 4. 11234M(len=16, off=4)
- * We are decoding first period of match and rewrite match
- * 112341234M(len=12, off=8)
- *
- * The same match is now at position 9, it points to the
- * same start byte of output, but from another position:
- * the offset is doubled.
- *
- * We iterate through this offset growth until we can
- * proceed to usual memcpy(). If we would try to decode
- * the match at byte 5 (len=16, off=4) by memmove() we
- * would issue memmove(5, 1, 16) which would produce
- * 112341234XXXXXXXXXXXX, where series of X is 12
- * undefined bytes, that were at bytes [5:17].
- * ---------
- */
- errno_t rc = memcpy_s(dp, off + 1, dp - off, off);
- securec_check(rc, "", "");
- len -= off;
- dp += off;
- off += off;
- }
- rc = memcpy_s(dp, len + 1, dp - off, len);
- securec_check(rc, "", "");
- dp += len;
- } else {
- /*
- * An unset control bit means LITERAL BYTE. So we just copy
- * one from INPUT to OUTPUT.
- */
- *dp++ = *sp++;
- }
-
- /*
- * Advance the control bit
- */
- ctrl >>= 1;
- }
- }
-
- /*
- * Check we decompressed the right amount. If we are slicing, then we
- * won't necessarily be at the end of the source or dest buffers when we
- * hit a stop, so we don't test them.
- */
- if (check_complete && (dp != destend || sp != srcend)) {
- return -1;
- }
-
- /*
- * That's it.
- */
- return (char*) dp - dest;
-}
diff --git a/src/common/backend/utils/adt/pgstatfuncs.cpp b/src/common/backend/utils/adt/pgstatfuncs.cpp
index e2f3f8f65..d79c6ebe3 100644
--- a/src/common/backend/utils/adt/pgstatfuncs.cpp
+++ b/src/common/backend/utils/adt/pgstatfuncs.cpp
@@ -21,7 +21,10 @@
#include "access/ustore/undo/knl_uundoapi.h"
#include "access/ustore/undo/knl_uundotxn.h"
#include "access/ustore/undo/knl_uundozone.h"
+#include "access/ubtree.h"
#include "access/redo_statistic.h"
+#include "access/xlog_internal.h"
+#include "access/multi_redo_api.h"
#include "connector.h"
#include "catalog/namespace.h"
#include "catalog/pg_database.h"
@@ -32,6 +35,7 @@
#include "commands/dbcommands.h"
#include "commands/user.h"
#include "commands/vacuum.h"
+#include "commands/verify.h"
#include "funcapi.h"
#include "gaussdb_version.h"
#include "libpq/ip.h"
@@ -72,6 +76,7 @@
#include "instruments/list.h"
#include "replication/rto_statistic.h"
#include "storage/lock/lock.h"
+#include "nodes/makefuncs.h"
#define UINT32_ACCESS_ONCE(var) ((uint32)(*((volatile uint32*)&(var))))
#define NUM_PG_LOCKTAG_ID 12
@@ -82,9 +87,7 @@
#define LOWERCASE_LETTERS_ID 87
#define DISPLACEMENTS_VALUE 32
-const int PG_STAT_USP_PERSIST_META_COLS = 7;
-const int STAT_UNDO_LOG_SIZE = 17;
-const int PG_STAT_TRANSLOT_META_COLS = 5;
+const uint32 INDEX_STATUS_VIEW_COL_NUM = 3;
/* bogus ... these externs should be in a header file */
extern Datum pg_stat_get_numscans(PG_FUNCTION_ARGS);
@@ -195,6 +198,7 @@ extern Datum pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS);
extern Datum pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS);
extern Datum pg_stat_get_buf_alloc(PG_FUNCTION_ARGS);
+char g_dir[100] = {0};
typedef enum XactAction {
XACTION_INSERT = 0,
XACTION_UPDATE,
@@ -259,8 +263,6 @@ extern Datum mot_global_memory_detail(PG_FUNCTION_ARGS);
extern Datum mot_local_memory_detail(PG_FUNCTION_ARGS);
extern Datum gs_total_nodegroup_memory_detail(PG_FUNCTION_ARGS);
-/* ustore stat */
-extern Datum gs_stat_ustore(PG_FUNCTION_ARGS);
extern Datum track_memory_context_detail(PG_FUNCTION_ARGS);
@@ -285,6 +287,8 @@ extern Datum pg_autovac_timeout(PG_FUNCTION_ARGS);
static int64 pgxc_exec_autoanalyze_timeout(Oid relOid, int32 coordnum, char* funcname);
extern bool allow_autoanalyze(HeapTuple tuple);
+int g_stat_file_id = -1;
+
/* the size of GaussDB_expr.ir */
#define IR_FILE_SIZE 29800
#define WAITSTATELEN 256
@@ -338,6 +342,11 @@ static const char* WaitStateDesc[] = {
"wait data sync", // STATE_WAIT_DATASYNC
"wait data sync queue", // STATE_WAIT_DATASYNC_QUEUE
"flush data", // STATE_WAIT_FLUSH_DATA
+ "wait reserve td", // STATE_WAIT_RESERVE_TD
+ "wait td rollback", // STATE_WAIT_TD_ROLLBACK
+ "wait transaction rollback", // STATE_WAIT_TRANSACTION_ROLLBACK
+ "prune table", // STATE_PRUNE_TABLE
+ "prune index", // STATE_PRUNE_INDEX
"stream get conn", // STATE_STREAM_WAIT_CONNECT_NODES
"wait producer ready", // STATE_STREAM_WAIT_PRODUCER_READY
"synchronize quit", // STATE_STREAM_WAIT_THREAD_SYNC_QUIT
@@ -345,6 +354,7 @@ static const char* WaitStateDesc[] = {
"wait active statement", // STATE_WAIT_ACTIVE_STATEMENT
"wait memory", // STATE_WAIT_MEMORY
"Sort", // STATE_EXEC_SORT
+ "Sort - fetch tuple", // STATE_EXEC_SORT_FETCH_TUPLE
"Sort - write file", // STATE_EXEC_SORT_WRITE_FILE
"Material", // STATE_EXEC_MATERIAL
"Material - write file", // STATE_EXEC_MATERIAL_WRITE_FILE
@@ -378,8 +388,13 @@ static const char* WaitStateDesc[] = {
"gtm set sequence val", // STATE_GTM_SEQUENCE_SET_VAL
"gtm drop sequence", // STATE_GTM_DROP_SEQUENCE
"gtm rename sequence", // STATE_GTM_RENAME_SEQUENCE
+ "gtm set disaster cluster", // STATE_GTM_SET_DISASTER_CLUSTER
+ "gtm get disaster cluster", // STATE_GTM_GET_DISASTER_CLUSTER
+ "gtm del disaster cluster", // STATE_GTM_DEL_DISASTER_CLUSTER
"wait sync consumer next step", // STATE_WAIT_SYNC_CONSUMER_NEXT_STEP
- "wait sync producer next step" // STATE_WAIT_SYNC_PRODUCER_NEXT_STEP
+ "wait sync producer next step", // STATE_WAIT_SYNC_PRODUCER_NEXT_STEP
+ "gtm set consistency point", // STATE_GTM_SET_CONSISTENCY_POINT
+ "wait sync bgworkers" // STATE_WAIT_SYNC_BGWORKERS
};
// description for WaitStatePhase enums.
@@ -392,6 +407,7 @@ static const char* WaitStatePhaseDesc[] = {
"autovacuum", // PHASE_AUTOVACUUM
};
+
/* ----------
* pgstat_get_waitstatusdesc() -
*
@@ -613,6 +629,45 @@ static TimestampTz pgxc_last_autovac_time(Oid relOid, char* funcname)
return result;
}
+/*
+ * Build tuple desc and store for the caller result
+ * return the tuple store, the tupdesc would be return by pointer.
+ */
+Tuplestorestate *BuildTupleResult(FunctionCallInfo fcinfo, TupleDesc *tupdesc)
+{
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
+ Tuplestorestate *tupstore = NULL;
+
+ MemoryContext per_query_ctx;
+ MemoryContext oldcontext;
+
+ /* check to see if caller supports returning a tuplestore */
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ }
+
+ if (!(rsinfo->allowedModes & SFRM_Materialize))
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("materialize mode required, but it is not "
+ "allowed in this context")));
+
+ /* Build a tuple descriptor for our result type */
+ if (get_call_result_type(fcinfo, NULL, tupdesc) != TYPEFUNC_COMPOSITE)
+ ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("return type must be a row type")));
+
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ oldcontext = MemoryContextSwitchTo(per_query_ctx);
+
+ tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = *tupdesc;
+
+ (void)MemoryContextSwitchTo(oldcontext);
+
+ return tupstore;
+}
+
Datum pg_stat_get_numscans(PG_FUNCTION_ARGS)
{
Oid relid = PG_GETARG_OID(0);
@@ -1314,13 +1369,6 @@ static Datum pg_stat_segment_space_info_internal(Oid spaceid, Oid dbid, PG_FUNCT
SRF_RETURN_DONE(funcctx);
}
-Datum pg_stat_segment_space_info(PG_FUNCTION_ARGS)
-{
- Oid spaceid = PG_GETARG_OID(0);
- Oid dbid = PG_GETARG_OID(1);
- return pg_stat_segment_space_info_internal(spaceid, dbid, fcinfo);
-}
-
Oid get_tablespace_oid_by_name(const char *tablespacename)
{
Relation rel = heap_open(TableSpaceRelationId, AccessShareLock);
@@ -2078,7 +2126,7 @@ Datum pg_stat_get_activity(PG_FUNCTION_ARGS)
Datum pg_stat_get_activity_helper(PG_FUNCTION_ARGS, bool has_conninfo)
{
- const int ATT_COUNT = has_conninfo ? 20 : 19;
+ const int ATT_COUNT = has_conninfo ? 22 : 21;
ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
MemoryContext oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory);
@@ -2106,9 +2154,13 @@ Datum pg_stat_get_activity_helper(PG_FUNCTION_ARGS, bool has_conninfo)
TupleDescInitEntry(tupdesc, (AttrNumber)ARG_18, "connection_info", TEXTOID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)ARG_19, "srespool", NAMEOID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)ARG_20, "global_sessionid", TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)ARG_21, "unique_sql_id", INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)ARG_22, "trace_id", TEXTOID, -1, 0);
} else {
TupleDescInitEntry(tupdesc, (AttrNumber)ARG_18, "srespool", NAMEOID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)ARG_19, "global_sessionid", TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)ARG_20, "unique_sql_id", INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)ARG_21, "trace_id", TEXTOID, -1, 0);
}
rsinfo->returnMode = SFRM_Materialize;
@@ -2154,7 +2206,7 @@ char* GetGlobalSessionStr(GlobalSessionId globalSessionId)
void insert_pg_stat_get_activity_with_conninfo(Tuplestorestate *tupStore, TupleDesc tupDesc,
const PgBackendStatus *beentry)
{
- const int ATT_NUM = 20;
+ const int ATT_NUM = 22;
Datum values[ATT_NUM];
bool nulls[ATT_NUM];
@@ -2338,6 +2390,8 @@ void insert_pg_stat_get_activity_with_conninfo(Tuplestorestate *tupStore, TupleD
char* gId = GetGlobalSessionStr(beentry->globalSessionId);
values[ARR_19] = CStringGetTextDatum(gId);
pfree(gId);
+ values[ARR_20] = Int64GetDatum(beentry->st_unique_sql_key.unique_sql_id);
+ values[ARR_21] = CStringGetTextDatum(beentry->trace_cxt.trace_id);
} else {
/* No permissions to view data about this session */
values[ARR_6] = CStringGetTextDatum("");
@@ -2361,6 +2415,8 @@ void insert_pg_stat_get_activity_with_conninfo(Tuplestorestate *tupStore, TupleD
nulls[ARR_17] = true;
nulls[ARR_18] = true;
nulls[ARR_19] = true;
+ nulls[ARR_20] = true;
+ nulls[ARR_21] = true;
}
tuplestore_putvalues(tupStore, tupDesc, values, nulls);
@@ -2368,7 +2424,7 @@ void insert_pg_stat_get_activity_with_conninfo(Tuplestorestate *tupStore, TupleD
void insert_pg_stat_get_activity(Tuplestorestate *tupStore, TupleDesc tupDesc, const PgBackendStatus *beentry)
{
- const int ATT_NUM = 19;
+ const int ATT_NUM = 21;
Datum values[ATT_NUM];
bool nulls[ATT_NUM];
@@ -2549,6 +2605,8 @@ void insert_pg_stat_get_activity(Tuplestorestate *tupStore, TupleDesc tupDesc, c
(int)beentry->globalSessionId.nodeId, beentry->globalSessionId.sessionId, beentry->globalSessionId.seq);
values[ARR_18] = CStringGetTextDatum(globalSessionId.data);
pfree(globalSessionId.data);
+ values[ARR_19] = Int64GetDatum(beentry->st_unique_sql_key.unique_sql_id);
+ values[ARR_20] = CStringGetTextDatum(beentry->trace_cxt.trace_id);
} else {
/* No permissions to view data about this session */
values[ARR_6] = CStringGetTextDatum("");
@@ -2571,6 +2629,8 @@ void insert_pg_stat_get_activity(Tuplestorestate *tupStore, TupleDesc tupDesc, c
nulls[ARR_16] = true;
nulls[ARR_17] = true;
nulls[ARR_18] = true;
+ nulls[ARR_19] = true;
+ nulls[ARR_20] = true;
}
tuplestore_putvalues(tupStore, tupDesc, values, nulls);
@@ -3362,6 +3422,10 @@ static char* GetLocktagDecode(const char* locktag)
appendStringInfo(&tag, "database:%u, relation:%u, page:=%u, tuple:%u, bucket:%u", locktagField1,
locktagField2, locktagField3, locktagField4, locktagField5);
break;
+ case LOCKTAG_UID:
+ appendStringInfo(&tag, "database:%u, relation:%u, uid:%lu", locktagField1, locktagField2,
+ (((uint64)locktagField3) << DISPLACEMENTS_VALUE) + locktagField4);
+ break;
case LOCKTAG_TRANSACTION:
appendStringInfo(&tag, "transactionid:%lu", TransactionIdGetDatum(
(TransactionId)locktagField1 | ((TransactionId)locktagField2 << DISPLACEMENTS_VALUE)));
@@ -4051,224 +4115,6 @@ Datum pg_stat_get_env(PG_FUNCTION_ARGS)
}
}
-Datum gs_stat_ustore(PG_FUNCTION_ARGS)
-{
- char result[9216] = {0};
-#ifdef DEBUG_UHEAP
- errno_t ret;
- LWLockAcquire(UHeapStatLock, LW_SHARED);
-
- ret = snprintf_s(result, sizeof(result), sizeof(result), "Prune Page \n");
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\tPrune Page (SUCCESS) = %lu \n",
- UHeapStat_shared->prune_page[PRUNE_PAGE_SUCCESS]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\tPrune Page (NO_SPACE) = %lu \n",
- UHeapStat_shared->prune_page[PRUNE_PAGE_NO_SPACE]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tPrune Page (UPDATE_IN_PROGRESS)= %lu \n=========================\n\n",
- UHeapStat_shared->prune_page[PRUNE_PAGE_UPDATE_IN_PROGRESS]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tPrune Page (PRUNE_PAGE_IN_RECOVERY)= %lu \n=========================\n\n",
- UHeapStat_shared->prune_page[PRUNE_PAGE_IN_RECOVERY]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tPrune Page (PRUNE_PAGE_INVALID)= %lu \n=========================\n\n",
- UHeapStat_shared->prune_page[PRUNE_PAGE_INVALID]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tPrune Page (PRUNE_PAGE_XID_FILTER)= %lu \n=========================\n\n",
- UHeapStat_shared->prune_page[PRUNE_PAGE_XID_FILTER]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tPrune Page (PRUNE_PAGE_FILLFACTOR)= %lu \n=========================\n\n",
- UHeapStat_shared->prune_page[PRUNE_PAGE_FILLFACTOR]);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "Prune Page OPs profile \n");
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\t Prune Page SUC: %u %u %u \n",
- UHeapStat_shared->op_count_suc.ins, UHeapStat_shared->op_count_suc.del, UHeapStat_shared->op_count_suc.upd);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\t Prune Page TOT: %u %u %u \n",
- UHeapStat_shared->op_count_tot.ins, UHeapStat_shared->op_count_tot.del, UHeapStat_shared->op_count_tot.upd);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "Prune Page OPs freespace profile \n");
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\t Prune Page FreeSpace TOT: %u %u %u \n", UHeapStat_shared->op_space_tot.ins,
- UHeapStat_shared->op_space_tot.del, UHeapStat_shared->op_space_tot.upd);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "PageReserveTransactionSlot (where to get transaction slot) \n");
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tSlot has been reserved by current xid: %lu \n",
- UHeapStat_shared->get_transslot_from[TRANSSLOT_RESERVED_BY_CURRENT_XID]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tGot free slot after invalidating slots: %lu \n",
- UHeapStat_shared->get_transslot_from[TRANSSLOT_FREE_AFTER_INVALIDATION]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tGot free slot after freezing slots: %lu \n",
- UHeapStat_shared->get_transslot_from[TRANSSLOT_FREE_AFTER_FREEZING]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tCannot get a free transaction slot: %lu \n=========================\n\n",
- UHeapStat_shared->get_transslot_from[TRANSSLOT_CANNOT_GET]);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "Inplace Update Stats \n");
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\tINPLACE UPDATE: %lu \n",
- UHeapStat_shared->update[INPLACE_UPDATE]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\tNON INPLACE UPDATE: %lu \n",
- UHeapStat_shared->update[NON_INPLACE_UPDATE]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tTotal: %lu \n=========================\n\n",
- UHeapStat_shared->update[NON_INPLACE_UPDATE] + UHeapStat_shared->update[INPLACE_UPDATE]);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "Non Inplace Update Reasons \n");
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\tIndex Updated: %lu \n",
- UHeapStat_shared->noninplace_update_cause[INDEX_UPDATED]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\tToast: %lu \n",
- UHeapStat_shared->noninplace_update_cause[TOAST]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\tPrune Page Failed: %lu \n",
- UHeapStat_shared->noninplace_update_cause[PAGE_PRUNE_FAILED]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\tSlot reused: %lu \n",
- UHeapStat_shared->noninplace_update_cause[SLOT_REUSED]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tnblocks < NBLOCKS: %lu \n=========================\n\n",
- UHeapStat_shared->noninplace_update_cause[nblocks_LESS_THAN_NBLOCKS]);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "Slot status in UHeapTupleFetch \n");
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\tFROZEN_SLOT = %lu \n",
- UHeapStat_shared->visibility_check_with_xid[VISIBILITY_CHECK_SUCCESS_FROZEN_SLOT]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "\tXID < Oldest XID in UNDO = %lu \n",
- UHeapStat_shared->visibility_check_with_xid[VISIBILITY_CHECK_SUCCESS_OLDEST_XID]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tSlot is invalid and Xid is Visible in Snapshot = %lu \n",
- UHeapStat_shared->visibility_check_with_xid[VISIBILITY_CHECK_SUCCESS_INVALID_SLOT]);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tFetch Trans Info From UNDO = %lu\n=========================\n\n",
- UHeapStat_shared->visibility_check_with_xid[VISIBILITY_CHECK_SUCCESS_UNDO]);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "Undo Chain Traversal Stat \n");
- securec_check_ss(ret, "\0", "\0");
-
- double tuple_old_version_visit_rate = 0.0;
- if (UHeapStat_shared->tuple_visits > 0) {
- tuple_old_version_visit_rate =
- 1.0 * UHeapStat_shared->tuple_old_version_visits / UHeapStat_shared->tuple_visits;
- }
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "Tuple visits: %lu\tOld version visits: %lu\tOld version visit rate: %.6f \n",
- UHeapStat_shared->tuple_visits, UHeapStat_shared->tuple_old_version_visits, tuple_old_version_visit_rate);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "Undo Chain Traversal Length \n");
- securec_check_ss(ret, "\0", "\0");
-
- double chain_visited_avg_len = 0.0;
- if (UHeapStat_shared->undo_chain_visited_count > 0) {
- chain_visited_avg_len =
- UHeapStat_shared->undo_chain_visited_sum_len * 1.0 / UHeapStat_shared->undo_chain_visited_count;
- }
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\t# Of undo_chain_visited_sum_len = %ld | visited_count = %ld | miss_count = %ld | visited_avg_len = %lf | "
- "visited_max_len = %ld | visited_min_len = %ld \n",
- UHeapStat_shared->undo_chain_visited_sum_len, UHeapStat_shared->undo_chain_visited_count,
- UHeapStat_shared->undo_chain_visited_miss_count, chain_visited_avg_len,
- UHeapStat_shared->undo_chain_visited_max_len, UHeapStat_shared->undo_chain_visited_min_len);
- securec_check_ss(ret, "\0", "\0");
-
- double page_visited_avg_len = 0.0;
- if (UHeapStat_shared->undo_chain_visited_count > 0) {
- page_visited_avg_len =
- UHeapStat_shared->undo_page_visited_sum_len * 1.0 / UHeapStat_shared->undo_chain_visited_count;
- }
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\t# Of undo_page_visited_sum_len = %ld | visited_count = %ld | page_visited_avg_len = %lf \n",
- UHeapStat_shared->undo_page_visited_sum_len, UHeapStat_shared->undo_chain_visited_count, page_visited_avg_len);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "prepare undo record rzero count %lu nzero_count %lu \n", UHeapStat_shared->undo_record_prepare_rzero_count,
- UHeapStat_shared->undo_record_prepare_nzero_count);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "groups allocated %lu released %lu \n",
- UHeapStat_shared->undo_groups_allocate, UHeapStat_shared->undo_groups_release);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "slots allocated %lu released %lu \n",
- UHeapStat_shared->undo_slots_allocate, UHeapStat_shared->undo_slots_recycle);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "space recycle %lu unrecycle %lu \n",
- UHeapStat_shared->undo_space_recycle, UHeapStat_shared->undo_space_unrecycle);
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "oldest xid delay %lu \n",
- UHeapStat_shared->oldest_xid_having_undo_delay);
- securec_check_ss(ret, "\0", "\0");
-
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result), "Undo lock information: \n");
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tDiscard lock hold time(us): total %lu\tmin %lu\tmax %lu\tcnt %lu \tavg %.6f \n",
- UHeapStat_shared->undo_discard_lock_hold_time_sum, UHeapStat_shared->undo_discard_lock_hold_time_min,
- UHeapStat_shared->undo_discard_lock_hold_time_max, UHeapStat_shared->undo_discard_lock_hold_cnt,
- 1.0 * UHeapStat_shared->undo_discard_lock_hold_time_sum / Max(1, UHeapStat_shared->undo_discard_lock_hold_cnt));
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tDiscard lock wait time(us): total %lu\tmin %lu\tmax %lu\tcnt %lu\tavg %.6f \n",
- UHeapStat_shared->undo_discard_lock_wait_time_sum, UHeapStat_shared->undo_discard_lock_wait_time_min,
- UHeapStat_shared->undo_discard_lock_wait_time_max, UHeapStat_shared->undo_discard_lock_wait_cnt,
- 1.0 * UHeapStat_shared->undo_discard_lock_wait_time_sum / Max(1, UHeapStat_shared->undo_discard_lock_wait_cnt));
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tSpace lock hold time(us): total %lu\tmin %lu\tmax %lu\tcnt %lu\tavg %.6f \n",
- UHeapStat_shared->undo_space_lock_hold_time_sum, UHeapStat_shared->undo_space_lock_hold_time_min,
- UHeapStat_shared->undo_space_lock_hold_time_max, UHeapStat_shared->undo_space_lock_hold_cnt,
- 1.0 * UHeapStat_shared->undo_space_lock_hold_time_sum / Max(1, UHeapStat_shared->undo_space_lock_hold_cnt));
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "\tSpace lock wait time(us): total %lu\tmin %lu\tmax %lu\tcnt %lu\tavg %.6f \n",
- UHeapStat_shared->undo_space_lock_wait_time_sum, UHeapStat_shared->undo_space_lock_wait_time_min,
- UHeapStat_shared->undo_space_lock_wait_time_max, UHeapStat_shared->undo_space_lock_wait_cnt,
- 1.0 * UHeapStat_shared->undo_space_lock_wait_time_sum / Max(1, UHeapStat_shared->undo_space_lock_wait_cnt));
- securec_check_ss(ret, "\0", "\0");
- ret = snprintf_s(result + strlen(result), sizeof(result), sizeof(result),
- "INSERT: %lu\tRetry: %lu\tRetry Time: %lu\tRetry Max: %lu\tRetry Time MAX: %lu \n", UHeapStat_shared->dml,
- UHeapStat_shared->retry, UHeapStat_shared->retry_time, UHeapStat_shared->retry_max,
- UHeapStat_shared->retry_time_max);
- securec_check_ss(ret, "\0", "\0");
-
- result[strlen(result)] = '\0';
-
- LWLockRelease(UHeapStatLock);
-
-#endif
- PG_RETURN_TEXT_P(cstring_to_text(result));
-}
-
Datum pg_backend_pid(PG_FUNCTION_ARGS)
{
PG_RETURN_INT64(t_thrd.proc_cxt.MyProcPid);
@@ -5405,7 +5251,10 @@ Datum pg_stat_get_wlm_realtime_ec_operator_info(PG_FUNCTION_ARGS)
}
if (statistics->ec_query) {
- values[++i] = CStringGetTextDatum(statistics->ec_query);
+ char* mask_string = NULL;
+ MASK_PASSWORD_START(mask_string, statistics->ec_query);
+ values[++i] = CStringGetTextDatum(mask_string);
+ MASK_PASSWORD_END(mask_string, statistics->ec_query);
} else {
nulls[++i] = true;
}
@@ -5623,7 +5472,10 @@ Datum pg_stat_get_wlm_statistics(PG_FUNCTION_ARGS)
securec_check(rc, "\0", "\0");
/* Locking is probably not really necessary */
- values[++i] = CStringGetTextDatum(statistics->stmt);
+ char* mask_string = NULL;
+ MASK_PASSWORD_START(mask_string, statistics->stmt);
+ values[++i] = CStringGetTextDatum(mask_string);
+ MASK_PASSWORD_END(mask_string, statistics->stmt);
values[++i] = Int64GetDatum(statistics->blocktime);
values[++i] = Int64GetDatum(statistics->elapsedtime);
values[++i] = Int64GetDatum(statistics->totalcputime);
@@ -6568,11 +6420,14 @@ Datum pg_stat_get_wlm_session_info(PG_FUNCTION_ARGS)
else
nulls[++i] = true;
values[++i] = Int64GetDatum(detail->debug_query_id);
- if (detail->statement && detail->statement[0])
- values[++i] = CStringGetTextDatum(detail->statement);
- else
+ if (detail->statement && detail->statement[0]) {
+ char* mask_string = NULL;
+ MASK_PASSWORD_START(mask_string, detail->statement);
+ values[++i] = CStringGetTextDatum(mask_string);
+ MASK_PASSWORD_END(mask_string, detail->statement);
+ } else {
nulls[++i] = true;
-
+ }
if (t_thrd.proc->workingVersionNum >= SLOW_QUERY_VERSION) {
values[++i] = CStringGetTextDatum(PlanListToString(detail->gendata.query_plan));
} else {
@@ -6778,7 +6633,10 @@ Datum pg_stat_get_wlm_ec_operator_info(PG_FUNCTION_ARGS)
}
if (statistics->ec_query) {
- values[++i] = CStringGetTextDatum(statistics->ec_query);
+ char* mask_string = NULL;
+ MASK_PASSWORD_START(mask_string, statistics->ec_query);
+ values[++i] = CStringGetTextDatum(mask_string);
+ MASK_PASSWORD_END(mask_string, statistics->ec_query);
} else {
nulls[++i] = true;
}
@@ -8797,7 +8655,7 @@ Datum pg_buffercache_pages(PG_FUNCTION_ARGS)
fctx->record[i].forknum = bufHdr->tag.forkNum;
fctx->record[i].blocknum = bufHdr->tag.blockNum;
fctx->record[i].usagecount = BUF_STATE_GET_USAGECOUNT(buf_state);
- fctx->record[i].pinning_backends = BUF_STATE_GET_REFCOUNT(buf_state);
+ fctx->record[i].pinning_backends = BUF_STATE_GET_REFCOUNT(buf_state);
if (buf_state & BM_DIRTY)
fctx->record[i].isdirty = true;
@@ -8841,7 +8699,7 @@ Datum pg_buffercache_pages(PG_FUNCTION_ARGS)
* Set all fields except the bufferid to null if the buffer is unused
* or not valid.
*/
- if (fctx->record[i].blocknum == InvalidBlockNumber || fctx->record[i].isvalid == false) {
+ if (fctx->record[i].blocknum == InvalidBlockNumber) {
nulls[1] = true;
nulls[2] = true;
nulls[3] = true;
@@ -8873,7 +8731,7 @@ Datum pg_buffercache_pages(PG_FUNCTION_ARGS)
nulls[8] = false;
values[9] = BoolGetDatum(fctx->record[i].isvalid);
nulls[9] = false;
- values[10] = Int16GetDatum(fctx->record[i].usagecount);
+ values[10] = Int16GetDatum(fctx->record[i].usagecount);
nulls[10] = false;
values[11] = Int32GetDatum(fctx->record[i].pinning_backends);
nulls[11] = false;
@@ -10959,25 +10817,26 @@ void insert_comm_client_info(Tuplestorestate *tupStore, TupleDesc tupDesc, const
void fill_callcxt_for_comm_check_connection_status(FuncCallContext *funcctx)
{
- const int att_num = 5;
+ const int attNum = 6;
int att_idx = 1;
ConnectionStatus *conns_entry = NULL;
-
+
MemoryContext oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
-
- TupleDesc tupdesc = CreateTemplateTupleDesc(att_num, false);
-
+
+ TupleDesc tupdesc = CreateTemplateTupleDesc(attNum, false);
+
TupleDescInitEntry(tupdesc, (AttrNumber) att_idx++, "node_name", TEXTOID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber) att_idx++, "remote_name", TEXTOID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber) att_idx++, "remote_host", TEXTOID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber) att_idx++, "remote_port", INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber) att_idx++, "is_connected", BOOLOID, -1, 0);
-
+ TupleDescInitEntry(tupdesc, (AttrNumber) att_idx++, "no_error_occur", BOOLOID, -1, 0);
+
funcctx->tuple_desc = BlessTupleDesc(tupdesc);
-
+
funcctx->max_calls = check_connection_status(&conns_entry);
funcctx->user_fctx = conns_entry;
-
+
MemoryContextSwitchTo(oldcontext);
return;
}
@@ -10994,6 +10853,7 @@ void fill_values_for_comm_check_connection_status(Datum *values,
values[att_idx++] = CStringGetTextDatum(poolCon->remote_host);
values[att_idx++] = (Datum)(poolCon->remote_port);
values[att_idx++] = BoolGetDatum(poolCon->is_connected);
+ values[att_idx++] = BoolGetDatum(poolCon->no_error_occur);
return;
}
@@ -11004,9 +10864,20 @@ void fill_values_for_comm_check_connection_status(Datum *values,
*/
Datum comm_check_connection_status(PG_FUNCTION_ARGS)
{
+#ifndef ENABLE_MULTIPLE_NODES
+ FuncCallContext* funcctx = NULL;
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unsupported function/view in single node mode.")));
+ SRF_RETURN_DONE(funcctx);
+#else
+ if (IS_PGXC_DATANODE) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unsupported functin/view in datenode.")));
+ }
+
FuncCallContext *funcctx = NULL;
ConnectionStatus *conns_entry = NULL;
- const int att_num = 5;
+ const int attNum = 6;
if (SRF_IS_FIRSTCALL()) {
funcctx = SRF_FIRSTCALL_INIT();
@@ -11019,8 +10890,8 @@ Datum comm_check_connection_status(PG_FUNCTION_ARGS)
if (funcctx->call_cntr < funcctx->max_calls) {
/* for each row */
- Datum values[att_num] = {0};
- bool nulls[att_num] = {false};
+ Datum values[attNum] = {0};
+ bool nulls[attNum] = {false};
fill_values_for_comm_check_connection_status(values, funcctx, conns_entry);
HeapTuple tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
@@ -11038,6 +10909,7 @@ Datum comm_check_connection_status(PG_FUNCTION_ARGS)
/* nothing left */
SRF_RETURN_DONE(funcctx);
}
+#endif
}
@@ -13901,10 +13773,64 @@ Datum remote_single_flush_dw_stat(PG_FUNCTION_ARGS)
#endif
}
+static void gs_stat_read_dw_batch(Tuplestorestate *tupStore, TupleDesc tupDesc)
+{
+
+ int i, j;
+ errno_t rc = 0;
+ int row_num = g_instance.dw_batch_cxt.batch_meta_file.dw_file_num;
+ int col_num = DW_VIEW_COL_NUM;
+
+ Datum values[col_num];
+ bool nulls[col_num];
+
+ for (i = 0; i < row_num; i++) {
+ g_stat_file_id = i;
+
+ rc = memset_s(values, sizeof(values), 0, sizeof(values));
+ securec_check(rc, "\0", "\0");
+ rc = memset_s(nulls, sizeof(nulls), 1, sizeof(nulls));
+ securec_check(rc, "\0", "\0");
+
+ for (j = 0; j < col_num; j++) {
+ values[j] = g_dw_view_col_arr[j].get_data();
+ nulls[j] = false;
+ }
+
+ tuplestore_putvalues(tupStore, tupDesc, values, nulls);
+ }
+
+ g_stat_file_id = -1;
+}
+
Datum local_double_write_stat(PG_FUNCTION_ARGS)
{
- HeapTuple tuple = form_function_tuple(DW_VIEW_COL_NUM, DW_BATCH_FUNC);
- PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
+ int i;
+ int col_num = DW_VIEW_COL_NUM;
+ TupleDesc tupdesc = NULL;
+
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+
+ MemoryContext oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory);
+
+ tupdesc = CreateTemplateTupleDesc(DW_VIEW_COL_NUM, false, TAM_HEAP);
+
+ for (i = 0; i < col_num; i++) {
+ TupleDescInitEntry(tupdesc, (AttrNumber)(i + 1),
+ g_dw_view_col_arr[i].name, g_dw_view_col_arr[i].data_type, -1, 0);
+ }
+
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->setDesc = BlessTupleDesc(tupdesc);
+
+ (void)gs_stat_read_dw_batch(rsinfo->setResult, rsinfo->setDesc);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ tuplestore_donestoring(rsinfo->setResult);
+
+ return (Datum) 0;
}
Datum remote_double_write_stat(PG_FUNCTION_ARGS)
@@ -13969,6 +13895,72 @@ Datum remote_double_write_stat(PG_FUNCTION_ARGS)
#endif
}
+Datum local_redo_time_count(PG_FUNCTION_ARGS)
+{
+ TupleDesc tupdesc;
+ Tuplestorestate *tupstore = BuildTupleResult(fcinfo, &tupdesc);
+ const uint32 xlog_redo_static_cols = 21;
+ Datum values[xlog_redo_static_cols];
+ bool nulls[xlog_redo_static_cols];
+
+ RedoWorkerTimeCountsInfo *workerCountInfoList = NULL;
+ uint32 realNum = 0;
+ GetRedoWorkerTimeCount(&workerCountInfoList, &realNum);
+
+ for (uint32 i = 0; i < realNum; ++i) {
+ uint32 k = 0;
+ values[k] = CStringGetTextDatum(workerCountInfoList[i].worker_name);
+ nulls[k++] = false;
+ pfree(workerCountInfoList[i].worker_name);
+
+ for (uint32 j = 0; j < (uint32)TIME_COST_NUM; ++j) {
+ values[k] = Int64GetDatum(workerCountInfoList[i].time_cost[j].totalDuration);
+ nulls[k++] = false;
+ values[k] = Int64GetDatum(workerCountInfoList[i].time_cost[j].counter);
+ nulls[k++] = false;
+ }
+ tuplestore_putvalues(tupstore, tupdesc, values, nulls);
+ }
+ if (workerCountInfoList != NULL) {
+ pfree(workerCountInfoList);
+ }
+ tuplestore_donestoring(tupstore);
+ return (Datum)0;
+}
+
+Datum local_xlog_redo_statics(PG_FUNCTION_ARGS)
+{
+ TupleDesc tupdesc;
+ Tuplestorestate *tupstore = BuildTupleResult(fcinfo, &tupdesc);
+ const uint32 xlog_redo_static_cols = 5;
+ Datum values[xlog_redo_static_cols];
+ bool nulls[xlog_redo_static_cols];
+ const uint32 subtypeShiftSize = 4;
+ for (uint32 i = 0; i < RM_NEXT_ID; ++i) {
+ for (uint32 j = 0; j < MAX_XLOG_INFO_NUM; ++j) {
+ if (g_instance.comm_cxt.predo_cxt.xlogStatics[i][j].total_num == 0) {
+ continue;
+ }
+ uint32 k = 0;
+ values[k] = CStringGetTextDatum(RmgrTable[i].rm_type_name((j << subtypeShiftSize)));
+ nulls[k++] = false;
+ values[k] = Int32GetDatum(i);
+ nulls[k++] = false;
+ values[k] = Int32GetDatum(j << subtypeShiftSize);
+ nulls[k++] = false;
+ values[k] = Int64GetDatum(g_instance.comm_cxt.predo_cxt.xlogStatics[i][j].total_num);
+ nulls[k++] = false;
+ values[k] = Int64GetDatum(g_instance.comm_cxt.predo_cxt.xlogStatics[i][j].extra_num);
+ nulls[k++] = false;
+ tuplestore_putvalues(tupstore, tupdesc, values, nulls);
+ }
+ }
+
+ tuplestore_donestoring(tupstore);
+
+ return (Datum)0;
+}
+
Datum local_redo_stat(PG_FUNCTION_ARGS)
{
TupleDesc tupdesc = NULL;
@@ -14552,7 +14544,8 @@ Datum gs_hadr_local_rto_and_rpo_stat(PG_FUNCTION_ARGS)
TupleDescInitEntry(tupdesc, (AttrNumber)8, "target_rto", INT8OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)9, "current_rpo", INT8OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)10, "target_rpo", INT8OID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)11, "current_sleep_time", INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)11, "rto_sleep_time", INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)12, "rpo_sleep_time", INT8OID, -1, 0);
/* complete descriptor of the tupledesc */
funcctx->tuple_desc = BlessTupleDesc(tupdesc);
@@ -14589,7 +14582,8 @@ Datum gs_hadr_local_rto_and_rpo_stat(PG_FUNCTION_ARGS)
values[7] = Int64GetDatum(entry->target_rto);
values[8] = Int64GetDatum(entry->current_rpo);
values[9] = Int64GetDatum(entry->target_rpo);
- values[10] = Int64GetDatum(entry->current_sleep_time);
+ values[10] = Int64GetDatum(entry->rto_sleep_time);
+ values[11] = Int64GetDatum(entry->rpo_sleep_time);
tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
@@ -14628,7 +14622,8 @@ Datum gs_hadr_remote_rto_and_rpo_stat(PG_FUNCTION_ARGS)
TupleDescInitEntry(tupdesc, (AttrNumber)8, "target_rto", INT8OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)9, "current_rpo", INT8OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)10, "target_rpo", INT8OID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)11, "current_sleep_time", INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)11, "rto_sleep_time", INT8OID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)12, "rpo_sleep_time", INT8OID, -1, 0);
funcctx->tuple_desc = BlessTupleDesc(tupdesc);
funcctx->max_calls = u_sess->pgxc_cxt.NumDataNodes + u_sess->pgxc_cxt.NumCoords;
@@ -14731,610 +14726,135 @@ Datum track_memory_context_detail(PG_FUNCTION_ARGS)
}
}
-using namespace undo;
-static uint64 UndoSize(UndoSpaceType type)
+#ifdef ENABLE_MULTIPLE_NODES
+/* Get the head row of the view of index status */
+TupleDesc get_index_status_view_frist_row()
{
- uint64 used = 0;
- for (auto idx = 0; idx < UNDO_ZONE_COUNT; idx++) {
- undo::UndoZone *uzone = (undo::UndoZone *)g_instance.undo_cxt.uZones[idx];
- if (uzone == NULL) {
- continue;
- }
- if (type == UNDO_LOG_SPACE) {
- used += uzone->UndoSize();
+ TupleDesc tupdesc = NULL;
+ tupdesc = CreateTemplateTupleDesc(INDEX_STATUS_VIEW_COL_NUM, false, TAM_HEAP);
+ TupleDescInitEntry(tupdesc, (AttrNumber)1, "node_name", TEXTOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)2, "indisready", BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber)3, "indisvalid", BOOLOID, -1, 0);
+ return BlessTupleDesc(tupdesc);
+}
+
+HeapTuple fetch_local_index_status(FuncCallContext *funcctx, char *schname, char *idxname)
+{
+ if (funcctx->call_cntr < funcctx->max_calls) {
+ /* for local cn, get index status */
+ Datum values[INDEX_STATUS_VIEW_COL_NUM];
+ bool nulls[INDEX_STATUS_VIEW_COL_NUM] = {false};
+
+ Oid idx_oid = InvalidOid;
+ if (schname == NULL || strlen(schname) == 0) {
+ idx_oid = RangeVarGetRelid(makeRangeVar(NULL, idxname, -1), NoLock, false);
} else {
- used += uzone->SlotSize();
- }
- }
- return used;
-}
-
-static void ReadUndoZoneMetaFromShared(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore)
-{
- Assert(tupleDesc != NULL);
- Assert(tupstore != NULL);
-
- uint32 startIdx = 0;
- uint32 endIdx = 0;
- uint64 used = 0;
- char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
- if (id == INVALID_ZONE_ID) {
- used = UndoSize(UNDO_LOG_SPACE) + UndoSize(UNDO_SLOT_SPACE);
- endIdx = UNDO_ZONE_COUNT - 1;
- } else {
- used = UndoSize(UNDO_LOG_SPACE);
- startIdx = id;
- endIdx = id;
- }
-
- for (auto idx = startIdx; idx <= endIdx; idx++) {
- bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
- Datum values[PG_STAT_USP_PERSIST_META_COLS];
- UndoZone *uzone = (undo::UndoZone *)g_instance.undo_cxt.uZones[idx];
- if (uzone == NULL) {
- continue;
- }
- values[0] = ObjectIdGetDatum((Oid)uzone->GetZoneId());
- values[1] = ObjectIdGetDatum((Oid)uzone->GetPersitentLevel());
- errno_t rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(uzone->GetInsert()));
- securec_check_ss(rc, "\0", "\0");
- values[2] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
- UNDO_PTR_GET_OFFSET(uzone->GetDiscard()));
- securec_check_ss(rc, "\0", "\0");
- values[3] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
- UNDO_PTR_GET_OFFSET(uzone->GetForceDiscard()));
- securec_check_ss(rc, "\0", "\0");
- values[4] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
- used);
- securec_check_ss(rc, "\0", "\0");
- values[5] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
- uzone->GetLSN());
- securec_check_ss(rc, "\0", "\0");
- values[6] = CStringGetTextDatum(textBuffer);
- tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
- }
-
- tuplestore_donestoring(tupstore);
-}
-
-void Checkfd(int fd)
-{
- if (fd < 0) {
- ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), errmsg("could not open file \%s", UNDO_META_FILE)));
- return;
- }
-}
-
-void Checkid(const int id, uint32* startIdx, uint32* endIdx)
-{
- if (id == INVALID_ZONE_ID) {
- *endIdx = UNDO_ZONE_COUNT - 1;
- } else {
- *startIdx = id;
- *endIdx = id;
- }
-}
-
-void GetZoneMetaValues(Datum *values, char *textBuffer,
- UndoZoneMetaInfo undoZoneMeta, uint32 idx, errno_t *rc)
-{
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(undoZoneMeta.insert));
- securec_check_ss(*rc, "\0", "\0");
- values[2] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(undoZoneMeta.discard));
- securec_check_ss(*rc, "\0", "\0");
- values[3] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(undoZoneMeta.forceDiscard));
- securec_check_ss(*rc, "\0", "\0");
- values[4] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, 0);
- securec_check_ss(*rc, "\0", "\0");
- values[5] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, undoZoneMeta.lsn);
- securec_check_ss(*rc, "\0", "\0");
- values[6] = CStringGetTextDatum(textBuffer);
-}
-
-static void ReadUndoZoneMetaFromDisk(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore)
-{
- Assert(tupleDesc != NULL);
- Assert(tupstore != NULL);
- int ret = 0;
- uint32 startIdx = 0;
- uint32 endIdx = 0;
- char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
- int fd = BasicOpenFile(UNDO_META_FILE, O_RDWR | PG_BINARY, S_IRUSR | S_IWUSR);
-
- Checkfd(fd);
- Checkid(id, &startIdx, &endIdx);
- for (auto idx = startIdx; idx <= endIdx; idx++) {
- bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
- Datum values[PG_STAT_USP_PERSIST_META_COLS];
- uint32 readPos = 0;
- UndoZoneMetaInfo undoZoneMeta;
- errno_t rc;
-
- if (idx < PERSIST_ZONE_COUNT) {
- readPos = (idx / UNDOZONE_COUNT_PER_PAGE) * UNDO_META_PAGE_SIZE +
- (idx % UNDOZONE_COUNT_PER_PAGE) * sizeof(UndoZoneMetaInfo);
- lseek(fd, readPos, SEEK_SET);
- ret = read(fd, &undoZoneMeta, sizeof(UndoZoneMetaInfo));
- if (ret != sizeof(UndoZoneMetaInfo)) {
- ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
- errmsg("Read undo meta file fail, expect size(%lu), real size(%u)",
- sizeof(UndoZoneMetaInfo), ret)));
- break;
- }
- } else {
- rc = memset_s(&undoZoneMeta, sizeof(UndoZoneMetaInfo), 0, sizeof(UndoZoneMetaInfo));
- securec_check(rc, "\0", "\0");
- }
- DECLARE_NODE_COUNT();
- GET_UPERSISTENCE_BY_ZONEID((int)idx, nodeCount);
- values[0] = ObjectIdGetDatum((Oid)idx);
- values[1] = ObjectIdGetDatum((Oid)upersistence);
- GetZoneMetaValues(values, textBuffer, undoZoneMeta, idx, &rc);
- tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
- }
-
- tuplestore_donestoring(tupstore);
- close(fd);
-}
-
-static void ReadTransSlotMetaFromShared(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore)
-{
- Assert(tupleDesc != NULL);
- Assert(tupstore != NULL);
-
- uint32 startIdx = 0;
- uint32 endIdx = 0;
- char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
-
- if (id == INVALID_ZONE_ID) {
- endIdx = UNDO_ZONE_COUNT - 1;
- } else {
- startIdx = id;
- endIdx = id;
- }
-
- for (auto idx = startIdx; idx <= endIdx; idx++) {
- bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
- Datum values[PG_STAT_USP_PERSIST_META_COLS];
- UndoZone *uzone = (undo::UndoZone *)g_instance.undo_cxt.uZones[idx];
- if (uzone == NULL) {
- continue;
- }
- values[0] = ObjectIdGetDatum((Oid)idx);
- values[1] = ObjectIdGetDatum((Oid)0); // unused
- errno_t rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(uzone->GetAllocate()));
- securec_check_ss(rc, "\0", "\0");
- values[2] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(uzone->GetRecycle()));
- securec_check_ss(rc, "\0", "\0");
- values[3] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, "%016lu",
- UNDO_PTR_GET_OFFSET(uzone->GetRecycleXid()));
- securec_check_ss(rc, "\0", "\0");
- values[4] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, "%016lu",
- GetOldestXminForUndo());
- securec_check_ss(rc, "\0", "\0");
- values[5] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, "%016lu",
- pg_atomic_read_u64(&g_instance.proc_base->oldestXidInUndo));
- securec_check_ss(rc, "\0", "\0");
- values[6] = CStringGetTextDatum(textBuffer);
- tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
- }
-
- tuplestore_donestoring(tupstore);
-}
-
-void GetTransMetaValues(Datum *values, char *textBuffer,
- UndoZoneMetaInfo undoZoneMeta, uint32 loop, errno_t *rc)
-{
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(undoZoneMeta.allocate));
- securec_check_ss(*rc, "\0", "\0");
- values[2] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(undoZoneMeta.recycle));
- securec_check_ss(*rc, "\0", "\0");
- values[3] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- "%016lu", undoZoneMeta.recycleXid);
- securec_check_ss(*rc, "\0", "\0");
- values[4] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- "%016lu", GetOldestXminForUndo());
- securec_check_ss(*rc, "\0", "\0");
- values[5] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- "%016lu", pg_atomic_read_u64(&g_instance.proc_base->oldestXidInUndo));
- securec_check_ss(*rc, "\0", "\0");
- values[6] = CStringGetTextDatum(textBuffer);
-}
-
-static void ReadTransSlotMetaFromDisk(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore)
-{
- Assert(tupleDesc != NULL);
- Assert(tupstore != NULL);
- int ret = 0;
- uint32 startIdx = 0;
- uint32 endIdx = 0;
- char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
- int fd = BasicOpenFile(UNDO_META_FILE, O_RDWR | PG_BINARY, S_IRUSR | S_IWUSR);
-
- Checkfd(fd);
- Checkid(id, &startIdx, &endIdx);
- for (auto idx = startIdx; idx <= endIdx; idx++) {
- bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
- Datum values[PG_STAT_USP_PERSIST_META_COLS];
- uint32 readPos = 0;
- UndoZoneMetaInfo undoZoneMeta;
- errno_t rc;
-
- if (idx < PERSIST_ZONE_COUNT) {
- readPos = (idx / UNDOZONE_COUNT_PER_PAGE) * UNDO_META_PAGE_SIZE +
- (idx % UNDOZONE_COUNT_PER_PAGE) * sizeof(UndoZoneMetaInfo);
- lseek(fd, readPos, SEEK_SET);
- ret = read(fd, &undoZoneMeta, sizeof(UndoZoneMetaInfo));
- if (ret != sizeof(UndoZoneMetaInfo)) {
- ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
- errmsg("Read undo meta file fail, expect size(%lu), real size(%u)",
- sizeof(UndoZoneMetaInfo), ret)));
- break;
- }
- } else {
- rc = memset_s(&undoZoneMeta, sizeof(UndoZoneMetaInfo), 0, sizeof(UndoZoneMetaInfo));
- securec_check(rc, "\0", "\0");
+ idx_oid = RangeVarGetRelid(makeRangeVar(schname, idxname, -1), NoLock, false);
}
- DECLARE_NODE_COUNT();
- GET_UPERSISTENCE_BY_ZONEID((int)idx, nodeCount);
- values[0] = ObjectIdGetDatum((Oid)idx);
- values[1] = ObjectIdGetDatum((Oid)upersistence);
- GetTransMetaValues(values, textBuffer, undoZoneMeta, idx, &rc);
- tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
- }
-
- tuplestore_donestoring(tupstore);
- close(fd);
-}
-
-static uint64 UndoSpaceSize(UndoSpaceType type)
-{
- uint64 used = 0;
- for (auto idx = 0; idx < UNDO_ZONE_COUNT; idx++) {
- UndoSpace *usp;
- if (g_instance.undo_cxt.uZones[idx] == NULL) {
- continue;
+ if (!OidIsValid(idx_oid)) {
+ ereport(ERROR, (errmodule(MOD_FUNCTION), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("The given schema or index name cannot find."),
+ errdetail("Cannot find valid oid from the given index name."),
+ errcause("Input error schema or index name."),
+ erraction("Check the input schema and index name.")));
}
- if (type == UNDO_LOG_SPACE) {
- usp = ((UndoZone *)g_instance.undo_cxt.uZones[idx])->GetUndoSpace();
- } else {
- usp = ((UndoZone *)g_instance.undo_cxt.uZones[idx])->GetSlotSpace();
+ HeapTuple indexTuple = SearchSysCacheCopy1(INDEXRELID, ObjectIdGetDatum(idx_oid));
+ if (!HeapTupleIsValid(indexTuple)) {
+ ereport(ERROR, (errmodule(MOD_CACHE), errcode(ERRCODE_CACHE_LOOKUP_FAILED),
+ errmsg("cache lookup failed for index %u.", idx_oid),
+ errdetail("The index tuple is invalide."),
+ errcause("The index is not found in syscache."),
+ erraction("Retry this function.")));
}
- used += (uint64)usp->Used();
+ Form_pg_index indexForm = (Form_pg_index)GETSTRUCT(indexTuple);
+
+ values[0] = CStringGetTextDatum(g_instance.attr.attr_common.PGXCNodeName);
+ values[1] = BoolGetDatum(indexForm->indisready);
+ values[2] = BoolGetDatum(indexForm->indisvalid);
+ return heap_form_tuple(funcctx->tuple_desc, values, nulls);
}
- return used;
+ return NULL;
}
-static void ReadUndoSpaceFromShared(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore,
- UndoSpaceType type)
+/*
+ * @Description : Get index status on all nodes.
+ * @in : schemaname, idxname
+ * @out : None
+ * @return : Node.
+ */
+Datum gs_get_index_status(PG_FUNCTION_ARGS)
{
- Assert(tupleDesc != NULL);
- Assert(tupstore != NULL);
-
- uint32 startIdx = 0;
- uint32 endIdx = 0;
- char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
- uint64 used = UndoSpaceSize(type);
-
- if (id == INVALID_ZONE_ID) {
- used = UndoSpaceSize(UNDO_LOG_SPACE) + UndoSpaceSize(UNDO_SLOT_SPACE);
- endIdx = UNDO_ZONE_COUNT - 1;
- } else {
- used = UndoSpaceSize(type);
- startIdx = id;
- endIdx = id;
- }
-
- for (auto idx = startIdx; idx <= endIdx; idx++) {
- bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
- Datum values[PG_STAT_USP_PERSIST_META_COLS];
- UndoSpace *usp;
- if (g_instance.undo_cxt.uZones[idx] == NULL) {
- continue;
- }
- if (type == UNDO_LOG_SPACE) {
- usp = ((UndoZone *)g_instance.undo_cxt.uZones[idx])->GetUndoSpace();
- } else {
- usp = ((UndoZone *)g_instance.undo_cxt.uZones[idx])->GetSlotSpace();
- }
- values[0] = ObjectIdGetDatum((Oid)idx);
- values[1] = ObjectIdGetDatum((Oid)0); // unused
- errno_t rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(usp->Tail()));
- securec_check_ss(rc, "\0", "\0");
- values[2] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(usp->Head()));
- securec_check_ss(rc, "\0", "\0");
- values[3] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1,
- UNDO_REC_PTR_FORMAT, used);
- securec_check_ss(rc, "\0", "\0");
- values[4] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1,
- UNDO_REC_PTR_FORMAT, usp->Used());
- securec_check_ss(rc, "\0", "\0");
- values[5] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1,
- UNDO_REC_PTR_FORMAT, usp->LSN());
- securec_check_ss(rc, "\0", "\0");
- values[6] = CStringGetTextDatum(textBuffer);
- tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
- }
-
- tuplestore_donestoring(tupstore);
-}
-
-void GetUndoSpaceValues(Datum *values, char *textBuffer,
- UndoSpaceMetaInfo undoSpaceMeta, uint32 loop, errno_t *rc)
-{
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(undoSpaceMeta.tail));
- securec_check_ss(*rc, "\0", "\0");
- values[2] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, UNDO_PTR_GET_OFFSET(undoSpaceMeta.head));
- securec_check_ss(*rc, "\0", "\0");
- values[3] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, (uint64)0xFFFF);
- securec_check_ss(*rc, "\0", "\0");
- values[4] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, (undoSpaceMeta.tail - undoSpaceMeta.head) / BLCKSZ);
- securec_check_ss(*rc, "\0", "\0");
- values[5] = CStringGetTextDatum(textBuffer);
- *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1,
- UNDO_REC_PTR_FORMAT, undoSpaceMeta.lsn);
- securec_check_ss(*rc, "\0", "\0");
- values[6] = CStringGetTextDatum(textBuffer);
-}
-
-static void ReadUndoSpaceFromDisk(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore,
- UndoSpaceType type)
-{
- Assert(tupleDesc != NULL);
- Assert(tupstore != NULL);
- int ret = 0;
- uint32 startIdx = 0;
- uint32 endIdx = 0;
- uint32 undoSpaceBegin = 0;
- uint32 undoZoneMetaPageCnt = 0;
- uint32 undoSpaceMetaPageCnt = 0;
- char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
- int fd = BasicOpenFile(UNDO_META_FILE, O_RDWR | PG_BINARY, S_IRUSR | S_IWUSR);
-
- Checkfd(fd);
- Checkid(id, &startIdx, &endIdx);
-
- /* Seek start position for writing transactionGroup meta. */
- UNDOZONE_META_PAGE_COUNT(UNDO_ZONE_COUNT, UNDOZONE_COUNT_PER_PAGE, undoZoneMetaPageCnt);
- UNDOZONE_META_PAGE_COUNT(UNDO_ZONE_COUNT, UNDOSPACE_COUNT_PER_PAGE, undoSpaceMetaPageCnt);
- if (type == UNDO_LOG_SPACE) {
- undoSpaceBegin = undoZoneMetaPageCnt * UNDO_META_PAGE_SIZE;
- } else {
- undoSpaceBegin = (undoZoneMetaPageCnt + undoSpaceMetaPageCnt) * UNDO_META_PAGE_SIZE;
- }
-
- for (auto idx = startIdx; idx <= endIdx; idx++) {
- bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
- Datum values[PG_STAT_USP_PERSIST_META_COLS];
- uint32 readPos = 0;
- UndoSpaceMetaInfo undoSpaceMeta;
- errno_t rc;
- if (idx < PERSIST_ZONE_COUNT) {
- readPos = undoSpaceBegin + (idx / UNDOZONE_COUNT_PER_PAGE) * UNDO_META_PAGE_SIZE +
- (idx % UNDOZONE_COUNT_PER_PAGE) * sizeof(UndoSpaceMetaInfo);
- lseek(fd, readPos, SEEK_SET);
- ret = read(fd, &undoSpaceMeta, sizeof(UndoSpaceMetaInfo));
- if (ret != sizeof(UndoSpaceMetaInfo)) {
- ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
- errmsg("Read undo meta file fail, expect size(%lu), real size(%u)",
- sizeof(UndoSpaceMetaInfo), ret)));
- break;
- }
- } else {
- rc = memset_s(&undoSpaceMeta, sizeof(UndoSpaceMetaInfo), 0, sizeof(UndoSpaceMetaInfo));
- securec_check(rc, "\0", "\0");
- }
- DECLARE_NODE_COUNT();
- GET_UPERSISTENCE_BY_ZONEID((int)idx, nodeCount);
- values[0] = ObjectIdGetDatum((Oid)idx);
- values[1] = ObjectIdGetDatum((Oid)upersistence);
- GetUndoSpaceValues(values, textBuffer, undoSpaceMeta, idx, &rc);
- tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
- }
-
- tuplestore_donestoring(tupstore);
- close(fd);
-}
-
-bool Checkrsinfo(const ReturnSetInfo *rsinfo)
-{
- if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
- ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("set-valued function called in context that cannot accept a set")));
- return true;
- }
- if (!(rsinfo->allowedModes & SFRM_Materialize)) {
- ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("materialize mode required, but it is not allowed in this context")));
- return true;
- }
- return false;
-}
-
-Datum gs_undo_meta(PG_FUNCTION_ARGS)
-{
- int type = PG_GETARG_INT32(0); // Indicate meta data type(0:undozone, 1:group, 2:undoSpace, 3:slotSpace)
- int id = PG_GETARG_INT32(1); // zoneId (-1 represents all)
- int metaLocation = PG_GETARG_INT32(2); // meta location (0:shared , 1:disk)
- ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
- TupleDesc tupDesc;
- Tuplestorestate *tupstore = NULL;
- MemoryContext per_query_ctx;
- MemoryContext oldcontext;
-
- if (Checkrsinfo(rsinfo)) {
- PG_RETURN_VOID();
- }
- if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
- elog(ERROR, "return type must be a row type");
+ if (IS_PGXC_DATANODE) {
+ ereport(ERROR, (errmodule(MOD_FUNCTION), errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unsupported function on datanodes."),
+ errdetail("Cannot execute a global function direct on datanodes."),
+ errcause("Execute a global function on datanodes."),
+ erraction("Execute this function on coordinators.")));
PG_RETURN_VOID();
}
- per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
- oldcontext = MemoryContextSwitchTo(per_query_ctx);
- tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
- rsinfo->returnMode = SFRM_Materialize;
- rsinfo->setResult = tupstore;
- rsinfo->setDesc = tupDesc;
- MemoryContextSwitchTo(oldcontext);
+ Datum values[INDEX_STATUS_VIEW_COL_NUM];
+ bool nulls[INDEX_STATUS_VIEW_COL_NUM] = {false};
- switch (type) {
- /* Undospace meta info. */
- case 0:
- if (metaLocation == 0) {
- ReadUndoZoneMetaFromShared(id, &tupDesc, tupstore);
+ char* schname = PG_GETARG_CSTRING(0);
+ char* idxname = PG_GETARG_CSTRING(1);
+
+ if (schname == NULL || strlen(schname) == 0 || idxname == NULL || strlen(idxname) == 0) {
+ ereport(ERROR, (errmodule(MOD_INDEX), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("Invalid input schema name or index name."),
+ errdetail("The input schema or index name is null."),
+ errcause("Input empty or less parameters."),
+ erraction("Please input the correct schema name and index name.")));
+ PG_RETURN_VOID();
+ }
+
+ FuncCallContext *funcctx = NULL;
+ /* get the fist row of the view */
+ if (SRF_IS_FIRSTCALL()) {
+ funcctx = SRF_FIRSTCALL_INIT();
+ MemoryContext oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ funcctx->tuple_desc = get_index_status_view_frist_row();
+ /* for coordinator, get a view of all nodes */
+ funcctx->max_calls = u_sess->pgxc_cxt.NumDataNodes + u_sess->pgxc_cxt.NumCoords;
+ funcctx->user_fctx = get_remote_index_status(funcctx->tuple_desc, schname, idxname);
+ (void)MemoryContextSwitchTo(oldcontext);
+
+ if (funcctx->user_fctx == NULL) {
+ SRF_RETURN_DONE(funcctx);
+ }
+ }
+
+ /* stuff done on every call of the function */
+ funcctx = SRF_PERCALL_SETUP();
+
+ if (funcctx->user_fctx) {
+ Tuplestorestate* tupstore = ((TableDistributionInfo*)funcctx->user_fctx)->state->tupstore;
+ TupleTableSlot* slot = ((TableDistributionInfo*)funcctx->user_fctx)->slot;
+
+ if (!tuplestore_gettupleslot(tupstore, true, false, slot)) {
+ HeapTuple tuple = fetch_local_index_status(funcctx, schname, idxname);
+ if (tuple != NULL) {
+ SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
} else {
- ReadUndoZoneMetaFromDisk(id, &tupDesc, tupstore);
+ /* release context when all tuples are returned */
+ FreeParallelFunctionState(((TableDistributionInfo*)funcctx->user_fctx)->state);
+ ExecDropSingleTupleTableSlot(slot);
+ pfree_ext(funcctx->user_fctx);
+ funcctx->user_fctx = NULL;
+ SRF_RETURN_DONE(funcctx);
}
- break;
- /* TransactionGroup meta info. */
- case 1:
- if (metaLocation == 0) {
- ReadTransSlotMetaFromShared(id, &tupDesc, tupstore);
- } else {
- ReadTransSlotMetaFromDisk(id, &tupDesc, tupstore);
- }
- break;
- case 2:
- if (metaLocation == 0) {
- ReadUndoSpaceFromShared(id, &tupDesc, tupstore, UNDO_LOG_SPACE);
- } else {
- ReadUndoSpaceFromDisk(id, &tupDesc, tupstore, UNDO_LOG_SPACE);
- }
- break;
- case 3:
- if (metaLocation == 0) {
- ReadUndoSpaceFromShared(id, &tupDesc, tupstore, UNDO_SLOT_SPACE);
- } else {
- ReadUndoSpaceFromDisk(id, &tupDesc, tupstore, UNDO_SLOT_SPACE);
- }
- break;
- default:
- break;
- }
-
- PG_RETURN_VOID();
-}
-
-Datum gs_undo_translot(PG_FUNCTION_ARGS)
-{
- int rc = 0;
- int type = PG_GETARG_INT32(0); // Indicates query meta from share memory or persistent file
- int zoneId = PG_GETARG_INT32(1); // zone id
- char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
- ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
- TupleDesc tupDesc;
- Tuplestorestate *tupstore = NULL;
- MemoryContext per_query_ctx;
- MemoryContext oldcontext;
-
- if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
- ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("set-valued function called in context that cannot accept a set")));
- PG_RETURN_VOID();
- }
- if (!(rsinfo->allowedModes & SFRM_Materialize)) {
- ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("materialize mode required, but it is not allowed in this context")));
- PG_RETURN_VOID();
- }
- if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
- elog(ERROR, "return type must be a row type");
- PG_RETURN_VOID();
- }
-
- per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
- oldcontext = MemoryContextSwitchTo(per_query_ctx);
- tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
- rsinfo->returnMode = SFRM_Materialize;
- rsinfo->setResult = tupstore;
- rsinfo->setDesc = tupDesc;
- MemoryContextSwitchTo(oldcontext);
-
- if (type == 0 || type == 1) {
- if (zoneId < 0 || zoneId >= UNDO_ZONE_COUNT) {
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Zone id is invalid %d", zoneId)));
- PG_RETURN_VOID();
}
- }
- UndoZone *uzone = (UndoZone *)g_instance.undo_cxt.uZones[zoneId];
- if (uzone == NULL) {
- PG_RETURN_VOID();
- }
- TransactionSlot *slot = NULL;
- /* Query translot meta info from shared memory. */
- UndoSlotBuffer buf;
- for (UndoSlotPtr slotPtr = uzone->GetRecycle(); slotPtr < uzone->GetAllocate();
- slotPtr = GetNextSlotPtr(slotPtr)) {
- buf.PrepareTransactionSlot(slotPtr);
- slot = buf.FetchTransactionSlot(slotPtr);
- bool nulls[PG_STAT_TRANSLOT_META_COLS] = {false};
- Datum values[PG_STAT_TRANSLOT_META_COLS];
+ for (uint32 i = 0; i < INDEX_STATUS_VIEW_COL_NUM; i++) {
+ values[i] = tableam_tslot_getattr(slot, (i + 1), &nulls[i]);
+ }
- rc = memset_s(textBuffer, STAT_UNDO_LOG_SIZE, 0, STAT_UNDO_LOG_SIZE);
- securec_check(rc, "\0", "\0");
- values[0] = ObjectIdGetDatum((Oid)zoneId);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, "%016lu",
- (uint64)slot->XactId());
- securec_check_ss(rc, "\0", "\0");
- values[1] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
- UNDO_PTR_GET_OFFSET(slot->StartUndoPtr()));
- securec_check_ss(rc, "\0", "\0");
- values[2] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
- UNDO_PTR_GET_OFFSET(slot->EndUndoPtr()));
- securec_check_ss(rc, "\0", "\0");
- values[3] = CStringGetTextDatum(textBuffer);
- rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
- UNDO_PTR_GET_OFFSET(slotPtr));
- securec_check_ss(rc, "\0", "\0");
- values[4] = CStringGetTextDatum(textBuffer);
- tuplestore_putvalues(tupstore, tupDesc, values, nulls);
+ HeapTuple tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+ (void)ExecClearTuple(slot);
+ SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
}
- buf.Release();
- tuplestore_donestoring(tupstore);
- PG_RETURN_VOID();
+ SRF_RETURN_DONE(funcctx);
}
+
+#endif
diff --git a/src/common/backend/utils/adt/pgundostatfuncs.cpp b/src/common/backend/utils/adt/pgundostatfuncs.cpp
new file mode 100644
index 000000000..c3b2ce386
--- /dev/null
+++ b/src/common/backend/utils/adt/pgundostatfuncs.cpp
@@ -0,0 +1,1597 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstatfuncs.c
+ * Functions for accessing the statistics collector data
+ *
+ * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/pgundostatfuncs.cpp
+ *
+ * -------------------------------------------------------------------------
+ */
+#include "postgres.h"
+#include "knl/knl_variable.h"
+#include
+
+#include "access/transam.h"
+#include "access/tableam.h"
+#include "access/ustore/undo/knl_uundoapi.h"
+#include "access/ustore/undo/knl_uundotxn.h"
+#include "access/ustore/undo/knl_uundozone.h"
+#include "access/ubtree.h"
+#include "access/redo_statistic.h"
+#include "access/xlog.h"
+#include "connector.h"
+#include "commands/user.h"
+#include "commands/vacuum.h"
+#include "funcapi.h"
+#include "gaussdb_version.h"
+#include "libpq/ip.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/globalplancache.h"
+#include "utils/inet.h"
+#include "utils/timestamp.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/memprot.h"
+#include "utils/typcache.h"
+#include "utils/syscache.h"
+#include "pgxc/pgxc.h"
+#include "pgxc/nodemgr.h"
+#include "storage/lock/lwlock.h"
+#include "postgres.h"
+#include "knl/knl_variable.h"
+#include "storage/smgr/segment.h"
+#include "storage/proc.h"
+#include "storage/procarray.h"
+#include "storage/buf/buf_internals.h"
+#include "workload/cpwlm.h"
+#include "workload/workload.h"
+#include "pgxc/pgxcnode.h"
+#include "access/hash.h"
+#include "libcomm/libcomm.h"
+#include "pgxc/poolmgr.h"
+#include "pgxc/execRemote.h"
+#include "utils/elog.h"
+#include "utils/memtrace.h"
+#include "commands/user.h"
+#include "instruments/gs_stat.h"
+#include "instruments/list.h"
+#include "replication/rto_statistic.h"
+#include "storage/lock/lock.h"
+
+const int STAT_USTORE_BUFF_SIZE = 10240;
+const int STAT_UNDO_COLS = 10;
+const int STAT_UNDO_BUFFER_SIZE = 500;
+const uint TOP_USED_ZONE_NUM = 3;
+const float FORCE_RECYCLE_PERCENT = 0.8;
+const int UNDO_SLOT_FILE_MAXSIZE = 1024 * 32;
+const int MBYTES_TO_KBYTES = 1024;
+const int UNDO_TOPUSED = 0;
+const int UNDO_SECONDUSED = 1;
+const int UNDO_THIRDUSED = 2;
+const int PG_STAT_USP_PERSIST_META_COLS = 9;
+const int STAT_UNDO_LOG_SIZE = 17;
+const int PG_STAT_UBTREE_IDX_VERFIY_COLS = 4;
+const int PG_STAT_UBTREE_RECYCLE_QUEUE_COLS = 6;
+const int PG_STAT_TRANSLOT_META_COLS = 7;
+const int COMMITED_STATUS = 0;
+const int INPROCESS_STATUS = 1;
+const int ABORTING_STATUS = 2;
+const int ABORTED_STATUS = 3;
+
+const int TYPE_UNDO_ZONE = 0;
+const int TYPE_GROUP = 1;
+const int TYPE_UNDO_SPACE = 2;
+const int TYPE_SLOT_SPACE = 3;
+
+/* ustore stat */
+extern Datum gs_stat_ustore(PG_FUNCTION_ARGS);
+
+typedef struct UndoHeader {
+ UndoRecordHeader whdr_;
+ UndoRecordBlock wblk_;
+ UndoRecordTransaction wtxn_;
+ UndoRecordPayload wpay_;
+ UndoRecordOldTd wtd_;
+ UndoRecordPartition wpart_;
+ UndoRecordTablespace wtspc_;
+} UndoHeader;
+
+void Checkfd(int fd)
+{
+ if (fd < 0) {
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), errmsg("could not open file \%s", UNDO_META_FILE)));
+ return;
+ }
+}
+
+Datum gs_stat_ustore(PG_FUNCTION_ARGS)
+{
+ char result[STAT_USTORE_BUFF_SIZE] = {0};
+#ifdef DEBUG_UHEAP
+ errno_t ret;
+ LWLockAcquire(UHeapStatLock, LW_SHARED);
+
+ ret = snprintf_s(result, sizeof(result), sizeof(result) - 1, "Prune Page \n");
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tPrune Page (SUCCESS) = %lu \n",
+ UHeapStat_shared->prune_page[PRUNE_PAGE_SUCCESS]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tPrune Page (NO_SPACE) = %lu \n",
+ UHeapStat_shared->prune_page[PRUNE_PAGE_NO_SPACE]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tPrune Page (UPDATE_IN_PROGRESS)= %lu \n=========================\n\n",
+ UHeapStat_shared->prune_page[PRUNE_PAGE_UPDATE_IN_PROGRESS]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tPrune Page (PRUNE_PAGE_IN_RECOVERY)= %lu \n=========================\n\n",
+ UHeapStat_shared->prune_page[PRUNE_PAGE_IN_RECOVERY]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tPrune Page (PRUNE_PAGE_INVALID)= %lu \n=========================\n\n",
+ UHeapStat_shared->prune_page[PRUNE_PAGE_INVALID]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tPrune Page (PRUNE_PAGE_XID_FILTER)= %lu \n=========================\n\n",
+ UHeapStat_shared->prune_page[PRUNE_PAGE_XID_FILTER]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tPrune Page (PRUNE_PAGE_FILLFACTOR)= %lu \n=========================\n\n",
+ UHeapStat_shared->prune_page[PRUNE_PAGE_FILLFACTOR]);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "Prune Page OPs profile \n");
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\t Prune Page SUC: %u %u %u \n",
+ UHeapStat_shared->op_count_suc.ins, UHeapStat_shared->op_count_suc.del, UHeapStat_shared->op_count_suc.upd);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\t Prune Page TOT: %u %u %u \n",
+ UHeapStat_shared->op_count_tot.ins, UHeapStat_shared->op_count_tot.del, UHeapStat_shared->op_count_tot.upd);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "Prune Page OPs freespace profile \n");
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\t Prune Page FreeSpace TOT: %u %u %u \n", UHeapStat_shared->op_space_tot.ins,
+ UHeapStat_shared->op_space_tot.del, UHeapStat_shared->op_space_tot.upd);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "PageReserveTransactionSlot (where to get transaction slot) \n");
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tSlot has been reserved by current xid: %lu \n",
+ UHeapStat_shared->get_transslot_from[TRANSSLOT_RESERVED_BY_CURRENT_XID]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tGot free slot after invalidating slots: %lu \n",
+ UHeapStat_shared->get_transslot_from[TRANSSLOT_FREE_AFTER_INVALIDATION]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tGot free slot after freezing slots: %lu \n",
+ UHeapStat_shared->get_transslot_from[TRANSSLOT_FREE_AFTER_FREEZING]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tCannot get a free transaction slot: %lu \n=========================\n\n",
+ UHeapStat_shared->get_transslot_from[TRANSSLOT_CANNOT_GET]);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "Inplace Update Stats \n");
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tINPLACE UPDATE: %lu \n",
+ UHeapStat_shared->update[INPLACE_UPDATE]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tNON INPLACE UPDATE: %lu \n",
+ UHeapStat_shared->update[NON_INPLACE_UPDATE]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tTotal: %lu \n=========================\n\n",
+ UHeapStat_shared->update[NON_INPLACE_UPDATE] + UHeapStat_shared->update[INPLACE_UPDATE]);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "Non Inplace Update Reasons \n");
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tIndex Updated: %lu \n",
+ UHeapStat_shared->noninplace_update_cause[INDEX_UPDATED]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tToast: %lu \n",
+ UHeapStat_shared->noninplace_update_cause[TOAST]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tPrune Page Failed: %lu \n",
+ UHeapStat_shared->noninplace_update_cause[PAGE_PRUNE_FAILED]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tSlot reused: %lu \n",
+ UHeapStat_shared->noninplace_update_cause[SLOT_REUSED]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tnblocks < NBLOCKS: %lu \n=========================\n\n",
+ UHeapStat_shared->noninplace_update_cause[nblocks_LESS_THAN_NBLOCKS]);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "Slot status in UHeapTupleFetch \n");
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tFROZEN_SLOT = %lu \n",
+ UHeapStat_shared->visibility_check_with_xid[VISIBILITY_CHECK_SUCCESS_FROZEN_SLOT]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tXID < Oldest XID in UNDO = %lu \n",
+ UHeapStat_shared->visibility_check_with_xid[VISIBILITY_CHECK_SUCCESS_OLDEST_XID]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tSlot is invalid and Xid is Visible in Snapshot = %lu \n",
+ UHeapStat_shared->visibility_check_with_xid[VISIBILITY_CHECK_SUCCESS_INVALID_SLOT]);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tFetch Trans Info From UNDO = %lu\n=========================\n\n",
+ UHeapStat_shared->visibility_check_with_xid[VISIBILITY_CHECK_SUCCESS_UNDO]);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "Undo Chain Traversal Stat \n");
+ securec_check_ss(ret, "\0", "\0");
+
+ double tuple_old_version_visit_rate = 0.0;
+ if (UHeapStat_shared->tuple_visits > 0) {
+ tuple_old_version_visit_rate =
+ 1.0 * UHeapStat_shared->tuple_old_version_visits / UHeapStat_shared->tuple_visits;
+ }
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "Tuple visits: %lu\tOld version visits: %lu\tOld version visit rate: %.6f \n",
+ UHeapStat_shared->tuple_visits, UHeapStat_shared->tuple_old_version_visits, tuple_old_version_visit_rate);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "Undo Chain Traversal Length \n");
+ securec_check_ss(ret, "\0", "\0");
+
+ double chain_visited_avg_len = 0.0;
+ if (UHeapStat_shared->undo_chain_visited_count > 0) {
+ chain_visited_avg_len =
+ UHeapStat_shared->undo_chain_visited_sum_len * 1.0 / UHeapStat_shared->undo_chain_visited_count;
+ }
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\t# Of undo_chain_visited_sum_len = %ld | visited_count = %ld | miss_count = %ld | visited_avg_len = %lf | "
+ "visited_max_len = %ld | visited_min_len = %ld \n",
+ UHeapStat_shared->undo_chain_visited_sum_len, UHeapStat_shared->undo_chain_visited_count,
+ UHeapStat_shared->undo_chain_visited_miss_count, chain_visited_avg_len,
+ UHeapStat_shared->undo_chain_visited_max_len, UHeapStat_shared->undo_chain_visited_min_len);
+ securec_check_ss(ret, "\0", "\0");
+
+ double page_visited_avg_len = 0.0;
+ if (UHeapStat_shared->undo_chain_visited_count > 0) {
+ page_visited_avg_len =
+ UHeapStat_shared->undo_page_visited_sum_len * 1.0 / UHeapStat_shared->undo_chain_visited_count;
+ }
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\t# Of undo_page_visited_sum_len = %ld | visited_count = %ld | page_visited_avg_len = %lf \n",
+ UHeapStat_shared->undo_page_visited_sum_len, UHeapStat_shared->undo_chain_visited_count, page_visited_avg_len);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "prepare undo record rzero count %lu nzero_count %lu \n", UHeapStat_shared->undo_record_prepare_rzero_count,
+ UHeapStat_shared->undo_record_prepare_nzero_count);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "groups allocated %lu released %lu \n",
+ UHeapStat_shared->undo_groups_allocate, UHeapStat_shared->undo_groups_release);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "slots allocated %lu released %lu \n",
+ UHeapStat_shared->undo_slots_allocate, UHeapStat_shared->undo_slots_recycle);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "space recycle %lu unrecycle %lu \n",
+ UHeapStat_shared->undo_space_recycle, UHeapStat_shared->undo_space_unrecycle);
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "oldest xid delay %lu \n",
+ UHeapStat_shared->oldest_xid_having_undo_delay);
+ securec_check_ss(ret, "\0", "\0");
+
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "Undo lock information: \n");
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tDiscard lock hold time(us): total %lu\tmin %lu\tmax %lu\tcnt %lu \tavg %.6f \n",
+ UHeapStat_shared->undo_discard_lock_hold_time_sum, UHeapStat_shared->undo_discard_lock_hold_time_min,
+ UHeapStat_shared->undo_discard_lock_hold_time_max, UHeapStat_shared->undo_discard_lock_hold_cnt,
+ 1.0 * UHeapStat_shared->undo_discard_lock_hold_time_sum / Max(1, UHeapStat_shared->undo_discard_lock_hold_cnt));
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tDiscard lock wait time(us): total %lu\tmin %lu\tmax %lu\tcnt %lu\tavg %.6f \n",
+ UHeapStat_shared->undo_discard_lock_wait_time_sum, UHeapStat_shared->undo_discard_lock_wait_time_min,
+ UHeapStat_shared->undo_discard_lock_wait_time_max, UHeapStat_shared->undo_discard_lock_wait_cnt,
+ 1.0 * UHeapStat_shared->undo_discard_lock_wait_time_sum / Max(1, UHeapStat_shared->undo_discard_lock_wait_cnt));
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tSpace lock hold time(us): total %lu\tmin %lu\tmax %lu\tcnt %lu\tavg %.6f \n",
+ UHeapStat_shared->undo_space_lock_hold_time_sum, UHeapStat_shared->undo_space_lock_hold_time_min,
+ UHeapStat_shared->undo_space_lock_hold_time_max, UHeapStat_shared->undo_space_lock_hold_cnt,
+ 1.0 * UHeapStat_shared->undo_space_lock_hold_time_sum / Max(1, UHeapStat_shared->undo_space_lock_hold_cnt));
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "\tSpace lock wait time(us): total %lu\tmin %lu\tmax %lu\tcnt %lu\tavg %.6f \n",
+ UHeapStat_shared->undo_space_lock_wait_time_sum, UHeapStat_shared->undo_space_lock_wait_time_min,
+ UHeapStat_shared->undo_space_lock_wait_time_max, UHeapStat_shared->undo_space_lock_wait_cnt,
+ 1.0 * UHeapStat_shared->undo_space_lock_wait_time_sum / Max(1, UHeapStat_shared->undo_space_lock_wait_cnt));
+ securec_check_ss(ret, "\0", "\0");
+ ret = snprintf_s(result + strlen(result), sizeof(result) - strlen(result), sizeof(result) - strlen(result) -1,
+ "INSERT: %lu\tRetry: %lu\tRetry Time: %lu\tRetry Max: %lu\tRetry Time MAX: %lu \n", UHeapStat_shared->dml,
+ UHeapStat_shared->retry, UHeapStat_shared->retry_time, UHeapStat_shared->retry_max,
+ UHeapStat_shared->retry_time_max);
+ securec_check_ss(ret, "\0", "\0");
+
+ result[strlen(result)] = '\0';
+
+ LWLockRelease(UHeapStatLock);
+
+#endif
+ PG_RETURN_TEXT_P(cstring_to_text(result));
+}
+
+using namespace undo;
+
+bool ReadUndoBytes(char *destptr, int destlen, char **readeptr, char *endptr, int *myBytesRead, int *alreadyRead)
+{
+ if (*myBytesRead >= destlen) {
+ *myBytesRead -= destlen;
+ return true;
+ }
+ int remaining = destlen - *myBytesRead;
+ int maxReadOnCurrPage = endptr - *readeptr;
+ int canRead = Min(remaining, maxReadOnCurrPage);
+ if (canRead == 0) {
+ return false;
+ }
+ errno_t rc = memcpy_s(destptr + *myBytesRead, remaining, *readeptr, canRead);
+ securec_check(rc, "\0", "\0");
+ *readeptr += canRead;
+ *alreadyRead += canRead;
+ *myBytesRead = 0;
+ return (canRead == remaining);
+}
+bool ReadUndoRecord(UndoHeader *urec, char *buffer, int startingByte, int *alreadyRead)
+{
+ char *readptr = buffer + startingByte;
+ char *endptr = buffer + BLCKSZ;
+ int myBytesRead = *alreadyRead;
+ if (!ReadUndoBytes((char *)&(urec->whdr_), SIZE_OF_UNDO_RECORD_HEADER, &readptr, endptr, &myBytesRead,
+ alreadyRead)) {
+ return false;
+ }
+ if (!ReadUndoBytes((char *)&(urec->wblk_), SIZE_OF_UNDO_RECORD_BLOCK, &readptr, endptr, &myBytesRead,
+ alreadyRead)) {
+ return false;
+ }
+ if ((urec->whdr_.uinfo & UNDO_UREC_INFO_TRANSAC) != 0) {
+ if (!ReadUndoBytes((char *)&urec->wtxn_, SIZE_OF_UNDO_RECORD_TRANSACTION, &readptr, endptr, &myBytesRead,
+ alreadyRead)) {
+ return false;
+ }
+ }
+ if ((urec->whdr_.uinfo & UNDO_UREC_INFO_OLDTD) != 0) {
+ if (!ReadUndoBytes((char *)&urec->wtd_, SIZE_OF_UNDO_RECORD_OLDTD, &readptr, endptr, &myBytesRead,
+ alreadyRead)) {
+ return false;
+ }
+ }
+ if ((urec->whdr_.uinfo & UNDO_UREC_INFO_HAS_PARTOID) != 0) {
+ if (!ReadUndoBytes((char *)&urec->wpart_, SIZE_OF_UNDO_RECORD_PARTITION, &readptr, endptr, &myBytesRead,
+ alreadyRead)) {
+ return false;
+ }
+ }
+ if ((urec->whdr_.uinfo & UNDO_UREC_INFO_HAS_TABLESPACEOID) != 0) {
+ if (!ReadUndoBytes((char *)&urec->wtspc_, SIZE_OF_UNDO_RECORD_TABLESPACE, &readptr, endptr, &myBytesRead,
+ alreadyRead)) {
+ return false;
+ }
+ }
+ if ((urec->whdr_.uinfo & UNDO_UREC_INFO_PAYLOAD) != 0) {
+ if (!ReadUndoBytes((char *)&urec->wpay_, SIZE_OF_UNDO_RECORD_PAYLOAD, &readptr, endptr, &myBytesRead,
+ alreadyRead)) {
+ return false;
+ }
+ }
+ return true;
+}
+static int OpenUndoBlock(int zoneId, BlockNumber blockno)
+{
+ char fileName[100] = {0};
+ errno_t rc = EOK;
+ int segno = blockno / UNDOSEG_SIZE;
+ rc = snprintf_s(fileName, sizeof(fileName), sizeof(fileName), "undo/permanent/%05X.%07zX", zoneId, segno);
+ securec_check_ss(rc, "\0", "\0");
+ int fd = open(fileName, O_RDONLY | PG_BINARY, S_IRUSR | S_IWUSR);
+ Checkfd(fd);
+
+ return fd;
+}
+static bool ParseUndoRecord(UndoRecPtr urp, Tuplestorestate *tupstore, TupleDesc tupDesc)
+{
+ char buffer[BLCKSZ] = {'\0'};
+ BlockNumber blockno = UNDO_PTR_GET_BLOCK_NUM(urp);
+ int zoneId = UNDO_PTR_GET_ZONE_ID(urp);
+ int startingByte = ((urp) & ((UINT64CONST(1) << 44) - 1)) % BLCKSZ;
+ int fd = -1;
+ int alreadyRead = 0;
+ off_t seekpos;
+ errno_t rc = EOK;
+ uint32 ret = 0;
+ UndoHeader *urec = (UndoHeader *)malloc(sizeof(UndoHeader));
+ UndoRecPtr blkprev = INVALID_UNDO_REC_PTR;
+ rc = memset_s(urec, sizeof(UndoHeader), (0), sizeof(UndoHeader));
+ securec_check(rc, "\0", "\0");
+ do {
+ fd = OpenUndoBlock(zoneId, blockno);
+ if (fd < 0) {
+ free(urec);
+ return false;
+ }
+ seekpos = (off_t)BLCKSZ * (blockno % ((BlockNumber)UNDOSEG_SIZE));
+ lseek(fd, seekpos, SEEK_SET);
+ rc = memset_s(buffer, BLCKSZ, 0, BLCKSZ);
+ securec_check(rc, "\0", "\0");
+ ret = read(fd, (char *)buffer, BLCKSZ);
+ if (ret != BLCKSZ) {
+ close(fd);
+ free(urec);
+ fprintf(stderr, "Read undo meta page failed, expect size(8192), real size(%u).\n", ret);
+ return false;
+ }
+ if (ReadUndoRecord(urec, buffer, startingByte, &alreadyRead)) {
+ break;
+ }
+ startingByte = UNDO_LOG_BLOCK_HEADER_SIZE;
+ blockno++;
+ } while (true);
+ blkprev = urec->wblk_.blkprev;
+ char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
+ bool nulls[11] = {false};
+ Datum values[11];
+
+ rc = memset_s(textBuffer, STAT_UNDO_LOG_SIZE, 0, STAT_UNDO_LOG_SIZE);
+ securec_check(rc, "\0", "\0");
+ values[ARR_0] = ObjectIdGetDatum(urp);
+ values[ARR_1] = ObjectIdGetDatum(urec->whdr_.xid);
+
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, urec->whdr_.cid);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_2] = CStringGetTextDatum(textBuffer);
+
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, urec->whdr_.reloid);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_3] = CStringGetTextDatum(textBuffer);
+
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ urec->whdr_.relfilenode);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_4] = CStringGetTextDatum(textBuffer);
+
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, urec->whdr_.uinfo);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_5] = CStringGetTextDatum(textBuffer);
+
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, urec->wblk_.blkprev);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_6] = CStringGetTextDatum(textBuffer);
+
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, urec->wblk_.blkno);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_7] = CStringGetTextDatum(textBuffer);
+
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, urec->wblk_.offset);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_8] = CStringGetTextDatum(textBuffer);
+
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, urec->wtxn_.prevurp);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_9] = CStringGetTextDatum(textBuffer);
+
+ rc =
+ snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, urec->wpay_.payloadlen);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_10] = CStringGetTextDatum(textBuffer);
+
+ tuplestore_putvalues(tupstore, tupDesc, values, nulls);
+ free(urec);
+ close(fd);
+ if (blkprev != INVALID_UNDO_REC_PTR) {
+ ParseUndoRecord(blkprev, tupstore, tupDesc);
+ }
+ return true;
+}
+
+void moveMaxUsedSpaceItem (uint startIdx, uint32 *maxUsedSpace,
+ uint32 *maxUsedSpaceZoneId, const uint size)
+{
+ for (uint usedSpaceIdx = (size - 1); usedSpaceIdx > startIdx; usedSpaceIdx--) {
+ maxUsedSpace[usedSpaceIdx] = maxUsedSpace[usedSpaceIdx-1];
+ maxUsedSpaceZoneId[usedSpaceIdx] = maxUsedSpaceZoneId[usedSpaceIdx-1];
+ }
+}
+
+void UpdateMaxUsedSapceStat(uint32 usedSpace, uint32 idx, uint32 *maxUsedSpace,
+ uint32 *maxUsedSpaceZoneId, const uint size)
+{
+ for (uint usedSpaceIdx = 0; usedSpaceIdx < size; usedSpaceIdx++) {
+ if (usedSpace > maxUsedSpace[usedSpaceIdx]) {
+ if (maxUsedSpaceZoneId[usedSpaceIdx] != idx) {
+ moveMaxUsedSpaceItem(usedSpaceIdx, maxUsedSpace, maxUsedSpaceZoneId, size);
+ }
+ maxUsedSpace[usedSpaceIdx] = usedSpace;
+ maxUsedSpaceZoneId[usedSpaceIdx] = idx;
+ break;
+ }
+ }
+}
+Datum gs_stat_undo(PG_FUNCTION_ARGS)
+{
+#ifdef ENABLE_MULTIPLE_NODES
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unsupported view in multiple nodes mode.")));
+ PG_RETURN_VOID();
+#else
+ uint32 undoTotalSize = g_instance.undo_cxt.undoTotalSize;
+ uint32 limitSize = (uint32)(u_sess->attr.attr_storage.undo_space_limit_size * FORCE_RECYCLE_PERCENT);
+ uint32 createdUndoFiles = 0;
+ uint32 discardedUndoFiles = 0;
+ uint32 zoneUsedCount = 0;
+ uint32 maxUsedSpace[TOP_USED_ZONE_NUM] = {0};
+ uint32 maxUsedSpaceZoneId[TOP_USED_ZONE_NUM] = {0};
+
+ int rc = 0;
+ char textBuffer[STAT_UNDO_BUFFER_SIZE] = {'\0'};
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
+ TupleDesc tupDesc;
+ Tuplestorestate *tupstore = NULL;
+ MemoryContext per_query_ctx;
+ MemoryContext oldcontext;
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ PG_RETURN_VOID();
+ }
+ if (!(rsinfo->allowedModes & SFRM_Materialize)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+ PG_RETURN_VOID();
+ }
+ if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
+ elog(ERROR, "return type must be a row type");
+ PG_RETURN_VOID();
+ }
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ oldcontext = MemoryContextSwitchTo(per_query_ctx);
+ tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = tupDesc;
+ MemoryContextSwitchTo(oldcontext);
+ for (uint64 idx = 0; idx <= UNDO_ZONE_COUNT - 1; idx++) {
+ if (g_instance.undo_cxt.uZones == NULL) {
+ break;
+ }
+ UndoZone *uzone = (undo::UndoZone *)g_instance.undo_cxt.uZones[idx];
+ if (uzone == NULL) {
+ continue;
+ }
+ uint32 usedSpace = uzone->UndoSize() * (BLCKSZ / MBYTES_TO_KBYTES) / MBYTES_TO_KBYTES;
+ if (usedSpace != 0) {
+ UpdateMaxUsedSapceStat(usedSpace, idx, maxUsedSpace, maxUsedSpaceZoneId, TOP_USED_ZONE_NUM);
+ }
+ zoneUsedCount += 1;
+ UndoSpace *undoSpace = uzone->GetUndoSpace();
+ UndoSpace *slotSpace = uzone->GetSlotSpace();
+ createdUndoFiles += (undoSpace->Tail() / UNDO_FILE_MAXSIZE + slotSpace->Tail() / UNDO_SLOT_FILE_MAXSIZE);
+ discardedUndoFiles += (undoSpace->Head() / UNDO_FILE_MAXSIZE + slotSpace->Head() / UNDO_SLOT_FILE_MAXSIZE);
+ }
+ bool nulls[STAT_UNDO_COLS] = {false};
+ Datum values[STAT_UNDO_COLS];
+ rc = memset_s(textBuffer, STAT_UNDO_BUFFER_SIZE, 0, STAT_UNDO_BUFFER_SIZE);
+ securec_check(rc, "\0", "\0");
+
+ values[ARR_0] = UInt32GetDatum((uint32)zoneUsedCount);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, "%u : %u, %u : %u, %u : %u",
+ maxUsedSpaceZoneId[UNDO_TOPUSED], maxUsedSpace[UNDO_TOPUSED], maxUsedSpaceZoneId[UNDO_SECONDUSED],
+ maxUsedSpace[UNDO_SECONDUSED], maxUsedSpaceZoneId[UNDO_THIRDUSED], maxUsedSpace[UNDO_THIRDUSED]);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_1] = CStringGetTextDatum(textBuffer);
+ values[ARR_2] = UInt32GetDatum((uint32)(undoTotalSize * (BLCKSZ / MBYTES_TO_KBYTES) / MBYTES_TO_KBYTES));
+ values[ARR_3] = UInt32GetDatum((uint32)(limitSize * (BLCKSZ / MBYTES_TO_KBYTES) / MBYTES_TO_KBYTES));
+ values[ARR_4] = UInt64GetDatum((uint64)g_instance.undo_cxt.oldestXidInUndo);
+ values[ARR_5] = UInt64GetDatum((uint64)GetGlobalOldestXmin());
+ values[ARR_6] = Int64GetDatum((int64)g_instance.undo_cxt.undoChainTotalSize);
+ values[ARR_7] = Int64GetDatum((int64)g_instance.undo_cxt.maxChainSize);
+ values[ARR_8] = UInt32GetDatum((uint32)createdUndoFiles);
+ values[ARR_9] = UInt32GetDatum((uint32)discardedUndoFiles);
+
+ tuplestore_putvalues(tupstore, tupDesc, values, nulls);
+ tuplestore_donestoring(tupstore);
+ PG_RETURN_VOID();
+#endif
+}
+
+#ifndef ENABLE_MULTIPLE_NODES
+static uint64 UndoSize(UndoSpaceType type)
+{
+ uint64 used = 0;
+ for (auto idx = 0; idx < UNDO_ZONE_COUNT; idx++) {
+ undo::UndoZone *uzone = (undo::UndoZone *)g_instance.undo_cxt.uZones[idx];
+ if (uzone == NULL) {
+ continue;
+ }
+ if (type == UNDO_LOG_SPACE) {
+ used += uzone->UndoSize();
+ } else {
+ used += uzone->SlotSize();
+ }
+ }
+ return used;
+}
+
+static void PutTranslotInfoToTuple(int zoneId, uint32 offset, TransactionSlot *slot, Tuplestorestate *tupstore,
+ TupleDesc tupDesc)
+{
+ if (slot->XactId() != InvalidTransactionId || slot->StartUndoPtr() != INVALID_UNDO_REC_PTR) {
+ char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
+ bool nulls[PG_STAT_TRANSLOT_META_COLS] = {false};
+ Datum values[PG_STAT_TRANSLOT_META_COLS];
+ int rc = 0;
+
+ rc = memset_s(textBuffer, STAT_UNDO_LOG_SIZE, 0, STAT_UNDO_LOG_SIZE);
+ securec_check(rc, "\0", "\0");
+ values[ARR_0] = ObjectIdGetDatum((Oid)zoneId);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, "%016lu", (uint64)slot->XactId());
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_1] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(slot->StartUndoPtr()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_2] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(slot->EndUndoPtr()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_3] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, offset);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_4] = CStringGetTextDatum(textBuffer);
+ if (TransactionIdDidCommit((uint64)slot->XactId())) {
+ values[ARR_5] = COMMITED_STATUS;
+ } else if (TransactionIdIsInProgress((uint64)slot->XactId())) {
+ values[ARR_5] = INPROCESS_STATUS;
+ } else if (slot->NeedRollback()) {
+ values[ARR_5] = ABORTING_STATUS;
+ } else {
+ values[ARR_5] = ABORTED_STATUS;
+ }
+ tuplestore_putvalues(tupstore, tupDesc, values, nulls);
+ }
+}
+
+static void GetTranslotFromOneSegFile(int fd, int zoneId, Tuplestorestate *tupstore, TupleDesc tupDesc)
+{
+ TransactionSlot *slot = NULL;
+ errno_t rc = EOK;
+ off_t seekpos;
+ uint32 ret = 0;
+ char buffer[BLCKSZ] = {'\0'};
+
+ for (uint32 loop = 0; loop < UNDO_META_SEG_SIZE; loop++) {
+ seekpos = (off_t)BLCKSZ * loop;
+ lseek(fd, seekpos, SEEK_SET);
+ rc = memset_s(buffer, BLCKSZ, 0, BLCKSZ);
+ securec_check(rc, "\0", "\0");
+
+ ret = read(fd, (char *)buffer, BLCKSZ);
+ if (ret != BLCKSZ) {
+ close(fd);
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), errmsg("can't read a block")));
+ }
+
+ for (uint32 offset = UNDO_LOG_BLOCK_HEADER_SIZE; offset < BLCKSZ - MAXALIGN(sizeof(TransactionSlot));
+ offset += MAXALIGN(sizeof(TransactionSlot))) {
+ slot = (TransactionSlot *)(buffer + offset);
+ PutTranslotInfoToTuple(zoneId, offset, slot, tupstore, tupDesc);
+ }
+ }
+}
+
+static void GetTranslotFromSegFiles(int zoneId, int segnobegin, int segnoend, Tuplestorestate *tupstore,
+ TupleDesc tupDesc)
+{
+ for (int segcurrent = segnobegin; segcurrent <= segnoend; segcurrent++) {
+ errno_t rc = EOK;
+ char fileName[100] = {0};
+ rc = snprintf_s(fileName, sizeof(fileName), sizeof(fileName) - 1, "undo/permanent/%05X.meta.%07zX", zoneId,
+ segcurrent);
+ securec_check_ss(rc, "\0", "\0");
+ int fd = open(fileName, O_RDONLY | PG_BINARY, S_IRUSR | S_IWUSR);
+ Checkfd(fd);
+ GetTranslotFromOneSegFile(fd, zoneId, tupstore, tupDesc);
+ close(fd);
+ }
+}
+
+static void ReadTranslotFromDisk(int startIdx, int endIdx, Tuplestorestate *tupstore, TupleDesc tupDesc)
+{
+ int fd = BasicOpenFile(UNDO_META_FILE, O_RDWR | PG_BINARY, S_IRUSR | S_IWUSR);
+ for (auto idx = startIdx; idx <= endIdx; idx++) {
+ uint32 undoSpaceBegin = 0;
+ uint32 undoZoneMetaPageCnt = 0;
+ uint32 undoSpaceMetaPageCnt = 0;
+ UNDOZONE_META_PAGE_COUNT(PERSIST_ZONE_COUNT, UNDOZONE_COUNT_PER_PAGE, undoZoneMetaPageCnt);
+ UNDOZONE_META_PAGE_COUNT(PERSIST_ZONE_COUNT, UNDOSPACE_COUNT_PER_PAGE, undoSpaceMetaPageCnt);
+ undoSpaceBegin = (undoZoneMetaPageCnt + undoSpaceMetaPageCnt) * UNDO_META_PAGE_SIZE;
+ uint32 readPos = 0;
+ UndoSpaceMetaInfo undoSpaceMeta;
+
+ readPos = undoSpaceBegin + (idx / UNDOSPACE_COUNT_PER_PAGE) * UNDO_META_PAGE_SIZE +
+ (idx % UNDOSPACE_COUNT_PER_PAGE) * sizeof(UndoSpaceMetaInfo);
+ lseek(fd, readPos, SEEK_SET);
+ int ret = read(fd, &undoSpaceMeta, sizeof(UndoSpaceMetaInfo));
+ if (ret != sizeof(UndoSpaceMetaInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION),
+ errmsg("Read undo meta file fail, expect size(%lu), real size(%u)", sizeof(UndoSpaceMetaInfo), ret)));
+ break;
+ }
+
+ int segnobegin = undoSpaceMeta.head / UNDO_SLOT_FILE_MAXSIZE;
+ int segnoend = undoSpaceMeta.tail / UNDO_SLOT_FILE_MAXSIZE - 1;
+
+ GetTranslotFromSegFiles(idx, segnobegin, segnoend, tupstore, tupDesc);
+ }
+ close(fd);
+}
+
+static void ReadTranslotFromMemory(int startIdx, int endIdx, Tuplestorestate *tupstore, TupleDesc tupDesc)
+{
+ char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
+ for (auto idx = startIdx; idx <= endIdx; idx++) {
+ UndoZone *uzone = (UndoZone *)g_instance.undo_cxt.uZones[idx];
+ if (uzone == NULL) {
+ continue;
+ }
+ for (UndoSlotPtr slotPtr = uzone->GetRecycle(); slotPtr < uzone->GetAllocate();
+ slotPtr = GetNextSlotPtr(slotPtr)) {
+ /* Query translot meta info from shared memory. */
+ UndoSlotBuffer buf;
+ buf.PrepareTransactionSlot(slotPtr);
+ TransactionSlot *slot = NULL;
+ slot = buf.FetchTransactionSlot(slotPtr);
+ bool nulls[PG_STAT_TRANSLOT_META_COLS] = {false};
+ Datum values[PG_STAT_TRANSLOT_META_COLS];
+ errno_t rc;
+
+ rc = memset_s(textBuffer, STAT_UNDO_LOG_SIZE, 0, STAT_UNDO_LOG_SIZE);
+ securec_check(rc, "\0", "\0");
+ values[ARR_0] = ObjectIdGetDatum((Oid)idx);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, "%016lu", (uint64)slot->XactId());
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_1] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(slot->StartUndoPtr()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_2] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(slot->EndUndoPtr()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_3] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(slotPtr));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_4] = CStringGetTextDatum(textBuffer);
+ if (TransactionIdDidCommit((uint64)slot->XactId())) {
+ values[ARR_5] = COMMITED_STATUS;
+ } else if (TransactionIdIsInProgress((uint64)slot->XactId())) {
+ values[ARR_5] = INPROCESS_STATUS;
+ } else if (slot->NeedRollback()) {
+ values[ARR_5] = ABORTING_STATUS;
+ } else {
+ values[ARR_5] = ABORTED_STATUS;
+ }
+ tuplestore_putvalues(tupstore, tupDesc, values, nulls);
+ buf.Release();
+ uzone->ReleaseSlotBuffer();
+ }
+ }
+
+ tuplestore_donestoring(tupstore);
+}
+
+
+static void ReadUndoZoneMetaFromShared(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore)
+{
+ Assert(tupleDesc != NULL);
+ Assert(tupstore != NULL);
+
+ uint32 startIdx = 0;
+ uint32 endIdx = 0;
+ uint64 used = 0;
+ char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
+ if (id == INVALID_ZONE_ID) {
+ used = UndoSize(UNDO_LOG_SPACE) + UndoSize(UNDO_SLOT_SPACE);
+ endIdx = UNDO_ZONE_COUNT - 1;
+ } else {
+ used = UndoSize(UNDO_LOG_SPACE);
+ endIdx = id;
+ startIdx = id;
+ }
+
+ for (auto idx = startIdx; idx <= endIdx; idx++) {
+ Datum values[PG_STAT_USP_PERSIST_META_COLS];
+ bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
+ UndoZone *uzone = (undo::UndoZone *)g_instance.undo_cxt.uZones[idx];
+ if (uzone == NULL) {
+ continue;
+ }
+ values[ARR_0] = ObjectIdGetDatum((Oid)uzone->GetZoneId());
+ values[ARR_1] = ObjectIdGetDatum((Oid)uzone->GetPersitentLevel());
+ errno_t rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(uzone->GetInsert()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_2] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(uzone->GetDiscard()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_3] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(uzone->GetForceDiscard()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_4] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, used);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_5] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, uzone->GetLSN());
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_6] = CStringGetTextDatum(textBuffer);
+ values[ARR_7] = ObjectIdGetDatum((Oid)uzone->GetAttachPid());
+ tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
+ }
+
+ tuplestore_donestoring(tupstore);
+}
+
+void Checkid(const int id, uint32 *startIdx, uint32 *endIdx)
+{
+ if (id == INVALID_ZONE_ID) {
+ *endIdx = UNDO_ZONE_COUNT - 1;
+ } else {
+ *startIdx = id;
+ *endIdx = id;
+ }
+}
+
+void GetZoneMetaValues(Datum *values, char *textBuffer, UndoZoneMetaInfo undoZoneMeta, uint32 idx, errno_t *rc)
+{
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(undoZoneMeta.insert));
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_2] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(undoZoneMeta.discard));
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_3] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(undoZoneMeta.forceDiscard));
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_4] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT, 0);
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_5] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT, undoZoneMeta.lsn);
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_6] = CStringGetTextDatum(textBuffer);
+}
+
+static void ReadTransSlotMetaFromShared(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore)
+{
+ Assert(tupleDesc != NULL);
+ Assert(tupstore != NULL);
+
+ uint32 startIdx = 0;
+ uint32 endIdx = 0;
+ char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
+ TransactionId recycleXmin;
+ TransactionId oldestXmin = GetOldestXminForUndo(&recycleXmin);
+ elog(LOG, "oldestXmin %lu", oldestXmin);
+
+ if (id == INVALID_ZONE_ID) {
+ endIdx = UNDO_ZONE_COUNT - 1;
+ } else {
+ startIdx = id;
+ endIdx = id;
+ }
+
+ for (auto idx = startIdx; idx <= endIdx; idx++) {
+ bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
+ Datum values[PG_STAT_USP_PERSIST_META_COLS];
+ UndoZone *uzone = (undo::UndoZone *)g_instance.undo_cxt.uZones[idx];
+ if (uzone == NULL) {
+ continue;
+ }
+ values[ARR_0] = ObjectIdGetDatum((Oid)idx);
+ values[ARR_1] = ObjectIdGetDatum((Oid)0); // unused
+ errno_t rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(uzone->GetAllocate()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_2] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(uzone->GetRecycle()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_3] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, "%016lu",
+ UNDO_PTR_GET_OFFSET(uzone->GetRecycleXid()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_4] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, "%016lu", recycleXmin);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_5] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, "%016lu",
+ pg_atomic_read_u64(&g_instance.undo_cxt.oldestXidInUndo));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_6] = CStringGetTextDatum(textBuffer);
+ tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
+ }
+
+ tuplestore_donestoring(tupstore);
+}
+
+void GetTransMetaValues(Datum *values, char *textBuffer, UndoZoneMetaInfo undoZoneMeta, uint32 loop, errno_t *rc)
+{
+ TransactionId recycleXmin;
+ TransactionId oldestXmin = GetOldestXminForUndo(&recycleXmin);
+ elog(LOG, "oldestXmin %lu", oldestXmin);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(undoZoneMeta.allocate));
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_2] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(undoZoneMeta.recycle));
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_3] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, "%016lu", undoZoneMeta.recycleXid);
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_4] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, "%016lu", recycleXmin);
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_5] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, "%016lu",
+ pg_atomic_read_u64(&g_instance.undo_cxt.oldestXidInUndo));
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_6] = CStringGetTextDatum(textBuffer);
+}
+
+static void ReadUndoMetaFromDisk(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore, const int type)
+{
+ Assert(tupleDesc != NULL);
+ Assert(tupstore != NULL);
+ int ret = 0;
+ uint32 startIdx = 0;
+ uint32 endIdx = 0;
+ char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
+ int fd = BasicOpenFile(UNDO_META_FILE, O_RDWR | PG_BINARY, S_IRUSR | S_IWUSR);
+
+ Checkfd(fd);
+ Checkid(id, &startIdx, &endIdx);
+ for (auto idx = startIdx; idx <= endIdx; idx++) {
+ bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
+ Datum values[PG_STAT_USP_PERSIST_META_COLS];
+ uint32 readPos = 0;
+ UndoZoneMetaInfo undoZoneMeta;
+ errno_t rc;
+
+ if (idx < PERSIST_ZONE_COUNT) {
+ readPos = (idx / UNDOZONE_COUNT_PER_PAGE) * UNDO_META_PAGE_SIZE +
+ (idx % UNDOZONE_COUNT_PER_PAGE) * sizeof(UndoZoneMetaInfo);
+ lseek(fd, readPos, SEEK_SET);
+ ret = read(fd, &undoZoneMeta, sizeof(UndoZoneMetaInfo));
+ if (ret != sizeof(UndoZoneMetaInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), errmsg(
+ "Read undo meta file fail, expect size(%lu), real size(%u)", sizeof(UndoZoneMetaInfo), ret)));
+ break;
+ }
+ } else {
+ rc = memset_s(&undoZoneMeta, sizeof(UndoZoneMetaInfo), 0, sizeof(UndoZoneMetaInfo));
+ securec_check(rc, "\0", "\0");
+ }
+ DECLARE_NODE_COUNT();
+ GET_UPERSISTENCE_BY_ZONEID((int)idx, nodeCount);
+ values[ARR_0] = ObjectIdGetDatum((Oid)idx);
+ values[ARR_1] = ObjectIdGetDatum((Oid)upersistence);
+ if (type == TYPE_UNDO_ZONE) {
+ GetZoneMetaValues(values, textBuffer, undoZoneMeta, idx, &rc);
+ } else {
+ GetTransMetaValues(values, textBuffer, undoZoneMeta, idx, &rc);
+ }
+
+ tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
+ }
+
+ tuplestore_donestoring(tupstore);
+ close(fd);
+}
+
+
+static uint64 UndoSpaceSize(UndoSpaceType type)
+{
+ uint64 used = 0;
+ for (auto idx = 0; idx < UNDO_ZONE_COUNT; idx++) {
+ UndoSpace *usp;
+ if (g_instance.undo_cxt.uZones[idx] == NULL) {
+ continue;
+ }
+ if (type == UNDO_LOG_SPACE) {
+ usp = ((UndoZone *)g_instance.undo_cxt.uZones[idx])->GetUndoSpace();
+ } else {
+ usp = ((UndoZone *)g_instance.undo_cxt.uZones[idx])->GetSlotSpace();
+ }
+ used += (uint64)usp->Used();
+ }
+ return used;
+}
+
+static void ReadUndoSpaceFromShared(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore, UndoSpaceType type)
+{
+ Assert(tupleDesc != NULL);
+ Assert(tupstore != NULL);
+
+ uint32 startIdx = 0;
+ uint32 endIdx = 0;
+ char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
+ uint64 used = UndoSpaceSize(type);
+
+ if (id == INVALID_ZONE_ID) {
+ used = UndoSpaceSize(UNDO_LOG_SPACE) + UndoSpaceSize(UNDO_SLOT_SPACE);
+ endIdx = UNDO_ZONE_COUNT - 1;
+ } else {
+ used = UndoSpaceSize(type);
+ startIdx = id;
+ endIdx = id;
+ }
+
+ for (auto idx = startIdx; idx <= endIdx; idx++) {
+ bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
+ Datum values[PG_STAT_USP_PERSIST_META_COLS];
+ UndoSpace *usp;
+ if (g_instance.undo_cxt.uZones[idx] == NULL) {
+ continue;
+ }
+ if (type == UNDO_LOG_SPACE) {
+ usp = ((UndoZone *)g_instance.undo_cxt.uZones[idx])->GetUndoSpace();
+ } else {
+ usp = ((UndoZone *)g_instance.undo_cxt.uZones[idx])->GetSlotSpace();
+ }
+ values[ARR_0] = ObjectIdGetDatum((Oid)idx);
+ values[ARR_1] = ObjectIdGetDatum((Oid)0); // unused
+ errno_t rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(usp->Tail()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_2] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(usp->Head()));
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_3] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, used);
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_4] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, usp->Used());
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_5] = CStringGetTextDatum(textBuffer);
+ rc = snprintf_s(textBuffer, sizeof(textBuffer), sizeof(textBuffer) - 1, UNDO_REC_PTR_FORMAT, usp->LSN());
+ securec_check_ss(rc, "\0", "\0");
+ values[ARR_6] = CStringGetTextDatum(textBuffer);
+ tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
+ }
+
+ tuplestore_donestoring(tupstore);
+}
+
+void GetUndoSpaceValues(Datum *values, char *textBuffer, UndoSpaceMetaInfo undoSpaceMeta, uint32 loop, errno_t *rc)
+{
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(undoSpaceMeta.tail));
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_2] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT,
+ UNDO_PTR_GET_OFFSET(undoSpaceMeta.head));
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_3] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT, (uint64)0xFFFF);
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_4] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT,
+ (undoSpaceMeta.tail - undoSpaceMeta.head) / BLCKSZ);
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_5] = CStringGetTextDatum(textBuffer);
+ *rc = snprintf_s(textBuffer, STAT_UNDO_LOG_SIZE, STAT_UNDO_LOG_SIZE - 1, UNDO_REC_PTR_FORMAT, undoSpaceMeta.lsn);
+ securec_check_ss(*rc, "\0", "\0");
+ values[ARR_6] = CStringGetTextDatum(textBuffer);
+}
+
+static void ReadUndoSpaceFromDisk(int id, TupleDesc *tupleDesc, Tuplestorestate *tupstore, UndoSpaceType type)
+{
+ Assert(tupleDesc != NULL);
+ Assert(tupstore != NULL);
+ int ret = 0;
+ uint32 startIdx = 0;
+ uint32 endIdx = 0;
+ uint32 undoSpaceBegin = 0;
+ uint32 undoZoneMetaPageCnt = 0;
+ uint32 undoSpaceMetaPageCnt = 0;
+ char textBuffer[STAT_UNDO_LOG_SIZE] = {'\0'};
+ int fd = BasicOpenFile(UNDO_META_FILE, O_RDWR | PG_BINARY, S_IRUSR | S_IWUSR);
+
+ Checkfd(fd);
+ Checkid(id, &startIdx, &endIdx);
+
+ /* Seek start position for writing transactionGroup meta. */
+ UNDOZONE_META_PAGE_COUNT(PERSIST_ZONE_COUNT, UNDOZONE_COUNT_PER_PAGE, undoZoneMetaPageCnt);
+ UNDOZONE_META_PAGE_COUNT(PERSIST_ZONE_COUNT, UNDOSPACE_COUNT_PER_PAGE, undoSpaceMetaPageCnt);
+ if (type == UNDO_LOG_SPACE) {
+ undoSpaceBegin = undoZoneMetaPageCnt * UNDO_META_PAGE_SIZE;
+ } else {
+ undoSpaceBegin = (undoZoneMetaPageCnt + undoSpaceMetaPageCnt) * UNDO_META_PAGE_SIZE;
+ }
+
+ for (auto idx = startIdx; idx <= endIdx; idx++) {
+ bool nulls[PG_STAT_USP_PERSIST_META_COLS] = {false};
+ Datum values[PG_STAT_USP_PERSIST_META_COLS];
+ uint32 readPos = 0;
+ UndoSpaceMetaInfo undoSpaceMeta;
+ errno_t rc;
+ if (idx < PERSIST_ZONE_COUNT) {
+ readPos = undoSpaceBegin + (idx / UNDOZONE_COUNT_PER_PAGE) * UNDO_META_PAGE_SIZE +
+ (idx % UNDOZONE_COUNT_PER_PAGE) * sizeof(UndoSpaceMetaInfo);
+ lseek(fd, readPos, SEEK_SET);
+ ret = read(fd, &undoSpaceMeta, sizeof(UndoSpaceMetaInfo));
+ if (ret != sizeof(UndoSpaceMetaInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), errmsg(
+ "Read undo meta file fail, expect size(%lu), real size(%u)", sizeof(UndoSpaceMetaInfo), ret)));
+ break;
+ }
+ } else {
+ rc = memset_s(&undoSpaceMeta, sizeof(UndoSpaceMetaInfo), 0, sizeof(UndoSpaceMetaInfo));
+ securec_check(rc, "\0", "\0");
+ }
+ DECLARE_NODE_COUNT();
+ GET_UPERSISTENCE_BY_ZONEID((int)idx, nodeCount);
+ values[ARR_0] = ObjectIdGetDatum((Oid)idx);
+ values[ARR_1] = ObjectIdGetDatum((Oid)upersistence);
+ GetUndoSpaceValues(values, textBuffer, undoSpaceMeta, idx, &rc);
+ tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
+ }
+
+ tuplestore_donestoring(tupstore);
+ close(fd);
+}
+
+bool Checkrsinfo(const ReturnSetInfo *rsinfo)
+{
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ return true;
+ }
+ if (!(rsinfo->allowedModes & SFRM_Materialize)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+ return true;
+ }
+ return false;
+}
+#endif
+
+Datum gs_undo_meta(PG_FUNCTION_ARGS)
+{
+#ifdef ENABLE_MULTIPLE_NODES
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unsupported view in multiple nodes mode.")));
+ PG_RETURN_VOID();
+#else
+ int type = PG_GETARG_INT32(0); // Indicate meta data type(0:undozone, 1:group, 2:undoSpace, 3:slotSpace)
+ int id = PG_GETARG_INT32(1); // zoneId (-1 represents all)
+ int metaLocation = PG_GETARG_INT32(2); // meta location (0:shared , 1:disk)
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
+ TupleDesc tupDesc;
+ Tuplestorestate *tupstore = NULL;
+ MemoryContext per_query_ctx;
+ MemoryContext oldcontext;
+
+ if (g_instance.undo_cxt.uZones == NULL) {
+ elog(ERROR, "Haven't used Ustore");
+ }
+
+ if (id < -1 || id >= UNDO_ZONE_COUNT || (metaLocation != 0 && metaLocation != 1)) {
+ elog(ERROR, "Invalid input param");
+ }
+
+ if (Checkrsinfo(rsinfo)) {
+ PG_RETURN_VOID();
+ }
+
+ if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
+ elog(ERROR, "return type must be a row type");
+ PG_RETURN_VOID();
+ }
+
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ oldcontext = MemoryContextSwitchTo(per_query_ctx);
+ tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = tupDesc;
+ MemoryContextSwitchTo(oldcontext);
+
+ switch (type) {
+ /* Undospace meta info. */
+ case TYPE_UNDO_ZONE:
+ if (metaLocation == 0) {
+ ReadUndoZoneMetaFromShared(id, &tupDesc, tupstore);
+ } else {
+ ReadUndoMetaFromDisk(id, &tupDesc, tupstore, TYPE_UNDO_ZONE);
+ }
+ break;
+ /* TransactionGroup meta info. */
+ case TYPE_GROUP:
+ if (metaLocation == 0) {
+ ReadTransSlotMetaFromShared(id, &tupDesc, tupstore);
+ } else {
+ ReadUndoMetaFromDisk(id, &tupDesc, tupstore, TYPE_GROUP);
+ }
+ break;
+ case TYPE_UNDO_SPACE:
+ if (metaLocation == 0) {
+ ReadUndoSpaceFromShared(id, &tupDesc, tupstore, UNDO_LOG_SPACE);
+ } else {
+ ReadUndoSpaceFromDisk(id, &tupDesc, tupstore, UNDO_LOG_SPACE);
+ }
+ break;
+ case TYPE_SLOT_SPACE:
+ if (metaLocation == 0) {
+ ReadUndoSpaceFromShared(id, &tupDesc, tupstore, UNDO_SLOT_SPACE);
+ } else {
+ ReadUndoSpaceFromDisk(id, &tupDesc, tupstore, UNDO_SLOT_SPACE);
+ }
+ break;
+ default:
+ elog(ERROR, "Invalid input param");
+ break;
+ }
+
+ PG_RETURN_VOID();
+#endif
+}
+
+Datum gs_undo_record(PG_FUNCTION_ARGS)
+{
+#ifdef ENABLE_MULTIPLE_NODES
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unsupported view in multiple nodes mode.")));
+ PG_RETURN_VOID();
+#else
+ UndoRecPtr undoptr = DatumGetUInt64(PG_GETARG_DATUM(0));
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
+ TupleDesc tupDesc;
+ Tuplestorestate *tupstore = NULL;
+ MemoryContext per_query_ctx;
+ MemoryContext oldcontext;
+
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ PG_RETURN_VOID();
+ }
+ if (!(rsinfo->allowedModes & SFRM_Materialize)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+ PG_RETURN_VOID();
+ }
+ if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
+ elog(ERROR, "return type must be a row type");
+ PG_RETURN_VOID();
+ }
+
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ oldcontext = MemoryContextSwitchTo(per_query_ctx);
+ tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = tupDesc;
+ MemoryContextSwitchTo(oldcontext);
+
+ ParseUndoRecord(undoptr, tupstore, tupDesc);
+ tuplestore_donestoring(tupstore);
+
+ PG_RETURN_VOID();
+#endif
+}
+
+Datum gs_undo_translot(PG_FUNCTION_ARGS)
+{
+#ifdef ENABLE_MULTIPLE_NODES
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unsupported view in multiple nodes mode.")));
+ PG_RETURN_VOID();
+#else
+ int type = PG_GETARG_INT32(0); // Indicates query meta from share memory or persistent file
+ int32 zoneId = PG_GETARG_INT32(1); // zone id
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
+ TupleDesc tupDesc;
+ Tuplestorestate *tupstore = NULL;
+ MemoryContext per_query_ctx;
+ MemoryContext oldcontext;
+
+ if (g_instance.undo_cxt.uZones == NULL) {
+ elog(ERROR, "Haven't used Ustore");
+ }
+
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ PG_RETURN_VOID();
+ }
+ if (!(rsinfo->allowedModes & SFRM_Materialize)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+ PG_RETURN_VOID();
+ }
+ if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
+ elog(ERROR, "return type must be a row type");
+ PG_RETURN_VOID();
+ }
+
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ oldcontext = MemoryContextSwitchTo(per_query_ctx);
+ tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = tupDesc;
+ MemoryContextSwitchTo(oldcontext);
+
+ if (type == 0 || type == 1) {
+ if (zoneId < -1 || zoneId >= UNDO_ZONE_COUNT) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Zone id is invalid %d", zoneId)));
+ PG_RETURN_VOID();
+ }
+ } else {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Invalid input param")));
+ PG_RETURN_VOID();
+ }
+
+ uint32 startIdx = 0;
+ uint32 endIdx = 0;
+
+ if (zoneId == INVALID_ZONE_ID) {
+ endIdx = PERSIST_ZONE_COUNT - 1;
+ } else {
+ startIdx = zoneId;
+ endIdx = zoneId;
+ }
+
+ if (type == 1) {
+ ReadTranslotFromDisk(startIdx, endIdx, tupstore, tupDesc);
+ } else {
+ ReadTranslotFromMemory(startIdx, endIdx, tupstore, tupDesc);
+ }
+
+ PG_RETURN_VOID();
+#endif
+}
+
+Datum gs_index_verify(PG_FUNCTION_ARGS)
+{
+#ifdef ENABLE_MULTIPLE_NODES
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unsupported view in multiple nodes mode.")));
+ PG_RETURN_VOID();
+#else
+ Oid relationOid = PG_GETARG_OID(0);
+ uint32 blkno = (uint32)PG_GETARG_OID(1);
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
+ TupleDesc tupDesc;
+ Tuplestorestate *tupstore = NULL;
+ MemoryContext per_query_ctx;
+ MemoryContext oldcontext;
+
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ PG_RETURN_VOID();
+ }
+ if (!(rsinfo->allowedModes & SFRM_Materialize)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+ PG_RETURN_VOID();
+ }
+ if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
+ elog(ERROR, "return type must be a row type");
+ PG_RETURN_VOID();
+ }
+
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ oldcontext = MemoryContextSwitchTo(per_query_ctx);
+ tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = tupDesc;
+ MemoryContextSwitchTo(oldcontext);
+
+ if (relationOid == InvalidOid) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("relation oid is invalid %d", relationOid)));
+ PG_RETURN_VOID();
+ }
+
+ Relation relation = relation_open(relationOid, AccessShareLock);
+ Assert(relation->rd_isvalid);
+ if (!RelationIsUstoreIndex(relation)) {
+ relation_close(relation, AccessShareLock);
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmodule(MOD_USTORE),
+ errmsg("Relaiton corresponding to oid(%u) is not ubtree index.", relationOid),
+ errdetail("N/A"),
+ errcause("feature not supported"),
+ erraction("check defination of this rel")));
+ PG_RETURN_VOID();
+ }
+
+ if (blkno == InvalidBlockNumber) {
+ relation_close(relation, AccessShareLock);
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmodule(MOD_USTORE),
+ errmsg("Block number(%u) is invalid.", blkno),
+ errdetail("N/A"),
+ errcause("Invalid block number."),
+ erraction("Check the blkno parameter.")));
+ PG_RETURN_VOID();
+ } else if (blkno == 0) {
+ // Verfiy whole index tree
+ UBTreeVerifyIndex(relation, &tupDesc, tupstore, UBTREE_VERIFY_OUTPUT_PARAM_CNT);
+ } else {
+ // Verify single index page
+ uint32 verifyRes;
+ Page page = NULL;
+ bool nulls[UBTREE_VERIFY_OUTPUT_PARAM_CNT] = {false};
+ Datum values[UBTREE_VERIFY_OUTPUT_PARAM_CNT];
+ BTScanInsert cmpKeys = UBTreeMakeScanKey(relation, NULL);
+ Buffer buf = _bt_getbuf(relation, blkno, BT_READ);
+ if (BufferIsInvalid(buf)) {
+ relation_close(relation, AccessShareLock);
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Block number %u is invalid", blkno)));
+ PG_RETURN_VOID();
+ }
+
+ page = (Page)BufferGetPage(buf);
+ verifyRes = UBTreeVerifyOnePage(relation, page, cmpKeys, NULL);
+ _bt_relbuf(relation, buf);
+ pfree(cmpKeys);
+ values[ARR_0] = CStringGetTextDatum(UBTGetVerifiedPageTypeStr((uint32)VERIFY_MAIN_PAGE));
+ values[ARR_1] = ObjectIdGetDatum((Oid)blkno);
+ values[ARR_2] = CStringGetTextDatum(UBTGetVerifiedResultStr(verifyRes));
+ tuplestore_putvalues(tupstore, tupDesc, values, nulls);
+ }
+
+ tuplestore_donestoring(tupstore);
+ relation_close(relation, AccessShareLock);
+ PG_RETURN_VOID();
+#endif
+}
+
+Datum gs_index_recycle_queue(PG_FUNCTION_ARGS)
+{
+#ifdef ENABLE_MULTIPLE_NODES
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unsupported view in multiple nodes mode.")));
+ PG_RETURN_VOID();
+#else
+ Oid relationOid = PG_GETARG_OID(0);
+ uint32 type = (uint32)PG_GETARG_OID(1);
+ uint32 blkno = (uint32)PG_GETARG_OID(2);
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
+ TupleDesc tupDesc;
+ Tuplestorestate *tupstore = NULL;
+ MemoryContext per_query_ctx;
+ MemoryContext oldcontext;
+
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ PG_RETURN_VOID();
+ }
+ if (!(rsinfo->allowedModes & SFRM_Materialize)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+ PG_RETURN_VOID();
+ }
+ if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
+ elog(ERROR, "return type must be a row type");
+ PG_RETURN_VOID();
+ }
+
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ oldcontext = MemoryContextSwitchTo(per_query_ctx);
+ tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = tupDesc;
+ MemoryContextSwitchTo(oldcontext);
+
+ if (relationOid == InvalidOid) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("relation oid is invalid %u", relationOid)));
+ PG_RETURN_VOID();
+ }
+ if (type > RECYCLE_NONE_FORK) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Invalid parse type %u", type)));
+ PG_RETURN_VOID();
+ }
+
+ Relation relation = relation_open(relationOid, AccessShareLock);
+ Assert(relation->rd_isvalid);
+ if (!RelationIsUstoreIndex(relation)) {
+ relation_close(relation, AccessShareLock);
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmodule(MOD_USTORE),
+ errmsg("Relaiton correspondisng to oid(%u) is not ubtree index.", relationOid),
+ errdetail("N/A"),
+ errcause("feature not supported"),
+ erraction("check defination of this rel")));
+ PG_RETURN_VOID();
+ }
+
+ if (type == RECYCLE_NONE_FORK) {
+ /*
+ * Check blkno first.Blkno 0 is the meta page of ubtree index, no need dump.
+ * And blkno -1 is invalid block number.
+ */
+ if (blkno == 0 || blkno == InvalidBlockNumber) {
+ relation_close(relation, AccessShareLock);
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmodule(MOD_USTORE),
+ errmsg("Block number(%u) is invalid.", blkno),
+ errdetail("N/A"),
+ errcause("Invalid block number."),
+ erraction("Check the blkno parameter.")));
+ PG_RETURN_VOID();
+ }
+ Buffer buf = _bt_getbuf(relation, blkno, BT_READ);
+ if (BufferIsInvalid(buf)) {
+ relation_close(relation, AccessShareLock);
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Block number %u is invalid", blkno)));
+ PG_RETURN_VOID();
+ }
+ (void) UBTreeRecycleQueuePageDump(relation, buf, true, &tupDesc, tupstore, UBTREE_RECYCLE_OUTPUT_PARAM_CNT);
+ _bt_relbuf(relation, buf);
+ } else {
+ UBTreeDumpRecycleQueueFork(relation, (UBTRecycleForkNumber)type, &tupDesc, tupstore,
+ UBTREE_RECYCLE_OUTPUT_PARAM_CNT);
+ }
+
+ relation_close(relation, AccessShareLock);
+ // call verify interface in index module
+ tuplestore_donestoring(tupstore);
+ PG_RETURN_VOID();
+#endif
+}
diff --git a/src/common/backend/utils/adt/pgxlogstatfuncs.cpp b/src/common/backend/utils/adt/pgxlogstatfuncs.cpp
new file mode 100644
index 000000000..1d90f358f
--- /dev/null
+++ b/src/common/backend/utils/adt/pgxlogstatfuncs.cpp
@@ -0,0 +1,363 @@
+/* -------------------------------------------------------------------------
+ *
+ * pgstatfuncs.c
+ * Functions for accessing the statistics collector data
+ *
+ * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/utils/adt/pgxlogstatfuncs.cpp
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "knl/knl_variable.h"
+#include
+
+#include "access/transam.h"
+#include "access/tableam.h"
+#include "access/redo_statistic.h"
+#include "access/xlog.h"
+#include "connector.h"
+#include "catalog/namespace.h"
+#include "catalog/pg_database.h"
+#include "catalog/pg_tablespace.h"
+#include "catalog/pg_type.h"
+#include "catalog/pg_partition_fn.h"
+#include "catalog/pg_namespace.h"
+#include "commands/dbcommands.h"
+#include "commands/user.h"
+#include "commands/vacuum.h"
+#include "funcapi.h"
+#include "gaussdb_version.h"
+#include "libpq/ip.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/globalplancache.h"
+#include "utils/inet.h"
+#include "utils/timestamp.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/memprot.h"
+#include "utils/typcache.h"
+#include "utils/syscache.h"
+#include "pgxc/pgxc.h"
+#include "pgxc/nodemgr.h"
+#include "postmaster/autovacuum.h"
+#include "postmaster/postmaster.h"
+#include "storage/lock/lwlock.h"
+#include "postgres.h"
+#include "knl/knl_variable.h"
+#include "storage/smgr/segment.h"
+#include "storage/proc.h"
+#include "storage/procarray.h"
+#include "storage/buf/buf_internals.h"
+#include "workload/cpwlm.h"
+#include "workload/workload.h"
+#include "pgxc/pgxcnode.h"
+#include "access/hash.h"
+#include "libcomm/libcomm.h"
+#include "pgxc/poolmgr.h"
+#include "pgxc/execRemote.h"
+#include "utils/elog.h"
+#include "utils/memtrace.h"
+#include "commands/user.h"
+#include "instruments/gs_stat.h"
+#include "instruments/list.h"
+#include "replication/rto_statistic.h"
+#include "storage/lock/lock.h"
+
+const int STAT_XLOG_TBLENTRY_COLS = 4;
+const int STAT_XLOG_TEXT_BUFFER_SIZE = 1024;
+const int STAT_XLOG_FLUSH_LOCATION = 12;
+const int STAT_XLOG_FLUSH_STAT = 16;
+const int STAT_XLOG_FLUSH_STAT_OFF = -1;
+const int STAT_XLOG_FLUSH_STAT_ON = 0;
+const int STAT_XLOG_FLUSH_STAT_GET = 1;
+const int STAT_XLOG_FLUSH_STAT_CLEAR = 2;
+
+static void ReadAllWalInsertStatusTable(int64 walInsertStatusEntryCount, TupleDesc *tupleDesc,
+ Tuplestorestate *tupstore)
+{
+ Assert(tupleDesc != NULL);
+ Assert(tupstore != NULL);
+
+ volatile WALInsertStatusEntry *entry_ptr = NULL;
+ for (int64 idx = 0; idx < walInsertStatusEntryCount; idx++) {
+ entry_ptr = &g_instance.wal_cxt.walInsertStatusTable[GET_STATUS_ENTRY_INDEX(idx)];
+
+ bool nulls[STAT_XLOG_TBLENTRY_COLS] = {false};
+ Datum values[STAT_XLOG_TBLENTRY_COLS];
+
+ values[ARR_0] = UInt64GetDatum(idx);
+ values[ARR_1] = UInt64GetDatum(entry_ptr->endLSN);
+ values[ARR_2] = Int32GetDatum(entry_ptr->LRC);
+ values[ARR_3] = UInt32GetDatum(entry_ptr->status);
+ tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
+ }
+
+ tuplestore_donestoring(tupstore);
+}
+
+static void ReadWalInsertStatusTableByTldx(int64 idx, TupleDesc *tupleDesc, Tuplestorestate *tupstore)
+{
+ Assert(tupleDesc != NULL);
+ Assert(tupstore != NULL);
+
+ volatile WALInsertStatusEntry *entry_ptr = NULL;
+ entry_ptr = &g_instance.wal_cxt.walInsertStatusTable[GET_STATUS_ENTRY_INDEX(idx)];
+ bool nulls[STAT_XLOG_TBLENTRY_COLS] = {false};
+ Datum values[STAT_XLOG_TBLENTRY_COLS];
+ values[ARR_0] = UInt64GetDatum(idx);
+ values[ARR_1] = UInt64GetDatum(entry_ptr->endLSN);
+ values[ARR_2] = Int32GetDatum(entry_ptr->LRC);
+ values[ARR_3] = UInt32GetDatum(entry_ptr->status);
+ tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
+
+ tuplestore_donestoring(tupstore);
+}
+
+Datum gs_stat_wal_entrytable(PG_FUNCTION_ARGS)
+{
+ int64 idx = PG_GETARG_INT64(0); // -1: all walInsertStatus; n:walInsertStatusTable[n]
+
+ int64 walInsertStatusEntryCount =
+ GET_WAL_INSERT_STATUS_ENTRY_CNT(g_instance.attr.attr_storage.wal_insert_status_entries_power);
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
+ TupleDesc tupDesc;
+ Tuplestorestate *tupstore = NULL;
+ MemoryContext per_query_ctx;
+ MemoryContext oldcontext;
+
+ if (idx >= walInsertStatusEntryCount || idx < -1) {
+ elog(ERROR, "The idx out of range.");
+ PG_RETURN_VOID();
+ }
+
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ PG_RETURN_VOID();
+ }
+ if (!(rsinfo->allowedModes & SFRM_Materialize)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+ PG_RETURN_VOID();
+ }
+
+ if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
+ elog(ERROR, "return type must be a row type");
+ PG_RETURN_VOID();
+ }
+
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ oldcontext = MemoryContextSwitchTo(per_query_ctx);
+ tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = tupDesc;
+ MemoryContextSwitchTo(oldcontext);
+
+ if (idx == -1) {
+ ReadAllWalInsertStatusTable(walInsertStatusEntryCount, &tupDesc, tupstore);
+ } else {
+ ReadWalInsertStatusTableByTldx(idx, &tupDesc, tupstore);
+ }
+
+ PG_RETURN_VOID();
+}
+
+static void ReadFlushLocation(TupleDesc *tupleDesc, Tuplestorestate *tupstore)
+{
+ Assert(tupleDesc != NULL);
+ Assert(tupstore != NULL);
+
+ bool nulls[STAT_XLOG_FLUSH_LOCATION] = {false};
+ Datum values[STAT_XLOG_FLUSH_LOCATION];
+
+ volatile XLogCtlInsert *Insert = &t_thrd.shemem_ptr_cxt.XLogCtl->Insert;
+ volatile XLogwrtRqst *LogwrtRqst = &t_thrd.shemem_ptr_cxt.XLogCtl->LogwrtRqst;
+ volatile XLogwrtResult *LogwrtResult = &t_thrd.shemem_ptr_cxt.XLogCtl->LogwrtResult;
+
+ values[ARR_0] = Int32GetDatum(g_instance.wal_cxt.lastWalStatusEntryFlushed);
+ values[ARR_1] = Int32GetDatum(g_instance.wal_cxt.lastLRCScanned);
+ values[ARR_2] = Int32GetDatum(Insert->CurrLRC);
+ values[ARR_3] = UInt64GetDatum(Insert->CurrBytePos);
+ values[ARR_4] = UInt32GetDatum(Insert->PrevByteSize);
+ values[ARR_5] = UInt64GetDatum(g_instance.wal_cxt.flushResult);
+ values[ARR_6] = UInt64GetDatum(g_instance.wal_cxt.sentResult);
+ values[ARR_7] = UInt64GetDatum(LogwrtRqst->Write);
+ values[ARR_8] = UInt64GetDatum(LogwrtRqst->Flush);
+ values[ARR_9] = UInt64GetDatum(LogwrtResult->Write);
+ values[ARR_10] = UInt64GetDatum(LogwrtResult->Flush);
+ values[ARR_11] = TimestampTzGetDatum(GetCurrentTimestamp());
+
+ tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
+ tuplestore_donestoring(tupstore);
+}
+
+
+static void GetWalwriterFlushStat(TupleDesc *tupleDesc, Tuplestorestate *tupstore)
+{
+ Assert(tupleDesc != NULL);
+ Assert(tupstore != NULL);
+
+ bool nulls[STAT_XLOG_FLUSH_STAT] = {false};
+ Datum values[STAT_XLOG_FLUSH_STAT];
+
+ if (g_instance.wal_cxt.xlogFlushStats->writeTimes != 0) {
+ g_instance.wal_cxt.xlogFlushStats->avgActualWriteBytes =
+ g_instance.wal_cxt.xlogFlushStats->totalActualXlogSyncBytes / g_instance.wal_cxt.xlogFlushStats->writeTimes;
+ g_instance.wal_cxt.xlogFlushStats->avgWriteTime =
+ g_instance.wal_cxt.xlogFlushStats->totalWriteTime / g_instance.wal_cxt.xlogFlushStats->writeTimes;
+ g_instance.wal_cxt.xlogFlushStats->avgWriteBytes =
+ g_instance.wal_cxt.xlogFlushStats->totalXlogSyncBytes / g_instance.wal_cxt.xlogFlushStats->writeTimes;
+ }
+
+ if (g_instance.wal_cxt.xlogFlushStats->syncTimes != 0) {
+ g_instance.wal_cxt.xlogFlushStats->avgSyncTime =
+ g_instance.wal_cxt.xlogFlushStats->totalSyncTime / g_instance.wal_cxt.xlogFlushStats->syncTimes;
+ g_instance.wal_cxt.xlogFlushStats->avgSyncBytes =
+ g_instance.wal_cxt.xlogFlushStats->totalXlogSyncBytes / g_instance.wal_cxt.xlogFlushStats->syncTimes;
+ g_instance.wal_cxt.xlogFlushStats->avgActualSyncBytes =
+ g_instance.wal_cxt.xlogFlushStats->totalActualXlogSyncBytes / g_instance.wal_cxt.xlogFlushStats->syncTimes;
+ }
+
+ values[ARR_0] = UInt64GetDatum(g_instance.wal_cxt.xlogFlushStats->writeTimes);
+ values[ARR_1] = UInt64GetDatum(g_instance.wal_cxt.xlogFlushStats->syncTimes);
+ values[ARR_2] = UInt64GetDatum(g_instance.wal_cxt.xlogFlushStats->totalXlogSyncBytes);
+ values[ARR_3] = UInt64GetDatum(g_instance.wal_cxt.xlogFlushStats->totalActualXlogSyncBytes);
+ values[ARR_4] = UInt32GetDatum(g_instance.wal_cxt.xlogFlushStats->avgWriteBytes);
+ values[ARR_5] = UInt32GetDatum(g_instance.wal_cxt.xlogFlushStats->avgActualWriteBytes);
+ values[ARR_6] = UInt32GetDatum(g_instance.wal_cxt.xlogFlushStats->avgSyncBytes);
+ values[ARR_7] = UInt32GetDatum(g_instance.wal_cxt.xlogFlushStats->avgActualSyncBytes);
+ values[ARR_8] = UInt64GetDatum(g_instance.wal_cxt.xlogFlushStats->totalWriteTime);
+ values[ARR_9] = UInt64GetDatum(g_instance.wal_cxt.xlogFlushStats->totalSyncTime);
+ values[ARR_10] = UInt64GetDatum(g_instance.wal_cxt.xlogFlushStats->avgWriteTime);
+ values[ARR_11] = UInt64GetDatum(g_instance.wal_cxt.xlogFlushStats->avgSyncTime);
+ values[ARR_12] = UInt64GetDatum(GetNewestXLOGSegNo(t_thrd.proc_cxt.DataDir));
+ values[ARR_13] = UInt64GetDatum(g_instance.wal_cxt.xlogFlushStats->currOpenXlogSegNo);
+ values[ARR_14] = TimestampTzGetDatum(g_instance.wal_cxt.xlogFlushStats->lastRestTime);
+ values[ARR_15] = TimestampTzGetDatum(GetCurrentTimestamp());
+ tuplestore_putvalues(tupstore, *tupleDesc, values, nulls);
+ tuplestore_donestoring(tupstore);
+}
+
+
+static void ClearWalwriterFlushStat(TupleDesc *tupleDesc, Tuplestorestate *tupstore)
+{
+ Assert(tupleDesc != NULL);
+ Assert(tupstore != NULL);
+
+ g_instance.wal_cxt.xlogFlushStats->writeTimes = 0;
+ g_instance.wal_cxt.xlogFlushStats->syncTimes = 0;
+ g_instance.wal_cxt.xlogFlushStats->totalXlogSyncBytes = 0;
+ g_instance.wal_cxt.xlogFlushStats->totalActualXlogSyncBytes = 0;
+ g_instance.wal_cxt.xlogFlushStats->avgWriteBytes = 0;
+ g_instance.wal_cxt.xlogFlushStats->avgActualWriteBytes = 0;
+ g_instance.wal_cxt.xlogFlushStats->avgSyncBytes = 0;
+ g_instance.wal_cxt.xlogFlushStats->avgActualSyncBytes = 0;
+ g_instance.wal_cxt.xlogFlushStats->totalWriteTime = 0;
+ g_instance.wal_cxt.xlogFlushStats->totalSyncTime = 0;
+ g_instance.wal_cxt.xlogFlushStats->avgWriteTime = 0;
+ g_instance.wal_cxt.xlogFlushStats->avgSyncTime = 0;
+ g_instance.wal_cxt.xlogFlushStats->currOpenXlogSegNo = 0;
+ g_instance.wal_cxt.xlogFlushStats->lastRestTime = GetCurrentTimestamp();
+
+ GetWalwriterFlushStat(tupleDesc, tupstore);
+}
+
+Datum gs_walwriter_flush_position(PG_FUNCTION_ARGS)
+{
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
+ TupleDesc tupDesc;
+ Tuplestorestate *tupstore = NULL;
+ MemoryContext per_query_ctx;
+ MemoryContext oldcontext;
+
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ PG_RETURN_VOID();
+ }
+ if (!(rsinfo->allowedModes & SFRM_Materialize)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+ PG_RETURN_VOID();
+ }
+
+ if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
+ elog(ERROR, "return type must be a row type");
+ PG_RETURN_VOID();
+ }
+
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ oldcontext = MemoryContextSwitchTo(per_query_ctx);
+ tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = tupDesc;
+ MemoryContextSwitchTo(oldcontext);
+
+ ReadFlushLocation(&tupDesc, tupstore);
+
+ PG_RETURN_VOID();
+}
+
+Datum gs_walwriter_flush_stat(PG_FUNCTION_ARGS)
+{
+ int operation = PG_GETARG_INT32(0);
+
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *)fcinfo->resultinfo;
+ TupleDesc tupDesc;
+ Tuplestorestate *tupstore = NULL;
+ MemoryContext per_query_ctx;
+ MemoryContext oldcontext;
+
+ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("set-valued function called in context that cannot accept a set")));
+ PG_RETURN_VOID();
+ }
+ if (!(rsinfo->allowedModes & SFRM_Materialize)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("materialize mode required, but it is not allowed in this context")));
+ PG_RETURN_VOID();
+ }
+
+ if (get_call_result_type(fcinfo, NULL, &tupDesc) != TYPEFUNC_COMPOSITE) {
+ elog(ERROR, "return type must be a row type");
+ PG_RETURN_VOID();
+ }
+
+ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
+ oldcontext = MemoryContextSwitchTo(per_query_ctx);
+ tupstore = tuplestore_begin_heap(true, false, u_sess->attr.attr_memory.work_mem);
+ rsinfo->returnMode = SFRM_Materialize;
+ rsinfo->setResult = tupstore;
+ rsinfo->setDesc = tupDesc;
+ MemoryContextSwitchTo(oldcontext);
+
+ if (operation == STAT_XLOG_FLUSH_STAT_OFF) {
+ g_instance.wal_cxt.xlogFlushStats->statSwitch = false;
+ elog(INFO, "The xlogFlushStats switch is turned off.");
+ GetWalwriterFlushStat(&tupDesc, tupstore);
+ } else if (operation == STAT_XLOG_FLUSH_STAT_ON) {
+ g_instance.wal_cxt.xlogFlushStats->statSwitch = true;
+ elog(INFO, "The xlogFlushStats switch is turned on.");
+ GetWalwriterFlushStat(&tupDesc, tupstore);
+ } else if (operation == STAT_XLOG_FLUSH_STAT_GET) {
+ GetWalwriterFlushStat(&tupDesc, tupstore);
+ } else if (operation == STAT_XLOG_FLUSH_STAT_CLEAR) {
+ ClearWalwriterFlushStat(&tupDesc, tupstore);
+ } else {
+ elog(ERROR, "Parameter \"operation\" out of range.");
+ }
+
+ PG_RETURN_VOID();
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/adt/regexp.cpp b/src/common/backend/utils/adt/regexp.cpp
index 83940e9f7..f1825a567 100644
--- a/src/common/backend/utils/adt/regexp.cpp
+++ b/src/common/backend/utils/adt/regexp.cpp
@@ -5,6 +5,7 @@
*
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
+ * Portions Copyright (c) 2021, openGauss Contributors
*
*
* IDENTIFICATION
@@ -39,6 +40,11 @@
#define PG_GETARG_TEXT_PP_IF_EXISTS(_n) ((PG_NARGS() > (_n)) ? PG_GETARG_TEXT_PP(_n) : NULL)
+#define REGEX_COMPAT_MODE \
+ ((u_sess->attr.attr_sql.sql_compatibility == A_FORMAT || \
+ u_sess->attr.attr_sql.sql_compatibility == B_FORMAT) && \
+ AFORMAT_REGEX_MATCH)
+
/* all the options of interest for regex functions */
typedef struct pg_re_flags {
int cflags; /* compile flags for Spencer's regex code */
@@ -84,8 +90,9 @@ typedef struct regexp_matches_ctx {
*/
/* Local functions */
-static regexp_matches_ctx* setup_regexp_matches(text* orig_str, text* pattern, text* flags, Oid collation,
- bool force_glob, bool use_subpatterns, bool ignore_degenerate);
+static regexp_matches_ctx* setup_regexp_matches(text* orig_str, text* pattern,
+ pg_re_flags *re_flags, Oid collation,
+ bool use_subpatterns, bool ignore_degenerate, int start_search);
static void cleanup_regexp_matches(regexp_matches_ctx* matchctx);
static ArrayType* build_regexp_matches_result(regexp_matches_ctx* matchctx);
static Datum build_regexp_split_result(regexp_matches_ctx* splitctx);
@@ -299,6 +306,17 @@ static bool RE_compile_and_execute(
return RE_execute(re, dat, dat_len, nmatch, pmatch);
}
+static void parse_re_set_n_flag(pg_re_flags* flags)
+{
+ if (REGEX_COMPAT_MODE) {
+ /* \n doesn't match . or [^ ] */
+ flags->cflags &= ~REG_NLSTOP;
+ } else {
+ /* \n affects ^ $ . [^ */
+ flags->cflags |= REG_NEWLINE;
+ }
+}
+
/*
* parse_re_flags - parse the options argument of regexp_matches and friends
*
@@ -314,6 +332,11 @@ static void parse_re_flags(pg_re_flags* flags, text* opts)
flags->cflags = REG_ADVANCED;
flags->glob = false;
+ if (REGEX_COMPAT_MODE) {
+ /* \n doesn't match . or [^ ] by default for compatible */
+ flags->cflags |= REG_NLSTOP;
+ }
+
if (opts != NULL) {
char* opt_p = VARDATA_ANY(opts);
int opt_len = VARSIZE_ANY_EXHDR(opts);
@@ -338,9 +361,11 @@ static void parse_re_flags(pg_re_flags* flags, text* opts)
flags->cflags |= REG_ICASE;
break;
case 'm': /* Perloid synonym for n */
- case 'n': /* \n affects ^ $ . [^ */
flags->cflags |= REG_NEWLINE;
break;
+ case 'n':
+ parse_re_set_n_flag(flags);
+ break;
case 'p': /* ~Perl, \n affects . [^ */
flags->cflags |= REG_NLSTOP;
flags->cflags &= ~REG_NLANCH;
@@ -504,6 +529,108 @@ Datum textregexsubstr(PG_FUNCTION_ARGS)
CHECK_RETNULL_RETURN_DATUM(result);
}
+static void regexp_check_args(FunctionCallInfo fcinfo, int* arg, int init_val, int n, bool* has_null)
+{
+ if (PG_NARGS() > n) {
+ if (PG_ARGISNULL(n))
+ *has_null = true;
+ else
+ *arg = PG_GETARG_INT32(n);
+ }
+
+ if (*arg < init_val) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("argument '%d' is out of range", *arg),
+ errhint("should start from %d", init_val)));
+ }
+}
+
+static void regexp_get_re_flags(FunctionCallInfo fcinfo, pg_re_flags* re_flags, int n)
+{
+ text* flags = NULL;
+
+ /* match params */
+ if (PG_NARGS() > n && !PG_ARGISNULL(n))
+ flags = PG_GETARG_TEXT_PP(n);
+
+ parse_re_flags(re_flags, flags);
+ if (re_flags->glob) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid regexp option: \"%c\"", 'g')));
+ }
+}
+/*
+ * regexp_replace cluster's common function.
+ * regexp_replace(source, pattern [, replace_str [, position [, occurrence [, match_param]]]])
+ */
+Datum regexp_replace(PG_FUNCTION_ARGS)
+{
+ text* src = NULL;
+ text* pattern = NULL;
+ text* r = NULL;
+ int position = 1;
+ int occurrence = 0;
+ regex_t* re = NULL;
+ text* result = NULL;
+ pg_re_flags re_flags;
+ bool has_null = false;
+
+ /* source string */
+ if (!PG_ARGISNULL(ARG_0))
+ src = PG_GETARG_TEXT_PP(ARG_0);
+
+ /* pattern string */
+ if (!PG_ARGISNULL(1))
+ pattern = PG_GETARG_TEXT_PP(1);
+
+ /* replace string */
+ if (PG_NARGS() > ARG_2) {
+ if (!PG_ARGISNULL(ARG_2))
+ r = PG_GETARG_TEXT_PP(ARG_2);
+ }
+
+ regexp_check_args(fcinfo, &position, 1, ARG_3, &has_null);
+ regexp_check_args(fcinfo, &occurrence, 0, ARG_4, &has_null);
+ regexp_get_re_flags(fcinfo, &re_flags, ARG_5);
+
+ if (src == NULL || has_null)
+ PG_RETURN_NULL();
+
+ if (pattern == NULL)
+ PG_RETURN_TEXT_P(src);
+
+ re = RE_compile_and_cache(pattern, re_flags.cflags, PG_GET_COLLATION());
+ result = replace_text_regexp(src, (void*)re, r, position, occurrence);
+
+ if (VARHDRSZ == VARSIZE(result) && u_sess->attr.attr_sql.sql_compatibility == A_FORMAT)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_TEXT_P(result);
+}
+
+/* regexp_replace(source, pattern) */
+Datum regexp_replace_noopt(PG_FUNCTION_ARGS)
+{
+ return regexp_replace(fcinfo);
+}
+
+/* regexp_replace(source, pattern, replace_str, position) */
+Datum regexp_replace_position(PG_FUNCTION_ARGS)
+{
+ return regexp_replace(fcinfo);
+}
+
+/* regexp_replace(source, pattern, replace_str, position, occurrence) */
+Datum regexp_replace_occur(PG_FUNCTION_ARGS)
+{
+ return regexp_replace(fcinfo);
+}
+/* regexp_replace(source, pattern, replace_str, position, occurrence, flags) */
+Datum regexp_replace_matchopt(PG_FUNCTION_ARGS)
+{
+ return regexp_replace(fcinfo);
+}
+
/*
* textregexreplace_noopt()
* Return a string matched by a regular expression, with replacement.
@@ -518,6 +645,8 @@ Datum textregexreplace_noopt(PG_FUNCTION_ARGS)
text* r = NULL;
regex_t* re = NULL;
text* result = NULL;
+ int occurrence = 1;
+ int cflags = REG_ADVANCED;
if (PG_ARGISNULL(0))
PG_RETURN_NULL();
@@ -531,9 +660,17 @@ Datum textregexreplace_noopt(PG_FUNCTION_ARGS)
if (!PG_ARGISNULL(2))
r = PG_GETARG_TEXT_PP(2);
- re = RE_compile_and_cache(p, REG_ADVANCED, PG_GET_COLLATION());
+ if (REGEX_COMPAT_MODE)
+ cflags |= REG_NLSTOP;
- result = replace_text_regexp(s, (void*)re, r, false);
+ re = RE_compile_and_cache(p, cflags, PG_GET_COLLATION());
+
+ if (REGEX_COMPAT_MODE) {
+ /* replace all the occurrence matched in O/M compatible mode */
+ occurrence = 0;
+ }
+
+ result = replace_text_regexp(s, (void*)re, r, 1, occurrence);
if (VARHDRSZ == VARSIZE(result) && u_sess->attr.attr_sql.sql_compatibility == A_FORMAT)
PG_RETURN_NULL();
@@ -554,31 +691,40 @@ Datum textregexreplace(PG_FUNCTION_ARGS)
regex_t* re = NULL;
pg_re_flags flags;
text* result = NULL;
+ int occurrence = 1;
- if (PG_ARGISNULL(0))
+ if (PG_ARGISNULL(ARG_0))
PG_RETURN_NULL();
- s = PG_GETARG_TEXT_PP(0);
+ s = PG_GETARG_TEXT_PP(ARG_0);
- if (PG_ARGISNULL(1))
+ if (PG_ARGISNULL(ARG_1))
PG_RETURN_TEXT_P(s);
- p = PG_GETARG_TEXT_PP(1);
+ p = PG_GETARG_TEXT_PP(ARG_1);
- if (!PG_ARGISNULL(2))
- r = PG_GETARG_TEXT_PP(2);
+ if (!PG_ARGISNULL(ARG_2))
+ r = PG_GETARG_TEXT_PP(ARG_2);
- if (!PG_ARGISNULL(3)) {
- opt = PG_GETARG_TEXT_PP(3);
+ if (!PG_ARGISNULL(ARG_3)) {
+ opt = PG_GETARG_TEXT_PP(ARG_3);
parse_re_flags(&flags, opt);
} else {
+ if (REGEX_COMPAT_MODE) {
+ /* return null in O/M compatible mode */
+ PG_RETURN_NULL();
+ }
flags.glob = false;
flags.cflags = REG_ADVANCED;
}
+ if (flags.glob) {
+ occurrence = 0;
+ }
+
re = RE_compile_and_cache(p, flags.cflags, PG_GET_COLLATION());
- result = replace_text_regexp(s, (void*)re, r, flags.glob);
+ result = replace_text_regexp(s, (void*)re, r, 1, occurrence);
if (VARHDRSZ == VARSIZE(result) && u_sess->attr.attr_sql.sql_compatibility == A_FORMAT)
PG_RETURN_NULL();
@@ -707,6 +853,184 @@ Datum similar_escape(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(result);
}
+/* function prototype:
+ * regexp_count(src , pattern [, position [, flags ])
+ */
+Datum regexp_count(PG_FUNCTION_ARGS)
+{
+ text* src = NULL;
+ text* pattern = NULL;
+ int position = 1;
+ int count = 0;
+ pg_re_flags re_flags;
+ bool has_null = false;
+
+ /* source string */
+ if (!PG_ARGISNULL(ARG_0))
+ src = PG_GETARG_TEXT_P_COPY(ARG_0);
+
+ /* pattern string */
+ if (!PG_ARGISNULL(ARG_1))
+ pattern = PG_GETARG_TEXT_PP(ARG_1);
+
+ regexp_check_args(fcinfo, &position, 1, ARG_2, &has_null);
+ regexp_get_re_flags(fcinfo, &re_flags, ARG_3);
+
+ if (src == NULL || pattern == NULL || has_null) {
+ PG_RETURN_NULL();
+ }
+
+ re_flags.glob = true;
+ regexp_matches_ctx* matchctx = setup_regexp_matches(src, pattern, &re_flags,
+ PG_GET_COLLATION(), false, false, position - 1);
+ count = matchctx->nmatches;
+
+ /* release space to avoid intraquery memory leak */
+ cleanup_regexp_matches(matchctx);
+ PG_RETURN_INT32(count);
+}
+
+Datum regexp_count_noopt(PG_FUNCTION_ARGS)
+{
+ return regexp_count(fcinfo);
+}
+
+Datum regexp_count_position(PG_FUNCTION_ARGS)
+{
+ return regexp_count(fcinfo);
+}
+
+Datum regexp_count_matchopt(PG_FUNCTION_ARGS)
+{
+ return regexp_count(fcinfo);
+}
+
+Datum regexp_instr_core(text* src, text* pattern, int position,
+ int occurrence, int return_opt,
+ pg_re_flags* re_flags, Oid collation)
+{
+ int start = 0;
+ int end = 0;
+ int index = 0;
+ int start_search = position - 1;
+
+ /* convert string to pg_wchar form for matching */
+ int len = VARSIZE_ANY_EXHDR(src);
+
+ pg_wchar* wide_str = (pg_wchar*)palloc(sizeof(pg_wchar) * (len + 1));
+ int wide_len = pg_mb2wchar_with_len(VARDATA_ANY(src), wide_str, len);
+ if (position > wide_len) {
+ PG_RETURN_INT32(0);
+ }
+ /* set up the compiled pattern */
+ regex_t* cpattern = RE_compile_and_cache(pattern, re_flags->cflags, collation);
+
+ /* temporary output space for RE package */
+ regmatch_t* pmatch = (regmatch_t*)palloc(sizeof(regmatch_t));
+
+ /* search for the pattern, perhaps repeatedly */
+ while (index < occurrence && RE_wchar_execute(cpattern, wide_str, wide_len,
+ start_search, 1, pmatch)) {
+ start = pmatch[0].rm_so;
+ end = pmatch[0].rm_eo;
+
+ /*
+ * Advance search position. Normally we start the next search at the
+ * end of the previous match; but if the match was of zero length, we
+ * have to advance by one character, or we'd just find the same match
+ * again.
+ */
+ start_search = end;
+ index++;
+ if (pmatch[0].rm_so == pmatch[0].rm_eo)
+ start_search++;
+ if (start_search > wide_len)
+ break;
+ }
+
+ /* Clean up temp storage */
+ pfree_ext(wide_str);
+ pfree_ext(pmatch);
+
+ /* return 0 if we do not find the specified occurrence */
+ if (index < occurrence) {
+ PG_RETURN_INT32(0);
+ }
+ /* or we return the matched occurrence start or end index (start from 1)
+ * counting from the beginning of the origin string
+ */
+ if (return_opt == 0) {
+ PG_RETURN_INT32(start + 1);
+ } else {
+ PG_RETURN_INT32(end + 1);
+ }
+}
+
+/* function prototype:
+ * regexp_instr(src,
+ pattern
+ [, position
+ [, occurrence
+ [, return_opt
+ [, match_opt]]]])
+ */
+Datum regexp_instr(PG_FUNCTION_ARGS)
+{
+ text* src = NULL;
+ text* pattern = NULL;
+ int position = 1;
+ int occurrence = 1;
+ int return_opt = 0;
+ pg_re_flags re_flags;
+ bool has_null = false;
+
+ if (!PG_ARGISNULL(ARG_0))
+ src = PG_GETARG_TEXT_PP(ARG_0);
+
+ if (!PG_ARGISNULL(ARG_1))
+ pattern = PG_GETARG_TEXT_PP(ARG_1);
+
+ regexp_check_args(fcinfo, &position, 1, ARG_2, &has_null);
+ regexp_check_args(fcinfo, &occurrence, 1, ARG_3, &has_null);
+ /* return option:
+ * 0: returns the position of the first character of the occurrence. (default)
+ * non-0: returns the position of the character following the occurrence.
+ */
+ regexp_check_args(fcinfo, &return_opt, 0, ARG_4, &has_null);
+ regexp_get_re_flags(fcinfo, &re_flags, ARG_5);
+
+ if (pattern == NULL || src == NULL || VARSIZE_ANY_EXHDR(src) == 0 || has_null)
+ PG_RETURN_NULL();
+
+ return regexp_instr_core(src, pattern, position, occurrence, return_opt,
+ &re_flags, PG_GET_COLLATION());
+}
+
+Datum regexp_instr_noopt(PG_FUNCTION_ARGS)
+{
+ return regexp_instr(fcinfo);
+}
+
+Datum regexp_instr_position(PG_FUNCTION_ARGS)
+{
+ return regexp_instr(fcinfo);
+}
+
+Datum regexp_instr_occurren(PG_FUNCTION_ARGS)
+{
+ return regexp_instr(fcinfo);
+}
+
+Datum regexp_instr_returnopt(PG_FUNCTION_ARGS)
+{
+ return regexp_instr(fcinfo);
+}
+
+Datum regexp_instr_matchopt(PG_FUNCTION_ARGS)
+{
+ return regexp_instr(fcinfo);
+}
+
/*
* regexp_matches()
* Return a table of matches of a pattern within a string.
@@ -719,14 +1043,19 @@ Datum regexp_matches(PG_FUNCTION_ARGS)
if (SRF_IS_FIRSTCALL()) {
text* pattern = PG_GETARG_TEXT_PP(1);
text* flags = PG_GETARG_TEXT_PP_IF_EXISTS(2);
+ pg_re_flags re_flags;
MemoryContext oldcontext;
funcctx = SRF_FIRSTCALL_INIT();
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+
/* be sure to copy the input string into the multi-call ctx */
matchctx =
- setup_regexp_matches(PG_GETARG_TEXT_P_COPY(0), pattern, flags, PG_GET_COLLATION(), false, true, false);
+ setup_regexp_matches(PG_GETARG_TEXT_P_COPY(0), pattern, &re_flags,
+ PG_GET_COLLATION(), true, false, 0);
/* Pre-create workspace that build_regexp_matches_result needs */
matchctx->elems = (Datum*)palloc(sizeof(Datum) * matchctx->npatterns);
@@ -771,21 +1100,23 @@ Datum regexp_matches_no_flags(PG_FUNCTION_ARGS)
* but it seems clearer to distinguish the functionality this way than to
* key it all off one "is_split" flag.
*/
-static regexp_matches_ctx* setup_regexp_matches(text* orig_str, text* pattern, text* flags, Oid collation,
- bool force_glob, bool use_subpatterns, bool ignore_degenerate)
+static regexp_matches_ctx* setup_regexp_matches(text* orig_str, text* pattern,
+ pg_re_flags *re_flags,
+ Oid collation,
+ bool use_subpatterns,
+ bool ignore_degenerate,
+ int start_search)
{
regexp_matches_ctx* matchctx = (regexp_matches_ctx*)palloc0(sizeof(regexp_matches_ctx));
int orig_len;
pg_wchar* wide_str = NULL;
int wide_len;
- pg_re_flags re_flags;
regex_t* cpattern = NULL;
regmatch_t* pmatch = NULL;
int pmatch_len;
int array_len;
int array_idx;
int prev_match_end;
- int start_search;
/* save original string --- we'll extract result substrings from it */
matchctx->orig_str = orig_str;
@@ -795,19 +1126,8 @@ static regexp_matches_ctx* setup_regexp_matches(text* orig_str, text* pattern, t
wide_str = (pg_wchar*)palloc(sizeof(pg_wchar) * (orig_len + 1));
wide_len = pg_mb2wchar_with_len(VARDATA_ANY(orig_str), wide_str, orig_len);
- /* determine options */
- parse_re_flags(&re_flags, flags);
- if (force_glob) {
- /* user mustn't specify 'g' for regexp_split */
- if (re_flags.glob)
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("regexp_split does not support the global option")));
- /* but we find all the matches anyway */
- re_flags.glob = true;
- }
-
/* set up the compiled pattern */
- cpattern = RE_compile_and_cache(pattern, re_flags.cflags, collation);
+ cpattern = RE_compile_and_cache(pattern, re_flags->cflags, collation);
/* do we want to remember subpatterns? */
if (use_subpatterns && cpattern->re_nsub > 0) {
@@ -823,13 +1143,12 @@ static regexp_matches_ctx* setup_regexp_matches(text* orig_str, text* pattern, t
pmatch = (regmatch_t*)palloc(sizeof(regmatch_t) * pmatch_len);
/* the real output space (grown dynamically if needed) */
- array_len = re_flags.glob ? 256 : 32;
+ array_len = re_flags->glob ? 256 : 32;
matchctx->match_locs = (int*)palloc(sizeof(int) * array_len);
array_idx = 0;
/* search for the pattern, perhaps repeatedly */
prev_match_end = 0;
- start_search = 0;
while (RE_wchar_execute(cpattern, wide_str, wide_len, start_search, pmatch_len, pmatch)) {
/*
* If requested, ignore degenerate matches, which are zero-length
@@ -860,7 +1179,7 @@ static regexp_matches_ctx* setup_regexp_matches(text* orig_str, text* pattern, t
prev_match_end = pmatch[0].rm_eo;
/* if not glob, stop after one match */
- if (!re_flags.glob)
+ if (!re_flags->glob)
break;
/*
@@ -935,7 +1254,7 @@ static ArrayType* build_regexp_matches_result(regexp_matches_ctx* matchctx)
/* return value datatype must be text */
#define RESET_NULL_FLAG(_result) \
do { \
- if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT && !RETURN_NS) { \
+ if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT && !RETURN_NS) { \
if ((_result) == ((Datum)0)) { \
fcinfo->isnull = true; \
} else { \
@@ -962,14 +1281,26 @@ Datum regexp_split_to_table(PG_FUNCTION_ARGS)
if (SRF_IS_FIRSTCALL()) {
text* pattern = PG_GETARG_TEXT_PP(1);
text* flags = PG_GETARG_TEXT_PP_IF_EXISTS(2);
+ pg_re_flags re_flags;
MemoryContext oldcontext;
funcctx = SRF_FIRSTCALL_INIT();
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+ /* User mustn't specify 'g' */
+ if (re_flags.glob) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("regexp_split does not support the global option")));
+ }
+ /* But we find all the matches anyway */
+ re_flags.glob = true;
+
/* be sure to copy the input string into the multi-call ctx */
- splitctx =
- setup_regexp_matches(PG_GETARG_TEXT_P_COPY(0), pattern, flags, PG_GET_COLLATION(), true, false, true);
+ splitctx = setup_regexp_matches(PG_GETARG_TEXT_P_COPY(0), pattern, &re_flags,
+ PG_GET_COLLATION(), false, true, 0);
MemoryContextSwitchTo(oldcontext);
funcctx->user_fctx = (void*)splitctx;
@@ -1007,14 +1338,27 @@ Datum regexp_split_to_array(PG_FUNCTION_ARGS)
{
ArrayBuildState* astate = NULL;
regexp_matches_ctx* splitctx = NULL;
+ text* flags = PG_GETARG_TEXT_PP_IF_EXISTS(2);
+ pg_re_flags re_flags;
+
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
+ /* User mustn't specify 'g' */
+ if (re_flags.glob) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("regexp_split does not support the global option")));
+ }
+ /* But we find all the matches anyway */
+ re_flags.glob = true;
splitctx = setup_regexp_matches(PG_GETARG_TEXT_PP(0),
PG_GETARG_TEXT_PP(1),
- PG_GETARG_TEXT_PP_IF_EXISTS(2),
+ &re_flags,
PG_GET_COLLATION(),
- true,
false,
- true);
+ true,
+ 0);
while (splitctx->next_match <= splitctx->nmatches) {
astate = accumArrayResult(astate, build_regexp_split_result(splitctx), false, TEXTOID, CurrentMemoryContext);
@@ -1034,14 +1378,19 @@ Datum regexp_match_to_array(PG_FUNCTION_ARGS)
{
regexp_matches_ctx* splitctx = NULL;
ArrayType* rs = NULL;
+ text* flags = PG_GETARG_TEXT_PP_IF_EXISTS(2);
+ pg_re_flags re_flags;
+
+ /* Determine options */
+ parse_re_flags(&re_flags, flags);
splitctx = setup_regexp_matches(PG_GETARG_TEXT_PP(0),
PG_GETARG_TEXT_PP(1),
- PG_GETARG_TEXT_PP_IF_EXISTS(2),
+ &re_flags,
PG_GET_COLLATION(),
- false,
true,
- false);
+ false,
+ 0);
if (splitctx->nmatches > 0) {
splitctx->elems = (Datum*)palloc(sizeof(Datum) * splitctx->npatterns);
@@ -1156,17 +1505,36 @@ char* regexp_fixed_prefix(text* text_re, bool case_insensitive, Oid collation, b
return result;
}
+
+static void regexp_get_match_position(regmatch_t *pmatch, size_t nsize, regex_t* re,
+ int *so, int *eo)
+{
+ if (u_sess->attr.attr_sql.enforce_a_behavior || re->re_nsub <= 0) {
+ /* no parenthesized subexpression, use whole match */
+ *so = pmatch[0].rm_so;
+ *eo = pmatch[0].rm_eo;
+ } else {
+ /* has parenthesized subexpressions, use the first one */
+ *so = pmatch[1].rm_so;
+ *eo = pmatch[1].rm_eo;
+ }
+}
+
Datum textregexsubstr_enforce_a(PG_FUNCTION_ARGS)
{
text* s = PG_GETARG_TEXT_PP(0);
text* p = PG_GETARG_TEXT_PP(1);
+ int cflags = REG_ADVANCED;
regex_t* re = NULL;
regmatch_t pmatch[2];
int so = 0;
int eo = 0;
/* Compile RE */
- re = RE_compile_and_cache(p, REG_ADVANCED, PG_GET_COLLATION());
+ if (REGEX_COMPAT_MODE) {
+ cflags |= REG_NLSTOP;
+ }
+ re = RE_compile_and_cache(p, cflags, PG_GET_COLLATION());
if (!RE_execute(re, VARDATA_ANY(s), VARSIZE_ANY_EXHDR(s), 2, pmatch))
PG_RETURN_NULL(); /* definitely no match */
@@ -1174,20 +1542,7 @@ Datum textregexsubstr_enforce_a(PG_FUNCTION_ARGS)
// for adaptting A db's match rules, enforce_a_behavior must be true,
// and use all-subexpression matches default. but the POSIX match rules
// reserved for extension.
- if (true == u_sess->attr.attr_sql.enforce_a_behavior) {
- so = pmatch[0].rm_so;
- eo = pmatch[0].rm_eo;
- } else {
- if (re->re_nsub > 0) {
- /* has parenthesized subexpressions, use the first one */
- so = pmatch[1].rm_so;
- eo = pmatch[1].rm_eo;
- } else {
- /* no parenthesized subexpression, use whole match */
- so = pmatch[0].rm_so;
- eo = pmatch[0].rm_eo;
- }
- }
+ regexp_get_match_position(pmatch, sizeof(pmatch) / sizeof(regmatch_t), re, &so, &eo);
/*
* It is possible to have a match to the whole pattern but no match
@@ -1201,3 +1556,128 @@ Datum textregexsubstr_enforce_a(PG_FUNCTION_ARGS)
return DirectFunctionCall3(text_substr, PointerGetDatum(s), Int32GetDatum(so + 1), Int32GetDatum(eo - so));
}
+
+text* regexp_substr_get_occurrence(text* src, text* pattern,
+ pg_re_flags* re_flags,
+ int position,
+ int occurrence,
+ Oid collation)
+{
+ regex_t* re = NULL;
+ int so = 0;
+ int eo = 0;
+ pg_wchar* data = NULL;
+ int src_len = VARSIZE_ANY_EXHDR(src);
+ size_t data_len;
+ int search_start = position - 1;
+ int count = 0;
+ regmatch_t pmatch[2];
+ text* result = NULL;
+
+ /* Compile RE */
+ re = RE_compile_and_cache(pattern, re_flags->cflags, collation);
+
+ /* Convert data string to wide characters. */
+ data = (pg_wchar*)palloc((src_len + 1) * sizeof(pg_wchar));
+ data_len = pg_mb2wchar_with_len(VARDATA_ANY(src), data, src_len);
+
+ while ((unsigned int)(search_start) <= data_len) {
+ int regexec_result;
+
+ CHECK_FOR_INTERRUPTS();
+
+ regexec_result = pg_regexec(re,
+ data,
+ data_len,
+ search_start,
+ NULL, /* no details */
+ sizeof(pmatch) / sizeof(regmatch_t),
+ pmatch,
+ 0);
+
+ if (regexec_result == REG_NOMATCH)
+ break;
+
+ if (regexec_result != REG_OKAY) {
+ char errMsg[100];
+
+ pg_regerror(regexec_result, re, errMsg, sizeof(errMsg));
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
+ errmsg("regular expression failed: %s", errMsg)));
+ }
+
+ count++;
+
+ regexp_get_match_position(pmatch, sizeof(pmatch) / sizeof(regmatch_t), re, &so, &eo);
+
+ if (so < 0 || eo < 0) {
+ break;
+ }
+
+ if (count == occurrence) {
+ result = text_substring(PointerGetDatum(src),
+ so + 1,
+ eo - so,
+ false);
+ break;
+ }
+
+ if (so == eo) {
+ search_start++;
+ } else {
+ search_start = eo;
+ }
+ }
+
+ pfree_ext(data);
+ return result;
+}
+
+Datum regexp_substr_core(PG_FUNCTION_ARGS)
+{
+ text* pattern = NULL;
+ int position = 1;
+ int occurrence = 1;
+ pg_re_flags re_flags;
+ text* src = NULL;
+ bool has_null = false;
+
+ if (!PG_ARGISNULL(ARG_0))
+ src = PG_GETARG_TEXT_PP(ARG_0);
+
+ if (!PG_ARGISNULL(ARG_1))
+ pattern = PG_GETARG_TEXT_PP(ARG_1);
+
+ regexp_check_args(fcinfo, &position, 1, ARG_2, &has_null);
+ regexp_check_args(fcinfo, &occurrence, 1, ARG_3, &has_null);
+ regexp_get_re_flags(fcinfo, &re_flags, ARG_4);
+
+ if (pattern == NULL || src == NULL || VARSIZE_ANY_EXHDR(src) == 0 || has_null)
+ PG_RETURN_NULL();
+
+ text* ret = regexp_substr_get_occurrence(src, pattern, &re_flags, position, occurrence,
+ PG_GET_COLLATION());
+
+ if (ret == NULL || (VARHDRSZ == VARSIZE(ret) &&
+ u_sess->attr.attr_sql.sql_compatibility == A_FORMAT)) {
+ PG_RETURN_NULL();
+ } else {
+ PG_RETURN_TEXT_P(ret);
+ }
+}
+
+Datum regexp_substr_with_position(PG_FUNCTION_ARGS)
+{
+ return regexp_substr_core(fcinfo);
+}
+
+Datum regexp_substr_with_occur(PG_FUNCTION_ARGS)
+{
+ return regexp_substr_core(fcinfo);
+}
+
+Datum regexp_substr_with_opt(PG_FUNCTION_ARGS)
+{
+ return regexp_substr_core(fcinfo);
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/adt/ri_triggers.cpp b/src/common/backend/utils/adt/ri_triggers.cpp
index 3ca3ce7ad..6bccb2048 100644
--- a/src/common/backend/utils/adt/ri_triggers.cpp
+++ b/src/common/backend/utils/adt/ri_triggers.cpp
@@ -336,7 +336,7 @@ static Datum RI_FKey_check(PG_FUNCTION_ARGS)
quoteRelationName(pkrelname, pk_rel);
rc = snprintf_s(querystr, sizeof(querystr), sizeof(querystr) - 1,
- IsShareLockForForeignKey(trigdata->tg_relation) ? "SELECT 1 FROM ONLY %s x FOR SHARE OF x" :
+ IsShareLockForForeignKey(pk_rel) ? "SELECT 1 FROM ONLY %s x FOR SHARE OF x" :
"SELECT 1 FROM ONLY %s x FOR KEY SHARE OF x", pkrelname);
securec_check_ss(rc, "\0", "\0");
@@ -476,7 +476,7 @@ static Datum RI_FKey_check(PG_FUNCTION_ARGS)
queryoids[i] = fk_type;
}
- appendStringInfo(&querybuf, IsShareLockForForeignKey(trigdata->tg_relation) ? " FOR SHARE OF x" :
+ appendStringInfo(&querybuf, IsShareLockForForeignKey(pk_rel) ? " FOR SHARE OF x" :
" FOR KEY SHARE OF x");
/* Prepare and save the plan */
@@ -798,7 +798,7 @@ Datum RI_FKey_noaction(PG_FUNCTION_ARGS)
queryoids[i] = pk_type;
}
- appendStringInfo(&querybuf, IsShareLockForForeignKey(trigdata->tg_relation) ?
+ appendStringInfo(&querybuf, IsShareLockForForeignKey(fk_rel) ?
" FOR SHARE OF x" : " FOR KEY SHARE OF x");
/* Prepare and save the plan */
@@ -1335,7 +1335,7 @@ Datum RI_FKey_restrict(PG_FUNCTION_ARGS)
queryoids[i] = pk_type;
}
- appendStringInfo(&querybuf, IsShareLockForForeignKey(trigdata->tg_relation) ?
+ appendStringInfo(&querybuf, IsShareLockForForeignKey(fk_rel) ?
" FOR SHARE OF x" : " FOR KEY SHARE OF x");
/* Prepare and save the plan */
diff --git a/src/common/backend/utils/adt/ruleutils.cpp b/src/common/backend/utils/adt/ruleutils.cpp
index c5c2531c4..61a5d376d 100644
--- a/src/common/backend/utils/adt/ruleutils.cpp
+++ b/src/common/backend/utils/adt/ruleutils.cpp
@@ -123,6 +123,8 @@
#define MAXFLOATWIDTH 64
#define MAXDOUBLEWIDTH 128
+#define atooid(x) ((Oid)strtoul((x), NULL, 10))
+
/* ----------
* Local data types
* ----------
@@ -146,6 +148,7 @@ typedef struct {
bool qrw_phase; /* for qrw phase, we support more deparse rule */
bool viewdef; /* just for dump viewdef */
bool is_fqs; /* just for fqs query */
+ bool is_upsert_clause; /* just for upsert clause */
} deparse_context;
/*
@@ -203,6 +206,15 @@ typedef struct tableInfo {
char* relname;
} tableInfo;
+typedef struct SubpartitionInfo {
+ bool issubpartition;
+ char subparttype; /* subpartition type, 'r'/'l'/'h' */
+ Oid subparentid;
+ Oid subpartkeytype; /* the typeid of subpartkey */
+ AttrNumber attnum; /* the attribute number of subpartkey in the relation */
+ bool istypestring;
+} SubpartitionInfo;
+
/* ----------
* Local functions
*
@@ -220,9 +232,9 @@ static char* pg_get_triggerdef_worker(Oid trigid, bool pretty);
static void decompile_column_index_array(Datum column_index_array, Oid relId, StringInfo buf);
static char* pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
static char *pg_get_indexdef_worker(Oid indexrelid, int colno, const Oid *excludeOps, bool attrsOnly, bool showTblSpc,
- int prettyFlags, bool dumpSchemaOnly = false);
+ int prettyFlags, bool dumpSchemaOnly = false, bool showSubpartitionLocal = true);
static void pg_get_indexdef_partitions(Oid indexrelid, Form_pg_index idxrec, bool showTblSpc, StringInfoData *buf,
- bool dumpSchemaOnly);
+ bool dumpSchemaOnly, bool showSubpartitionLocal);
static char* pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, int prettyFlags);
static text* pg_get_expr_worker(text* expr, Oid relid, const char* relname, int prettyFlags);
static int print_function_arguments(StringInfo buf, HeapTuple proctup, bool print_table_args, bool print_defaults);
@@ -290,7 +302,7 @@ static void get_sublink_expr(SubLink* sublink, deparse_context* context);
static void get_from_clause(Query* query, const char* prefix, deparse_context* context, List* fromlist = NIL);
static void get_from_clause_item(Node* jtnode, Query* query, deparse_context* context);
static void get_from_clause_partition(RangeTblEntry* rte, StringInfo buf, deparse_context* context);
-static void get_from_clause_subpartition(RangeTblEntry* rte, StringInfo buf);
+static void get_from_clause_subpartition(RangeTblEntry* rte, StringInfo buf, deparse_context* context);
static void get_from_clause_bucket(RangeTblEntry* rte, StringInfo buf, deparse_context* context);
static void get_from_clause_alias(Alias* alias, RangeTblEntry* rte, deparse_context* context);
static void get_from_clause_coldeflist(
@@ -310,14 +322,15 @@ static char* flatten_reloptions(Oid relid);
static Oid SearchSysTable(const char* query);
static void replace_cl_types_in_argtypes(Oid func_id, int numargs, Oid* argtypes, bool *is_client_logic);
+static void AppendSubPartitionByInfo(StringInfo buf, Oid tableoid, SubpartitionInfo *subpartinfo);
+static void AppendSubPartitionDetail(StringInfo buf, tableInfo tableinfo, SubpartitionInfo *subpartinfo);
static void AppendRangeIntervalPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tableinfo, int partkeynum,
- Oid *iPartboundary);
+ Oid *iPartboundary, SubpartitionInfo *subpartinfo);
static void AppendListPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tableinfo, int partkeynum,
- Oid *iPartboundary);
+ Oid *iPartboundary, SubpartitionInfo *subpartinfo);
static void AppendHashPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tableinfo, int partkeynum,
- Oid *iPartboundary);
+ Oid *iPartboundary, SubpartitionInfo *subpartinfo);
static void AppendTablespaceInfo(const char *spcname, StringInfo buf, tableInfo tableinfo);
-static char *FormatListPartitioninfo(char *pvalue, bool isString);
/* from pgxcship */
Var* get_var_from_node(Node* node, bool (*func)(Oid) = func_oid_check_reject);
@@ -952,11 +965,26 @@ static void get_table_partitiondef(StringInfo query, StringInfo buf, Oid tableoi
SysScanDesc scan = NULL;
HeapTuple tuple = NULL;
char relkind = RELKIND_RELATION; /* set default */
- char partype = PART_STRATEGY_VALUE; /* set default */
+ char partstrategy = PART_STRATEGY_VALUE; /* set default */
+ char parttype = PARTTYPE_NON_PARTITIONED_RELATION; /* set default */
int partkeynum = 0;
Oid* iPartboundary = NULL;
Form_pg_partition partition = NULL;
+ HeapTuple ctuple = SearchSysCache1(RELOID, ObjectIdGetDatum(tableoid));
+ if (!HeapTupleIsValid(ctuple)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_CACHE_LOOKUP_FAILED),
+ errmsg("cache lookup failed for relid %u", tableoid)));
+ }
+ Form_pg_class reltuple = (Form_pg_class)GETSTRUCT(ctuple);
+ parttype = reltuple->parttype;
+ ReleaseSysCache(ctuple);
+
+ if (parttype == PARTTYPE_NON_PARTITIONED_RELATION) {
+ return;
+ }
+
relation = heap_open(PartitionRelationId, AccessShareLock);
ScanKeyInit(&key[0], Anum_pg_partition_parttype, BTEqualStrategyNumber, F_CHAREQ, CharGetDatum(relkind));
@@ -973,7 +1001,7 @@ static void get_table_partitiondef(StringInfo query, StringInfo buf, Oid tableoi
if (tableinfo.relkind == RELKIND_FOREIGN_TABLE || tableinfo.relkind == RELKIND_STREAM) {
appendStringInfo(buf, "PARTITION BY (");
} else {
- partype = partition->partstrategy;
+ partstrategy = partition->partstrategy;
switch (partition->partstrategy) {
case PART_STRATEGY_RANGE:
case PART_STRATEGY_INTERVAL:
@@ -1012,6 +1040,7 @@ static void get_table_partitiondef(StringInfo query, StringInfo buf, Oid tableoi
}
firstFlag = false;
appendStringInfo(buf, "%s", quote_identifier(attname));
+ pfree_ext(attname);
}
}
appendStringInfo(buf, ")");
@@ -1019,7 +1048,7 @@ static void get_table_partitiondef(StringInfo query, StringInfo buf, Oid tableoi
systable_endscan(scan);
heap_close(relation, AccessShareLock);
- if (partype == PART_STRATEGY_INTERVAL) {
+ if (partstrategy == PART_STRATEGY_INTERVAL) {
resetStringInfo(query);
appendStringInfo(query,
"SELECT p.interval[1] AS interval FROM pg_partition p "
@@ -1034,33 +1063,200 @@ static void get_table_partitiondef(StringInfo query, StringInfo buf, Oid tableoi
appendStringInfo(buf, "\nINTERVAL ('%s')", ivalue);
}
- if (partype == PART_STRATEGY_RANGE || partype == PART_STRATEGY_INTERVAL) {
- AppendRangeIntervalPartitionInfo(buf, tableoid, tableinfo, partkeynum, iPartboundary);
- } else if (partype == PART_STRATEGY_LIST) {
- AppendListPartitionInfo(buf, tableoid, tableinfo, partkeynum, iPartboundary);
- } else if (partype == PART_STRATEGY_HASH) {
- AppendHashPartitionInfo(buf, tableoid, tableinfo, partkeynum, iPartboundary);
- } else { /* If partype is 'value' or other type, no slice info */
+ SubpartitionInfo *subpartinfo = (SubpartitionInfo *)palloc0(sizeof(SubpartitionInfo));
+ if (parttype == PARTTYPE_SUBPARTITIONED_RELATION) {
+ AppendSubPartitionByInfo(buf, tableoid, subpartinfo);
+ }
+
+ if (partstrategy == PART_STRATEGY_RANGE || partstrategy == PART_STRATEGY_INTERVAL) {
+ AppendRangeIntervalPartitionInfo(buf, tableoid, tableinfo, partkeynum, iPartboundary, subpartinfo);
+ } else if (partstrategy == PART_STRATEGY_LIST) {
+ AppendListPartitionInfo(buf, tableoid, tableinfo, partkeynum, iPartboundary, subpartinfo);
+ } else if (partstrategy == PART_STRATEGY_HASH) {
+ AppendHashPartitionInfo(buf, tableoid, tableinfo, partkeynum, iPartboundary, subpartinfo);
+ } else { /* If partstrategy is 'value' or other type, no slice info */
+ pfree_ext(iPartboundary);
+ pfree_ext(subpartinfo);
return;
}
if (tableinfo.relrowmovement) {
appendStringInfo(buf, "\n%s", "ENABLE ROW MOVEMENT");
}
+ pfree_ext(iPartboundary);
+ pfree_ext(subpartinfo);
+}
+
+static void AppendSubPartitionByInfo(StringInfo buf, Oid tableoid, SubpartitionInfo *subpartinfo)
+{
+ Relation partrel = NULL;
+ ScanKeyData key[2];
+ SysScanDesc scan = NULL;
+ HeapTuple parttuple = NULL;
+ ScanKeyData subkey[2];
+ SysScanDesc subscan = NULL;
+ HeapTuple subparttuple = NULL;
+ bool isnull = false;
+
+ partrel = heap_open(PartitionRelationId, AccessShareLock);
+ ScanKeyInit(&key[0], Anum_pg_partition_parttype, BTEqualStrategyNumber, F_CHAREQ,
+ CharGetDatum(PARTTYPE_PARTITIONED_RELATION));
+ ScanKeyInit(&key[1], Anum_pg_partition_parentid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(tableoid));
+ scan = systable_beginscan(partrel, PartitionParentOidIndexId, true, NULL, 2, key);
+ parttuple = systable_getnext(scan);
+
+ if (!HeapTupleIsValid(parttuple)) {
+ systable_endscan(scan);
+ heap_close(partrel, AccessShareLock);
+ ereport(ERROR, (errcode(ERRCODE_CACHE_LOOKUP_FAILED),
+ errmsg("could not find partition tuple for subpartition relation %u", tableoid)));
+ }
+
+ Datum datum = SysCacheGetAttr(PARTRELID, parttuple, Anum_pg_partition_partkey, &isnull);
+ Assert(!isnull);
+ int2vector *partVec = (int2vector *)DatumGetPointer(datum);
+ int partkeynum = partVec->dim1;
+ if (partkeynum != 1) {
+ systable_endscan(scan);
+ heap_close(partrel, AccessShareLock);
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("only support one partkey in subpartition table")));
+ }
+ char *attname = get_attname(tableoid, partVec->values[0]);
+ Oid subparentid = HeapTupleGetOid(parttuple);
+
+ ScanKeyInit(&subkey[0], Anum_pg_partition_parttype, BTEqualStrategyNumber, F_CHAREQ,
+ CharGetDatum(PARTTYPE_SUBPARTITIONED_RELATION));
+ ScanKeyInit(&subkey[1], Anum_pg_partition_parentid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(subparentid));
+ subscan = systable_beginscan(partrel, PartitionParentOidIndexId, true, NULL, 2, subkey);
+ subparttuple = systable_getnext(subscan);
+
+ if (!HeapTupleIsValid(subparttuple)) {
+ systable_endscan(scan);
+ systable_endscan(subscan);
+ heap_close(partrel, AccessShareLock);
+ ereport(ERROR, (errcode(ERRCODE_CACHE_LOOKUP_FAILED),
+ errmsg("could not find subpartition tuple for subpartition relation %u", tableoid)));
+ }
+
+ Form_pg_partition part = (Form_pg_partition)GETSTRUCT(subparttuple);
+ switch (part->partstrategy) {
+ case PART_STRATEGY_RANGE:
+ appendStringInfo(buf, " SUBPARTITION BY RANGE (");
+ break;
+ case PART_STRATEGY_LIST:
+ /* restructure list partitioned table definition */
+ appendStringInfo(buf, " SUBPARTITION BY LIST (");
+ break;
+ case PART_STRATEGY_HASH:
+ /* restructure hash partitioned table definition */
+ appendStringInfo(buf, " SUBPARTITION BY HASH (");
+ break;
+ default:
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized subpartition type %c", part->partstrategy)));
+ }
+ appendStringInfo(buf, "%s", quote_identifier(attname));
+ appendStringInfo(buf, ")");
+ pfree_ext(attname);
+
+ subpartinfo->issubpartition = true;
+ subpartinfo->attnum = partVec->values[0];
+ subpartinfo->subparttype = part->partstrategy;
+ subpartinfo->subpartkeytype = get_atttype(tableoid, subpartinfo->attnum);
+ subpartinfo->istypestring = isTypeString(subpartinfo->subpartkeytype);
+
+ systable_endscan(scan);
+ systable_endscan(subscan);
+ heap_close(partrel, AccessShareLock);
+}
+
+static void AppendSubPartitionDetail(StringInfo buf, tableInfo tableinfo, SubpartitionInfo *subpartinfo)
+{
+ appendStringInfo(buf, "\n (");
+
+ StringInfo query = makeStringInfo();
+ appendStringInfo(query,
+ "SELECT /*+ hashjoin(p t) */ p.relname AS partName, "
+ "array_to_string(p.boundaries, ',') as partbound, "
+ "array_to_string(p.boundaries, ''',''') as partboundstr, "
+ "t.spcname AS reltblspc "
+ "FROM pg_partition p LEFT JOIN pg_tablespace t "
+ "ON p.reltablespace = t.oid "
+ "WHERE p.parentid = %u AND p.parttype = '%c' AND p.partstrategy = '%c' "
+ "ORDER BY p.boundaries[1]::%s ASC",
+ subpartinfo->subparentid, PART_OBJ_TYPE_TABLE_SUB_PARTITION, subpartinfo->subparttype,
+ get_typename(subpartinfo->subpartkeytype));
+
+ (void)SPI_execute(query->data, true, INT_MAX);
+ int proc = SPI_processed;
+ SPITupleTable *spitup = SPI_tuptable;
+ for (int i = 0; i < proc; i++) {
+ if (i > 0) {
+ appendStringInfo(buf, ",");
+ }
+ HeapTuple spi_tuple = spitup->vals[i];
+ TupleDesc spi_tupdesc = spitup->tupdesc;
+ char *pname = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partname"));
+ appendStringInfo(buf, "\n SUBPARTITION %s", quote_identifier(pname));
+
+ if (subpartinfo->subparttype == PART_STRATEGY_RANGE) {
+ appendStringInfo(buf, " VALUES LESS THAN (");
+ char *pvalue = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partbound"));
+ if (pvalue == NULL || strlen(pvalue) == 0) {
+ appendStringInfo(buf, "MAXVALUE");
+ } else if (subpartinfo->istypestring) {
+ char *svalue = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partboundstr"));
+ appendStringInfo(buf, "'%s'", svalue);
+ pfree_ext(svalue);
+ } else {
+ appendStringInfo(buf, "%s", pvalue);
+ }
+ appendStringInfo(buf, ")");
+ pfree_ext(pvalue);
+ } else if (subpartinfo->subparttype == PART_STRATEGY_LIST) {
+ appendStringInfo(buf, " VALUES (");
+ char *pvalue = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partbound"));
+ if (pvalue == NULL || strlen(pvalue) == 0) {
+ appendStringInfo(buf, "DEFAULT");
+ } else if (subpartinfo->istypestring) {
+ char *svalue = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partboundstr"));
+ appendStringInfo(buf, "'%s'", svalue);
+ pfree_ext(svalue);
+ } else {
+ appendStringInfo(buf, "%s", pvalue);
+ }
+ appendStringInfo(buf, ")");
+ pfree_ext(pvalue);
+ }
+
+ /*
+ * Append partition tablespace.
+ * Skip it, if partition tablespace is the same as partitioned table.
+ */
+ int fno = SPI_fnumber(spi_tupdesc, "reltblspc");
+ const char *spcname = SPI_getvalue(spi_tuple, spi_tupdesc, fno);
+ AppendTablespaceInfo(spcname, buf, tableinfo);
+ }
+ DestroyStringInfo(query);
+
+ appendStringInfo(buf, "\n )");
}
static void AppendRangeIntervalPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tableinfo, int partkeynum,
- Oid *iPartboundary)
+ Oid *iPartboundary, SubpartitionInfo *subpartinfo)
{
appendStringInfo(buf, "\n( ");
/* get table partitions info */
StringInfo query = makeStringInfo();
- appendStringInfo(query, "SELECT /*+ hashjoin(p t) */p.relname AS partName, ");
+ appendStringInfo(query, "SELECT /*+ hashjoin(p t) */p.relname AS partname, ");
for (int i = 1; i <= partkeynum; i++) {
appendStringInfo(query, "p.boundaries[%d] AS partboundary_%d, ", i, i);
}
appendStringInfo(query,
+ "p.oid AS partoid, "
"t.spcname AS reltblspc "
"FROM pg_partition p LEFT JOIN pg_tablespace t "
"ON p.reltablespace = t.oid "
@@ -1077,15 +1273,15 @@ static void AppendRangeIntervalPartitionInfo(StringInfo buf, Oid tableoid, table
(void)SPI_execute(query->data, true, INT_MAX);
int proc = SPI_processed;
+ SPITupleTable *spitup = SPI_tuptable;
for (int i = 0; i < proc; i++) {
if (i > 0) {
appendStringInfo(buf, ",");
}
- HeapTuple spi_tuple = SPI_tuptable->vals[i];
- TupleDesc spi_tupdesc = SPI_tuptable->tupdesc;
+ HeapTuple spi_tuple = spitup->vals[i];
+ TupleDesc spi_tupdesc = spitup->tupdesc;
char *pname = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partname"));
- appendStringInfo(buf, "\n ");
- appendStringInfo(buf, "PARTITION %s VALUES LESS THAN (", quote_identifier(pname));
+ appendStringInfo(buf, "\n PARTITION %s VALUES LESS THAN (", quote_identifier(pname));
for (int j = 0; j < partkeynum; j++) {
if (j > 0) {
@@ -1120,13 +1316,19 @@ static void AppendRangeIntervalPartitionInfo(StringInfo buf, Oid tableoid, table
int fno = SPI_fnumber(spi_tupdesc, "reltblspc");
const char *spcname = SPI_getvalue(spi_tuple, spi_tupdesc, fno);
AppendTablespaceInfo(spcname, buf, tableinfo);
+
+ if (subpartinfo->issubpartition) {
+ subpartinfo->subparentid =
+ atooid(SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partoid")));
+ AppendSubPartitionDetail(buf, tableinfo, subpartinfo);
+ }
}
DestroyStringInfo(query);
appendStringInfo(buf, "\n)");
}
static void AppendListPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tableinfo, int partkeynum,
- Oid *iPartboundary)
+ Oid *iPartboundary, SubpartitionInfo *subpartinfo)
{
appendStringInfo(buf, "\n( ");
@@ -1136,34 +1338,41 @@ static void AppendListPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tabl
/* get table partitions info */
StringInfo query = makeStringInfo();
appendStringInfo(query,
- "SELECT /*+ hashjoin(p t) */p.relname AS partName, "
- "p.boundaries AS partboundary, "
+ "SELECT /*+ hashjoin(p t) */p.relname AS partname, "
+ "array_to_string(p.boundaries, ',') as partbound, "
+ "array_to_string(p.boundaries, ''',''') as partboundstr, "
+ "p.oid AS partoid, "
"t.spcname AS reltblspc "
"FROM pg_partition p LEFT JOIN pg_tablespace t "
"ON p.reltablespace = t.oid "
"WHERE p.parentid = %u AND p.parttype = '%c' "
- "AND p.partstrategy = '%c' ORDER BY p.relname::text ASC",
- tableoid, PART_OBJ_TYPE_TABLE_PARTITION, PART_STRATEGY_LIST);
+ "AND p.partstrategy = '%c' ORDER BY p.boundaries[1]::%s ASC",
+ tableoid, PART_OBJ_TYPE_TABLE_PARTITION, PART_STRATEGY_LIST, get_typename(*iPartboundary));
(void)SPI_execute(query->data, true, INT_MAX);
int proc = SPI_processed;
+ SPITupleTable *spitup = SPI_tuptable;
for (int i = 0; i < proc; i++) {
if (i > 0) {
appendStringInfo(buf, ",");
}
- HeapTuple spi_tuple = SPI_tuptable->vals[i];
- TupleDesc spi_tupdesc = SPI_tuptable->tupdesc;
+ HeapTuple spi_tuple = spitup->vals[i];
+ TupleDesc spi_tupdesc = spitup->tupdesc;
char *pname = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partname"));
- appendStringInfo(buf, "\n ");
- appendStringInfo(buf, "PARTITION %s VALUES (", quote_identifier(pname));
+ appendStringInfo(buf, "\n PARTITION %s VALUES (", quote_identifier(pname));
- char *pvalue = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partboundary"));
- pvalue[strlen(pvalue) - 1] = '\0';
- char *fvalue = FormatListPartitioninfo(pvalue + 1, isTypeString(*iPartboundary));
- appendStringInfo(buf, "%s", fvalue);
+ char *pvalue = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partbound"));
+ if (pvalue == NULL || strlen(pvalue) == 0) {
+ appendStringInfo(buf, "DEFAULT");
+ } else if (isTypeString(*iPartboundary)) {
+ char *svalue = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partboundstr"));
+ appendStringInfo(buf, "'%s'", svalue);
+ pfree_ext(svalue);
+ } else {
+ appendStringInfo(buf, "%s", pvalue);
+ }
appendStringInfo(buf, ")");
pfree_ext(pvalue);
- pfree_ext(fvalue);
/*
* Append partition tablespace.
@@ -1172,6 +1381,12 @@ static void AppendListPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tabl
int fno = SPI_fnumber(spi_tupdesc, "reltblspc");
const char *spcname = SPI_getvalue(spi_tuple, spi_tupdesc, fno);
AppendTablespaceInfo(spcname, buf, tableinfo);
+
+ if (subpartinfo->issubpartition) {
+ subpartinfo->subparentid =
+ atooid(SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partoid")));
+ AppendSubPartitionDetail(buf, tableinfo, subpartinfo);
+ }
}
DestroyStringInfo(query);
@@ -1179,7 +1394,7 @@ static void AppendListPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tabl
}
static void AppendHashPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tableinfo, int partkeynum,
- Oid *iPartboundary)
+ Oid *iPartboundary, SubpartitionInfo *subpartinfo)
{
appendStringInfo(buf, "\n( ");
@@ -1189,8 +1404,9 @@ static void AppendHashPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tabl
/* get table partitions info */
StringInfo query = makeStringInfo();
appendStringInfo(query,
- "SELECT /*+ hashjoin(p t) */p.relname AS partName, "
+ "SELECT /*+ hashjoin(p t) */p.relname AS partname, "
"p.boundaries[1] AS partboundary, "
+ "p.oid AS partoid, "
"t.spcname AS reltblspc "
"FROM pg_partition p LEFT JOIN pg_tablespace t "
"ON p.reltablespace = t.oid "
@@ -1201,15 +1417,15 @@ static void AppendHashPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tabl
(void)SPI_execute(query->data, true, INT_MAX);
int proc = SPI_processed;
+ SPITupleTable *spitup = SPI_tuptable;
for (int i = 0; i < proc; i++) {
if (i > 0) {
appendStringInfo(buf, ",");
}
- HeapTuple spi_tuple = SPI_tuptable->vals[i];
- TupleDesc spi_tupdesc = SPI_tuptable->tupdesc;
+ HeapTuple spi_tuple = spitup->vals[i];
+ TupleDesc spi_tupdesc = spitup->tupdesc;
char *pname = SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partname"));
- appendStringInfo(buf, "\n ");
- appendStringInfo(buf, "PARTITION %s", quote_identifier(pname));
+ appendStringInfo(buf, "\n PARTITION %s", quote_identifier(pname));
/*
* Append partition tablespace.
@@ -1218,6 +1434,12 @@ static void AppendHashPartitionInfo(StringInfo buf, Oid tableoid, tableInfo tabl
int fno = SPI_fnumber(spi_tupdesc, "reltblspc");
const char *spcname = SPI_getvalue(spi_tuple, spi_tupdesc, fno);
AppendTablespaceInfo(spcname, buf, tableinfo);
+
+ if (subpartinfo->issubpartition) {
+ subpartinfo->subparentid =
+ atooid(SPI_getvalue(spi_tuple, spi_tupdesc, SPI_fnumber(spi_tupdesc, "partoid")));
+ AppendSubPartitionDetail(buf, tableinfo, subpartinfo);
+ }
}
DestroyStringInfo(query);
@@ -1233,32 +1455,6 @@ static void AppendTablespaceInfo(const char *spcname, StringInfo buf, tableInfo
}
}
-static char *FormatListPartitioninfo(char *pvalue, bool isString)
-{
- StringInfoData str;
- initStringInfo(&str);
-
- if (isString) {
- char *slicevalue = NULL;
- char *nextvalue = NULL;
- bool firstFlag = true;
-
- slicevalue = strtok_s(pvalue, ",", &nextvalue);
- while (slicevalue != NULL) {
- if (!firstFlag) {
- appendStringInfo(&str, ", ");
- }
- firstFlag = false;
- appendStringInfo(&str, "'%s'", slicevalue);
- slicevalue = strtok_s(NULL, ",", &nextvalue);
- }
- } else {
- appendBinaryStringInfo(&str, pvalue, strlen(pvalue));
- }
-
- return str.data;
-}
-
/*
* @Description: get collation's namespace oid by collation oid.
* @in colloid - collation oid.
@@ -1340,7 +1536,7 @@ static int get_table_attribute(
/* Format properly if not first attr */
actual_atts == 0 ? appendStringInfo(buf, " (") : appendStringInfo(buf, ",");
- appendStringInfo(buf, "\n ");
+ appendStringInfo(buf, "\n ");
actual_atts++;
/* Attribute name */
@@ -2692,6 +2888,7 @@ static char* pg_get_triggerdef_worker(Oid trigid, bool pretty)
context.wrapColumn = WRAP_COLUMN_DEFAULT;
context.indentLevel = PRETTYINDENT_STD;
context.qrw_phase = false;
+ context.is_upsert_clause = false;
get_rule_expr(qual, &context, false);
@@ -2762,7 +2959,8 @@ Datum pg_get_indexdef_for_dump(PG_FUNCTION_ARGS)
Oid indexrelid = PG_GETARG_OID(0);
bool dumpSchemaOnly = PG_GETARG_BOOL(1);
- PG_RETURN_TEXT_P(string_to_text(pg_get_indexdef_worker(indexrelid, 0, NULL, false, true, 0, dumpSchemaOnly)));
+ PG_RETURN_TEXT_P(string_to_text(pg_get_indexdef_worker(indexrelid, 0, NULL, false, true, 0, dumpSchemaOnly,
+ false)));
}
Datum pg_get_indexdef_ext(PG_FUNCTION_ARGS)
@@ -2773,7 +2971,8 @@ Datum pg_get_indexdef_ext(PG_FUNCTION_ARGS)
int prettyFlags;
prettyFlags = pretty ? (PRETTYFLAG_PAREN | PRETTYFLAG_INDENT) : 0;
- PG_RETURN_TEXT_P(string_to_text(pg_get_indexdef_worker(indexrelid, colno, NULL, colno != 0, true, prettyFlags)));
+ PG_RETURN_TEXT_P(string_to_text(pg_get_indexdef_worker(indexrelid, colno, NULL, colno != 0, true, prettyFlags,
+ false, false)));
}
/**
@@ -2797,7 +2996,7 @@ char* pg_get_indexdef_columns(Oid indexrelid, bool pretty)
}
static void AppendOnePartitionIndex(Oid indexRelId, Oid partOid, bool showTblSpc, bool *isFirst,
- StringInfoData *buf)
+ StringInfoData *buf, bool isSub = false)
{
Oid partIdxOid = getPartitionIndexOid(indexRelId, partOid);
@@ -2815,6 +3014,10 @@ static void AppendOnePartitionIndex(Oid indexRelId, Oid partOid, bool showTblSpc
appendStringInfo(buf, ", ");
}
+ if (isSub) {
+ appendStringInfo(buf, "\n ");
+ }
+
appendStringInfo(buf, "PARTITION %s", quote_identifier(partIdxTuple->relname.data));
if (showTblSpc && OidIsValid(partIdxTuple->reltablespace)) {
char *tblspacName = get_tablespace_name(partIdxTuple->reltablespace);
@@ -2848,7 +3051,7 @@ static void GetIndexdefForIntervalPartTabDumpSchemaOnly(Oid indexrelid, RangePar
}
static void pg_get_indexdef_partitions(Oid indexrelid, Form_pg_index idxrec, bool showTblSpc, StringInfoData *buf,
- bool dumpSchemaOnly)
+ bool dumpSchemaOnly, bool showSubpartitionLocal)
{
Oid relid = idxrec->indrelid;
/*
@@ -2863,8 +3066,13 @@ static void pg_get_indexdef_partitions(Oid indexrelid, Form_pg_index idxrec, boo
}
appendStringInfo(buf, " LOCAL");
- /* subpartition don't support creating index local on specifying partitions */
- if (RelationIsSubPartitioned(rel)) {
+ /*
+ * The LOCAL index information of the subpartition table is more.
+ * And the meta-statements (e.g. \d \d+ \dS) are used more.
+ * Therefore, when the meta-statement is called, the subpartition LOCAL index information is not displayed.
+ */
+ bool isSub = RelationIsSubPartitioned(rel);
+ if (isSub && !showSubpartitionLocal) {
heap_close(rel, NoLock);
return;
}
@@ -2872,18 +3080,24 @@ static void pg_get_indexdef_partitions(Oid indexrelid, Form_pg_index idxrec, boo
List *partList = NIL;
ListCell *lc = NULL;
bool isFirst = true;
- if (RelationIsSubPartitioned(rel)) {
+ if (isSub) {
/* reserve this code, oneday we will support it */
partList = RelationGetSubPartitionOidList(rel);
} else {
partList = relationGetPartitionOidList(rel);
}
+ if (isSub) {
+ appendStringInfo(buf, "\n");
+ }
appendStringInfoChar(buf, '(');
foreach (lc, partList) {
Oid partOid = DatumGetObjectId(lfirst(lc));
- AppendOnePartitionIndex(indexrelid, partOid, showTblSpc, &isFirst, buf);
+ AppendOnePartitionIndex(indexrelid, partOid, showTblSpc, &isFirst, buf, isSub);
+ }
+ if (isSub) {
+ appendStringInfo(buf, "\n");
}
appendStringInfo(buf, ") ");
@@ -2898,7 +3112,7 @@ static void pg_get_indexdef_partitions(Oid indexrelid, Form_pg_index idxrec, boo
* NULL then it points to an array of exclusion operator OIDs.
*/
static char *pg_get_indexdef_worker(Oid indexrelid, int colno, const Oid *excludeOps, bool attrsOnly, bool showTblSpc,
- int prettyFlags, bool dumpSchemaOnly)
+ int prettyFlags, bool dumpSchemaOnly, bool showSubpartitionLocal)
{
/* might want a separate isConstraint parameter later */
bool isConstraint = (excludeOps != NULL);
@@ -3102,7 +3316,7 @@ static char *pg_get_indexdef_worker(Oid indexrelid, int colno, const Oid *exclud
if (idxrelrec->parttype == PARTTYPE_PARTITIONED_RELATION &&
idxrelrec->relkind != RELKIND_GLOBAL_INDEX) {
- pg_get_indexdef_partitions(indexrelid, idxrec, showTblSpc, &buf, dumpSchemaOnly);
+ pg_get_indexdef_partitions(indexrelid, idxrec, showTblSpc, &buf, dumpSchemaOnly, showSubpartitionLocal);
}
/*
@@ -4035,8 +4249,16 @@ char* pg_get_functiondef_worker(Oid funcid, int* headerlines)
}
if (proc->proisstrict)
appendStringInfoString(&buf, " STRICT");
- if (proc->prosecdef)
- appendStringInfoString(&buf, " SECURITY DEFINER");
+ if (PLSQL_SECURITY_DEFINER) {
+ if (proc->prosecdef) {
+ appendStringInfoString(&buf, " AUTHID DEFINER");
+ } else {
+ appendStringInfoString(&buf, " AUTHID CURRENT_USER");
+ }
+ } else {
+ if (proc->prosecdef)
+ appendStringInfoString(&buf, " SECURITY DEFINER");
+ }
if (proc->proleakproof)
appendStringInfoString(&buf, " LEAKPROOF");
@@ -4443,6 +4665,7 @@ static char* deparse_expression_pretty(
context.wrapColumn = WRAP_COLUMN_DEFAULT;
context.indentLevel = startIndent;
context.qrw_phase = false;
+ context.is_upsert_clause = false;
get_rule_expr(expr, &context, showimplicit, no_alias);
return buf.data;
@@ -4594,22 +4817,35 @@ static void set_deparse_planstate(deparse_namespace* dpns, PlanState* ps)
* reference sourceTargetList, which comes from outer plan of the join (source table)
*/
if (mps->operation == CMD_MERGE) {
- dpns->inner_planstate = dpns->outer_planstate->lefttree;
+ PlanState* jplanstate = dpns->outer_planstate;
+ if (IsA(jplanstate, StreamState) || IsA(jplanstate, VecStreamState))
+ jplanstate = jplanstate->lefttree;
+ if (jplanstate->plan != NULL && IsJoinPlan((Node*)jplanstate->plan) &&
+ ((Join*)jplanstate->plan)->jointype == JOIN_RIGHT) {
+ dpns->inner_planstate = innerPlanState(jplanstate);
+ } else {
+ dpns->inner_planstate = outerPlanState(jplanstate);
+ }
}
} else
dpns->inner_planstate = innerPlanState(ps);
-#ifdef ENABLE_MULTIPLE_NODES
- if (IsA(ps, ModifyTableState))
-#else
- if (IsA(ps, ModifyTableState) && ((ModifyTableState*)ps)->mt_upsert != NULL &&
- ((ModifyTableState*)ps)->mt_upsert->us_action != UPSERT_NONE)
-#endif
+ if (IsA(ps, ModifyTableState) && ((ModifyTableState*)ps)->mt_upsert->us_excludedtlist != NIL) {
+ /* For upsert deparse state. The second condition is somewhat ad-hoc but there's no flag to
+ * mark upsert clause under PlanState.
+ */
dpns->inner_tlist = ((ModifyTableState*)ps)->mt_upsert->us_excludedtlist;
- else if (dpns->inner_planstate != NULL)
- dpns->inner_tlist = dpns->inner_planstate->plan->targetlist;
- else
+ } else if (dpns->inner_planstate != NULL) {
+ if ((IsA(ps, ModifyTableState) || IsA(ps, VecModifyTableState) || IsA(ps, DistInsertSelectState)) &&
+ ((ModifyTableState *)ps)->operation == CMD_MERGE) {
+ /* For merge into statements, source relation is always the inner one. */
+ dpns->inner_tlist = ((ModifyTable*)(ps->plan))->mergeSourceTargetList;
+ } else {
+ dpns->inner_tlist = dpns->inner_planstate->plan->targetlist;
+ }
+ } else {
dpns->inner_tlist = NIL;
+ }
/* index_tlist is set only if it's an IndexOnlyScan */
if (IsA(ps->plan, IndexOnlyScan))
@@ -4954,6 +5190,7 @@ static void make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, i
context.viewdef = false;
context.is_fqs = false;
#endif /* PGXC */
+ context.is_upsert_clause = false;
errno_t rc = memset_s(&dpns, sizeof(dpns), 0, sizeof(dpns));
securec_check(rc, "\0", "\0");
@@ -5114,6 +5351,11 @@ static void make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, i
* The query generated has all object names schema-qualified. This is
* done by temporarily setting search_path to NIL.
* It calls get_query_def without pretty print flags.
+ *
+ * Caution: get_query_def calls AcquireRewriteLocks, which might modify the RTEs
+ * in place. So it is generally appropriate for the caller of this routine to
+ * have first done a copyObject() to make a writable copy of the querytree in
+ * the current memory context.
* ----------
*/
void deparse_query(Query* query, StringInfo buf, List* parentnamespace, bool finalise_aggs, bool sortgroup_colno,
@@ -5230,6 +5472,7 @@ static void get_query_def(Query* query, StringInfo buf, List* parentnamespace, T
context.qrw_phase = qrw_phase;
context.viewdef = viewdef;
context.is_fqs = is_fqs;
+ context.is_upsert_clause = false;
errno_t rc = memset_s(&dpns, sizeof(dpns), 0, sizeof(dpns));
securec_check(rc, "", "");
@@ -5498,6 +5741,8 @@ static void get_select_query_def(Query* query, deparse_context* context, TupleDe
appendStringInfo(buf, " OF %s", quote_identifier(rte->eref->aliasname));
if (rc->noWait)
appendStringInfo(buf, " NOWAIT");
+ if (rc->waitSec > 0)
+ appendStringInfo(buf, " WAIT %d", rc->waitSec);
}
}
@@ -5593,6 +5838,7 @@ void get_hint_string(HintState* hstate, StringInfo buf)
get_hint_string_internal(hstate->block_name_hint, buf);
get_hint_string_internal(hstate->scan_hint, buf);
get_hint_string_internal(hstate->predpush_hint, buf);
+ get_hint_string_internal(hstate->predpush_same_level_hint, buf);
get_hint_string_internal(hstate->rewrite_hint, buf);
get_hint_string_internal(hstate->gather_hint, buf);
get_hint_string_internal(hstate->cache_plan_hint, buf);
@@ -6515,6 +6761,17 @@ static void get_insert_query_def(Query* query, deparse_context* context)
get_hint_string(query->hintState, buf);
appendStringInfo(buf, "INTO %s ", generate_relation_name(rte->relid, NIL));
+ /* During gray scale upgrade, do not deparse alias since old node cannot parse it. */
+ if (t_thrd.proc->workingVersionNum >= UPSERT_WHERE_VERSION_NUM) {
+ if (rte->alias != NULL) {
+ /* Deparse alias if given */
+ appendStringInfo(buf, "AS %s ", quote_identifier(rte->alias->aliasname));
+ } else if (rte->eref != NULL && query->upsertClause != NULL) {
+ /* Deparse synonym as alias for upsert statement's target table */
+ appendStringInfo(buf, "AS %s ", quote_identifier(rte->eref->aliasname));
+ }
+ }
+
/*
* Add the insert-column-names list. To handle indirection properly, we
* need to look for indirection nodes in the top targetlist (if it's
@@ -6704,7 +6961,21 @@ static void get_insert_query_def(Query* query, deparse_context* context)
if (upsertClause->upsertAction == UPSERT_NOTHING) {
appendStringInfoString(buf, "NOTHING");
} else {
+ Assert(!context->is_upsert_clause); /* upsert clause cannot be nested */
+ context->is_upsert_clause = true;
get_update_query_targetlist_def(query, upsertClause->updateTlist, rte, context);
+ context->is_upsert_clause = false;
+ /* Add WHERE clause for UPDATE clause in UPSERT statement if given */
+ if (upsertClause->upsertWhere != NULL) {
+ appendContextKeyword(context, " WHERE ", PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
+ if (IsA(upsertClause->upsertWhere, List)) {
+ /* Need to revert flattened ands */
+ Expr* expr = make_ands_explicit((List*)upsertClause->upsertWhere);
+ get_rule_expr((Node*)expr, context, false);
+ } else {
+ get_rule_expr(upsertClause->upsertWhere, context, false);
+ }
+ }
}
}
@@ -8281,8 +8552,9 @@ static RangeTblEntry* find_rte_by_refname(const char* refname, deparse_context*
foreach (rtlist, dpns->rtable) {
RangeTblEntry* rte = (RangeTblEntry*)lfirst(rtlist);
-
- if (strcmp(rte->eref->aliasname, refname) == 0) {
+ /* duplicately named pulled-up rtable in upsert clause will not lead to ambiguity */
+ if (!(context->is_upsert_clause && rte->pulled_from_subquery) &&
+ strcmp(rte->eref->aliasname, refname) == 0) {
if (result != NULL)
return NULL; /* it's ambiguous */
result = rte;
@@ -9626,11 +9898,6 @@ static void get_rule_expr(Node* node, deparse_context* context, bool showimplici
}
} break;
- case T_GradientDescentExpr: {
- GradientDescentExpr* gdnode = (GradientDescentExpr*)node;
- appendStringInfo(buf, "GD(%s)", gd_get_expr_name(gdnode->field));
- } break;
-
default:
if (context->qrw_phase)
appendStringInfo(buf, "", (int)nodeTag(node));
@@ -10637,7 +10904,7 @@ static void get_from_clause_partition(RangeTblEntry* rte, StringInfo buf, depars
}
}
-static void get_from_clause_subpartition(RangeTblEntry* rte, StringInfo buf)
+static void get_from_clause_subpartition(RangeTblEntry* rte, StringInfo buf, deparse_context* context)
{
Assert(rte->ispartrel);
@@ -10646,6 +10913,20 @@ static void get_from_clause_subpartition(RangeTblEntry* rte, StringInfo buf)
pfree(rte->pname->aliasname);
rte->pname->aliasname = getPartitionName(rte->subpartitionOid, false);
appendStringInfo(buf, " SUBPARTITION(%s)", quote_identifier(rte->pname->aliasname));
+ } else {
+ ListCell* cell = NULL;
+ char* semicolon = "";
+
+ Assert(rte->plist);
+ appendStringInfo(buf, " SUBPARTITION FOR(");
+ foreach (cell, rte->plist) {
+ Node* col = (Node*)lfirst(cell);
+
+ appendStringInfoString(buf, semicolon);
+ get_rule_expr(processIndirection(col, context, false), context, false);
+ semicolon = " ,";
+ }
+ appendStringInfo(buf, ")");
}
}
@@ -10718,7 +10999,7 @@ static void get_from_clause_item(Node* jtnode, Query* query, deparse_context* co
get_from_clause_partition(rte, buf, context);
}
if (rte->isContainSubPartition) {
- get_from_clause_subpartition(rte, buf);
+ get_from_clause_subpartition(rte, buf, context);
}
if (rte->isbucket) {
get_from_clause_bucket(rte, buf, context);
diff --git a/src/common/backend/utils/adt/selfuncs.cpp b/src/common/backend/utils/adt/selfuncs.cpp
index 3ab7f5870..35c572731 100755
--- a/src/common/backend/utils/adt/selfuncs.cpp
+++ b/src/common/backend/utils/adt/selfuncs.cpp
@@ -4737,9 +4737,8 @@ void examine_variable(PlannerInfo* root, Node* node, int varRelid, VariableStatD
* to identify which column(s) the index
* depends on.
*/
- vardata->acl_ok =
- (pg_class_aclcheck(rte->relid, GetUserId(),
- ACL_SELECT) == ACLCHECK_OK);
+ vardata->acl_ok = (rte->securityQuals == NIL) &&
+ (pg_class_aclcheck(rte->relid, GetUserId(), ACL_SELECT) == ACLCHECK_OK);
}
else
{
@@ -4827,11 +4826,9 @@ static void examine_simple_variable(PlannerInfo* root, Var* var, VariableStatDat
if (HeapTupleIsValid(vardata->statsTuple))
{
/* check if user has permission to read this column */
- vardata->acl_ok =
- (pg_class_aclcheck(rte->relid, GetUserId(),
- ACL_SELECT) == ACLCHECK_OK) ||
- (pg_attribute_aclcheck(rte->relid, var->varattno, GetUserId(),
- ACL_SELECT) == ACLCHECK_OK);
+ vardata->acl_ok = (rte->securityQuals == NIL) &&
+ ((pg_class_aclcheck(rte->relid, GetUserId(), ACL_SELECT) == ACLCHECK_OK) ||
+ (pg_attribute_aclcheck(rte->relid, var->varattno, GetUserId(), ACL_SELECT) == ACLCHECK_OK));
}
else
{
@@ -4894,8 +4891,12 @@ static void examine_simple_variable(PlannerInfo* root, Var* var, VariableStatDat
* RelOptInfos. For instance, if any subquery pullup happened during
* planning, Vars in the targetlist might have gotten replaced, and we
* need to see the replacement expressions.
+ * This is a temporary fix for mislocated varattno after inlist2join
+ * optimization.
*/
- subquery = rel->subroot->parse;
+ if (!rel->subroot->parse->is_from_inlist2join_rewrite) {
+ subquery = rel->subroot->parse;
+ }
Assert(IsA(subquery, Query));
/* Get the subquery output expression referenced by the upper Var */
@@ -5067,6 +5068,9 @@ double get_variable_numdistinct(VariableStatData* vardata, bool* isdefault, bool
case BucketIdAttributeNumber:
stadistinct = 1.0; /* only 1 value */
break;
+ case UidAttributeNumber:
+ stadistinct = 1.0; /* only 1 value */
+ break;
#endif
default:
stadistinct = 0.0; /* means "unknown" */
diff --git a/src/common/backend/utils/adt/txid.cpp b/src/common/backend/utils/adt/txid.cpp
index 170fe700e..7b30dafc2 100644
--- a/src/common/backend/utils/adt/txid.cpp
+++ b/src/common/backend/utils/adt/txid.cpp
@@ -268,109 +268,10 @@ Datum pgxc_snapshot_status(PG_FUNCTION_ARGS)
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unsupported view in single node mode.")));
SRF_RETURN_DONE(funcctx);
#else
- if (!GTM_MODE) {
- ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("unsupported function or view in %s mode.", GTM_LITE_MODE ? "GTM-Lite" : "GTM-Free")));
- }
FuncCallContext* funcctx = NULL;
-
- if (SRF_IS_FIRSTCALL()) {
- MemoryContext oldcontext;
- TupleDesc tupdesc;
-
- funcctx = SRF_FIRSTCALL_INIT();
-
- oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
-
- tupdesc = CreateTemplateTupleDesc(10, false);
- TupleDescInitEntry(tupdesc, (AttrNumber)1, "xmin", XIDOID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)2, "xmax", XIDOID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)3, "xcnt", INT4OID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)4, "oldestxmin", XIDOID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)5, "next_xid", XIDOID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)6, "timeline", INT4OID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)7, "active_thread_num", INT4OID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)8, "max_active_thread_num", INT4OID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)9, "snapshot_num", INT4OID, -1, 0);
- TupleDescInitEntry(tupdesc, (AttrNumber)10, "snapshot_totalsize", INT8OID, -1, 0);
-
- funcctx->tuple_desc = BlessTupleDesc(tupdesc);
-
- funcctx->user_fctx = palloc0(sizeof(int));
- funcctx->max_calls = 1;
-
- MemoryContextSwitchTo(oldcontext);
- }
-
- /* stuff done on every call of the function */
- funcctx = SRF_PERCALL_SETUP();
-
- if (funcctx->call_cntr < funcctx->max_calls) {
- /* for each row */
- Datum values[10];
- bool nulls[10];
- HeapTuple tuple;
- GTM_SnapshotStatus sn_stat;
- errno_t ss_rc = 0;
-
- ss_rc = memset_s(values, sizeof(values), 0, sizeof(values));
- securec_check(ss_rc, "\0", "\0");
- ss_rc = memset_s(nulls, sizeof(nulls), 0, sizeof(nulls));
- securec_check(ss_rc, "\0", "\0");
-
- sn_stat = GetGTMSnapshotStatus(GetCurrentTransactionKey());
- if (!sn_stat) {
- ereport(ERROR,
- (errcode(ERRCODE_CONNECTION_FAILURE),
- errmsg(
- "GTM error, could not obtain snapshot_status, please check GTM is running or failovering.")));
- }
- /* log important result of transaction information */
- elog(LOG,
- "GTM next_xid:%lu, GTM oldestxmin:%lu, GTM gtmtimeline:%u",
- sn_stat->next_xid,
- sn_stat->recent_global_xmin,
- sn_stat->timeline);
- /* simple check: check warplimit */
- TransactionId xid = sn_stat->next_xid;
- /*
- * Check oldestxmin and next_xid in case that on-fly scence.
- * Notice:
- * This is a simple check: Here we just check and log GTM oldestxmin
- * and GTM next_xid without holding any locks. If GTM crash now, GTM
- * will lost all information, and DN will get next_xid as oldestxmin
- * to do vacuum and prune. It's very dangerous.
- * diff_num_threadhold, which as checking threadhold, is always same
- * as vacuum_defer_cleanup_age.
- */
- int diff_num_threadhold = (u_sess->attr.attr_storage.vacuum_defer_cleanup_age > 2000)
- ? u_sess->attr.attr_storage.vacuum_defer_cleanup_age
- : 2000;
- xid = sn_stat->recent_global_xmin + diff_num_threadhold;
- if (TransactionIdFollowsOrEquals(sn_stat->next_xid, xid)) {
- elog(WARNING,
- "A very old transaction is running, recent_global_xmin: %lu, next_xid: %lu.",
- sn_stat->recent_global_xmin,
- sn_stat->next_xid);
- }
- /* Values available to all callers */
- values[0] = TransactionIdGetDatum(sn_stat->xmin);
- values[1] = TransactionIdGetDatum(sn_stat->xmax);
- values[2] = Int32GetDatum(0);
- values[3] = TransactionIdGetDatum(sn_stat->recent_global_xmin);
- values[4] = TransactionIdGetDatum(sn_stat->next_xid);
- values[5] = Int32GetDatum(sn_stat->timeline);
- values[6] = Int32GetDatum(sn_stat->active_thread_num);
- values[7] = Int32GetDatum(sn_stat->max_thread_num);
- values[8] = Int32GetDatum(sn_stat->snapshot_num);
- values[9] = Int64GetDatum(sn_stat->snapshot_totalsize);
- /* notice: we free memory using memory contxt, so don't have memory leak here.*/
- tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
- SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
- } else {
- /* nothing left */
- SRF_RETURN_DONE(funcctx);
- }
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("unsupported function or view in %s mode.", GTM_LITE_MODE ? "GTM-Lite" : "GTM-Free")));
+ SRF_RETURN_DONE(funcctx);
#endif
}
diff --git a/src/common/backend/utils/adt/varchar.cpp b/src/common/backend/utils/adt/varchar.cpp
index affccc03b..998602bd6 100644
--- a/src/common/backend/utils/adt/varchar.cpp
+++ b/src/common/backend/utils/adt/varchar.cpp
@@ -142,6 +142,12 @@ static BpChar* bpchar_input(const char* s, size_t len, int32 atttypmod)
maxlen = atttypmod - VARHDRSZ;
if (len > maxlen) {
+
+ if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT && CHAR_COERCE_COMPAT)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("value too long for type character(%d)", (int)maxlen)));
+
/* Verify that extra characters are spaces, and clip them off */
size_t mbmaxlen = pg_mbcharcliplen(s, len, maxlen);
size_t j;
@@ -282,6 +288,12 @@ Datum bpchar(PG_FUNCTION_ARGS)
PG_RETURN_BPCHAR_P(source);
if (len > maxlen) {
+
+ if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT && CHAR_COERCE_COMPAT)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("value too long for type character(%d)", maxlen)));
+
/* Verify that extra characters are spaces, and clip them off */
size_t maxmblen;
@@ -436,6 +448,11 @@ static VarChar* varchar_input(const char* s, size_t len, int32 atttypmod)
maxlen = atttypmod - VARHDRSZ;
+ if (len > maxlen && u_sess->attr.attr_sql.sql_compatibility == A_FORMAT && CHAR_COERCE_COMPAT)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("value too long for type character varying(%d)", (int)maxlen)));
+
if (atttypmod >= (int32)VARHDRSZ && len > maxlen) {
/* Verify that extra characters are spaces, and clip them off */
size_t mbmaxlen = pg_mbcharcliplen(s, len, maxlen);
@@ -578,6 +595,10 @@ Datum varchar(PG_FUNCTION_ARGS)
PG_RETURN_VARCHAR_P(source);
/* only reach here if string is too long... */
+ if (len > maxlen && u_sess->attr.attr_sql.sql_compatibility == A_FORMAT && CHAR_COERCE_COMPAT)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("value too long for type character varying(%d)", maxlen)));
/* truncate multibyte string preserving multibyte boundary */
maxmblen = pg_mbcharcliplen(s_data, len, maxlen);
@@ -1071,6 +1092,11 @@ static NVarChar2* nvarchar2_input(const char* s, size_t len, int32 atttypmod)
maxlen = atttypmod - VARHDRSZ;
+ if (len > maxlen && u_sess->attr.attr_sql.sql_compatibility == A_FORMAT && CHAR_COERCE_COMPAT)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("value too long for type nvarchar2(%d)", (int)maxlen)));
+
if (atttypmod >= (int32)VARHDRSZ && len > maxlen) {
/* Verify that extra characters are spaces, and clip them off */
size_t mbmaxlen = pg_mbcharcliplen_orig(s, len, maxlen);
@@ -1181,6 +1207,11 @@ Datum nvarchar2(PG_FUNCTION_ARGS)
if (maxlen < 0 || len <= maxlen)
PG_RETURN_NVARCHAR2_P(source);
+ if (len > maxlen && u_sess->attr.attr_sql.sql_compatibility == A_FORMAT && CHAR_COERCE_COMPAT)
+ ereport(ERROR,
+ (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),
+ errmsg("value too long for type nvarchar2(%d)", maxlen)));
+
/* only reach here if string is too long... */
/* truncate multibyte string preserving multibyte boundary */
diff --git a/src/common/backend/utils/adt/varlena.cpp b/src/common/backend/utils/adt/varlena.cpp
index 1d884e9a2..2ba2ce1ae 100644
--- a/src/common/backend/utils/adt/varlena.cpp
+++ b/src/common/backend/utils/adt/varlena.cpp
@@ -363,56 +363,6 @@ Datum byteain(PG_FUNCTION_ARGS)
PG_RETURN_BYTEA_P(result);
}
-static bytea* sub_blob(bytea* data, int32 amount)
-{
- int32 len = 0;
- int32 length = 0;
- bytea* result = NULL;
- char* ptr = NULL;
- int offset = 0;
- errno_t rc = EOK;
- const int MAX_BATCH_SIZE = 32767;
- length = VARSIZE_ANY_EXHDR(data);
- if (amount < 1 || amount > MAX_BATCH_SIZE) {
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("argument is null, invalid, or out of range")));
- }
- if (offset > length) {
- return NULL;
- }
- if (length < amount) {
- len = length + VARHDRSZ;
- } else {
- len = amount + VARHDRSZ;
- }
- /* Avoid the memcpy exceeding */
- if (len > ((length - offset) + VARHDRSZ + 1)) {
- len = (length - offset) + VARHDRSZ + 1;
- }
- result = (bytea*)palloc0(len);
- SET_VARSIZE(result, len);
- ptr = VARDATA(result);
- rc = memcpy_s(ptr, (len - VARHDRSZ), VARDATA_ANY(data) + (offset - 1), (len - VARHDRSZ));
- securec_check(rc, "\0", "\0");
- return result;
-}
-static text* sub_text(text* t1, int32 amount)
-{
- int32 len;
- int32 offset = 0;
- const int MAX_BATCH_SIZE = 32767;
- int32 len1 = text_length(PointerGetDatum(t1));
- if (amount < 1 || amount > MAX_BATCH_SIZE) {
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("argument is null, invalid, or out of range")));
- }
- len = len1 < (amount + offset - 1) ? (len1 - offset + 1) : amount;
- return text_substring(PointerGetDatum(t1), Int32GetDatum(offset), Int32GetDatum(len), false);
-}
-
-
/*
* byteaout - converts to printable representation of byte array
*
@@ -422,12 +372,6 @@ static text* sub_text(text* t1, int32 amount)
Datum byteaout(PG_FUNCTION_ARGS)
{
bytea* vlena = PG_GETARG_BYTEA_PP(0);
-
- if (u_sess->attr.attr_sql.for_print_tuple && u_sess->attr.attr_common.pset_lob_length != 0) {
- bytea* tmp = NULL;
- tmp = sub_blob(vlena, u_sess->attr.attr_common.pset_lob_length);
- vlena = tmp;
- }
char* result = NULL;
char* rp = NULL;
@@ -524,12 +468,6 @@ Datum rawout(PG_FUNCTION_ARGS)
fcinfo->fncollation = DEFAULT_COLLATION_OID;
bytea* data = PG_GETARG_BYTEA_P(0);
-
- if (u_sess->attr.attr_sql.for_print_tuple && u_sess->attr.attr_common.pset_lob_length != 0) {
- bytea* tmp = NULL;
- tmp = sub_blob(data, u_sess->attr.attr_common.pset_lob_length);
- data = tmp;
- }
text* ans = NULL;
int datalen = 0;
int resultlen = 0;
@@ -575,6 +513,10 @@ Datum rawtotext(PG_FUNCTION_ARGS)
Datum texttoraw(PG_FUNCTION_ARGS)
{
Datum arg1 = PG_GETARG_DATUM(0);
+ if (VARATT_IS_HUGE_TOAST_POINTER(DatumGetPointer(arg1))) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("texttoraw could not support more than 1GB clob/blob data")));
+ }
Datum result;
Datum cstring_arg1;
@@ -689,12 +631,13 @@ Datum textin(PG_FUNCTION_ARGS)
Datum textout(PG_FUNCTION_ARGS)
{
Datum txt = PG_GETARG_DATUM(0);
-
- if (u_sess->attr.attr_sql.for_print_tuple && u_sess->attr.attr_common.pset_lob_length != 0) {
- text* outputText = sub_text((text*)DatumGetPointer(txt), u_sess->attr.attr_common.pset_lob_length);
- PG_RETURN_CSTRING(text_to_cstring(outputText));
+ if (VARATT_IS_HUGE_TOAST_POINTER(DatumGetPointer(txt))) {
+ int len = strlen("") + 1;
+ char *res = (char *)palloc(len);
+ errno_t rc = strcpy_s(res, len, "");
+ securec_check_c(rc, "\0", "\0");
+ PG_RETURN_CSTRING(res);
}
-
PG_RETURN_CSTRING(TextDatumGetCString(txt));
}
@@ -778,6 +721,22 @@ Datum unknownsend(PG_FUNCTION_ARGS)
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
+static Datum text_length_huge(Datum str)
+{
+ if (pg_database_encoding_max_length() == 1) {
+ PG_RETURN_INT64(toast_raw_datum_size(str) - VARHDRSZ);
+ } else {
+ int64 result = 0;
+ text* t = DatumGetTextPP(str);
+ result = calculate_huge_length(t);
+
+ if ((Pointer)(t) != (Pointer)(str))
+ pfree_ext(t);
+
+ PG_RETURN_INT64(result);
+ }
+}
+
/* ========== PUBLIC ROUTINES ========== */
/*
@@ -789,8 +748,12 @@ Datum textlen(PG_FUNCTION_ARGS)
{
Datum str = PG_GETARG_DATUM(0);
- /* try to avoid decompressing argument */
- PG_RETURN_INT32(text_length(str));
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)DatumGetTextPP(str))) {
+ return text_length_huge(str);
+ } else {
+ /* try to avoid decompressing argument */
+ PG_RETURN_INT32(text_length(str));
+ }
}
/*
@@ -882,12 +845,27 @@ Datum textcat(PG_FUNCTION_ARGS)
static text* text_catenate(text* t1, text* t2)
{
text* result = NULL;
- int len1, len2, len;
+ int64 len1, len2, len;
char* ptr = NULL;
int rc = 0;
- len1 = VARSIZE_ANY_EXHDR(t1);
- len2 = VARSIZE_ANY_EXHDR(t2);
+ if (VARATT_IS_HUGE_TOAST_POINTER(t1)) {
+ struct varatt_lob_external large_toast_pointer;
+
+ VARATT_EXTERNAL_GET_HUGE_POINTER(large_toast_pointer, t1);
+ len1 = large_toast_pointer.va_rawsize;
+ } else {
+ len1 = VARSIZE_ANY_EXHDR(t1);
+ }
+
+ if (VARATT_IS_HUGE_TOAST_POINTER(t2)) {
+ struct varatt_lob_external large_toast_pointer;
+
+ VARATT_EXTERNAL_GET_HUGE_POINTER(large_toast_pointer, t2);
+ len2 = large_toast_pointer.va_rawsize;
+ } else {
+ len2 = VARSIZE_ANY_EXHDR(t2);
+ }
/* paranoia ... probably should throw error instead? */
if (len1 < 0)
@@ -896,20 +874,29 @@ static text* text_catenate(text* t1, text* t2)
len2 = 0;
len = len1 + len2 + VARHDRSZ;
- result = (text*)palloc(len);
+ if (len > MAX_TOAST_CHUNK_SIZE + VARHDRSZ) {
+#ifdef ENABLE_MULTIPLE_NODES
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("Un-support clob/blob type more than 1GB for distributed system")));
+#endif
+ Oid toastOid = get_toast_oid();
+ result = text_catenate_huge(t1, t2, toastOid);
+ } else {
+ result = (text*)palloc(len);
- /* Set size of result string... */
- SET_VARSIZE(result, len);
+ /* Set size of result string... */
+ SET_VARSIZE(result, len);
- /* Fill data field of result string... */
- ptr = VARDATA(result);
- if (len1 > 0) {
- rc = memcpy_s(ptr, len1, VARDATA_ANY(t1), len1);
- securec_check(rc, "\0", "\0");
- }
- if (len2 > 0) {
- rc = memcpy_s(ptr + len1, len2, VARDATA_ANY(t2), len2);
- securec_check(rc, "\0", "\0");
+ /* Fill data field of result string... */
+ ptr = VARDATA(result);
+ if (len1 > 0) {
+ rc = memcpy_s(ptr, len1, VARDATA_ANY(t1), len1);
+ securec_check(rc, "\0", "\0");
+ }
+ if (len2 > 0) {
+ rc = memcpy_s(ptr + len1, len2, VARDATA_ANY(t2), len2);
+ securec_check(rc, "\0", "\0");
+ }
}
return result;
@@ -1283,6 +1270,12 @@ Datum text_substr_orclcompat(PG_FUNCTION_ARGS)
mblen_converter fun_mblen;
fun_mblen = *pg_wchar_table[GetDatabaseEncoding()].mblen;
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)DatumGetPointer(str))) {
+ struct varlena* dest_ptr = (struct varlena*)DatumGetPointer(str);
+ struct varlena* res_ptr = heap_tuple_untoast_attr_slice(dest_ptr, start, length);
+ return PointerGetDatum(res_ptr);
+ }
+
is_compress = (VARATT_IS_COMPRESSED(DatumGetPointer(str)) || VARATT_IS_EXTERNAL(DatumGetPointer(str)));
// orclcompat is true, withlen is true
baseIdx = 6 + (int)is_compress + (eml - 1) * 8;
@@ -1310,6 +1303,11 @@ Datum text_substr_no_len_orclcompat(PG_FUNCTION_ARGS)
mblen_converter fun_mblen;
fun_mblen = *pg_wchar_table[GetDatabaseEncoding()].mblen;
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)DatumGetPointer(str))) {
+ ereport(ERROR, (errcode(ERRCODE_UNRECOGNIZED_NODE_TYPE),
+ errmsg("The data is lob that larger than 1GB, you must use a substr with len(substr(str, start, len))")));
+ }
+
is_compress = (VARATT_IS_COMPRESSED(DatumGetPointer(str)) || VARATT_IS_EXTERNAL(DatumGetPointer(str)));
// orclcompat is true, withlen is false
baseIdx = 4 + (int)is_compress + (eml - 1) * 8;
@@ -1866,6 +1864,10 @@ Datum texteq(PG_FUNCTION_ARGS)
{
Datum arg1 = PG_GETARG_DATUM(0);
Datum arg2 = PG_GETARG_DATUM(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER(DatumGetPointer(arg1)) && VARATT_IS_HUGE_TOAST_POINTER(DatumGetPointer(arg2))) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("texteq could not support more than 1GB clob/blob data")));
+ }
bool result = false;
Size len1, len2;
@@ -1897,6 +1899,10 @@ Datum textne(PG_FUNCTION_ARGS)
{
Datum arg1 = PG_GETARG_DATUM(0);
Datum arg2 = PG_GETARG_DATUM(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER(DatumGetPointer(arg1)) || VARATT_IS_HUGE_TOAST_POINTER(DatumGetPointer(arg2))) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("textne could not support more than 1GB clob/blob data")));
+ }
bool result = false;
Size len1, len2;
@@ -2003,6 +2009,10 @@ Datum text_lt(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_lt could not support more than 1GB clob/blob data")));
+ }
bool result = false;
result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) < 0);
@@ -2017,6 +2027,10 @@ Datum text_le(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_le could not support more than 1GB clob/blob data")));
+ }
bool result = false;
result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) <= 0);
@@ -2031,6 +2045,10 @@ Datum text_gt(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_gt could not support more than 1GB clob/blob data")));
+ }
bool result = false;
result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) > 0);
@@ -2045,6 +2063,10 @@ Datum text_ge(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_ge could not support more than 1GB clob/blob data")));
+ }
bool result = false;
result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) >= 0);
@@ -2059,6 +2081,10 @@ Datum bttextcmp(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("bttextcmp could not support more than 1GB clob/blob data")));
+ }
int32 result;
result = text_cmp(arg1, arg2, PG_GET_COLLATION());
@@ -2763,6 +2789,10 @@ Datum text_larger(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_larger could not support more than 1GB clob/blob data")));
+ }
text* result = NULL;
result = ((text_cmp(arg1, arg2, PG_GET_COLLATION()) > 0) ? arg1 : arg2);
@@ -2774,6 +2804,10 @@ Datum text_smaller(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_smaller could not support more than 1GB clob/blob data")));
+ }
text* result = NULL;
result = ((text_cmp(arg1, arg2, PG_GET_COLLATION()) < 0) ? arg1 : arg2);
@@ -2811,6 +2845,10 @@ Datum text_pattern_lt(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_pattern_lt could not support more than 1GB clob/blob data")));
+ }
int result;
result = internal_text_pattern_compare(arg1, arg2);
@@ -2825,6 +2863,10 @@ Datum text_pattern_le(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_pattern_le could not support more than 1GB clob/blob data")));
+ }
int result;
result = internal_text_pattern_compare(arg1, arg2);
@@ -2839,6 +2881,10 @@ Datum text_pattern_ge(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_pattern_ge could not support more than 1GB clob/blob data")));
+ }
int result;
result = internal_text_pattern_compare(arg1, arg2);
@@ -2853,6 +2899,10 @@ Datum text_pattern_gt(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_pattern_gt could not support more than 1GB clob/blob data")));
+ }
int result;
result = internal_text_pattern_compare(arg1, arg2);
@@ -2867,6 +2917,10 @@ Datum bttext_pattern_cmp(PG_FUNCTION_ARGS)
{
text* arg1 = PG_GETARG_TEXT_PP(0);
text* arg2 = PG_GETARG_TEXT_PP(1);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg1) || VARATT_IS_HUGE_TOAST_POINTER((varlena *)arg2)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("bttext_pattern_cmp could not support more than 1GB clob/blob data")));
+ }
int result;
result = internal_text_pattern_compare(arg1, arg2);
@@ -2919,8 +2973,23 @@ static bytea* bytea_catenate(bytea* t1, bytea* t2)
char* ptr = NULL;
int rc = 0;
- len1 = VARSIZE_ANY_EXHDR(t1);
- len2 = VARSIZE_ANY_EXHDR(t2);
+ if (VARATT_IS_HUGE_TOAST_POINTER(t1)) {
+ struct varatt_lob_external large_toast_pointer;
+
+ VARATT_EXTERNAL_GET_HUGE_POINTER(large_toast_pointer, t1);
+ len1 = large_toast_pointer.va_rawsize;
+ } else {
+ len1 = VARSIZE_ANY_EXHDR(t1);
+ }
+
+ if (VARATT_IS_HUGE_TOAST_POINTER(t2)) {
+ struct varatt_lob_external large_toast_pointer;
+
+ VARATT_EXTERNAL_GET_HUGE_POINTER(large_toast_pointer, t2);
+ len2 = large_toast_pointer.va_rawsize;
+ } else {
+ len2 = VARSIZE_ANY_EXHDR(t2);
+ }
/* paranoia ... probably should throw error instead? */
if (len1 < 0)
@@ -2929,20 +2998,30 @@ static bytea* bytea_catenate(bytea* t1, bytea* t2)
len2 = 0;
len = len1 + len2 + VARHDRSZ;
- result = (bytea*)palloc(len);
- /* Set size of result string... */
- SET_VARSIZE(result, len);
+ if (len > MAX_TOAST_CHUNK_SIZE + VARHDRSZ) {
+#ifdef ENABLE_MULTIPLE_NODES
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("Un-support clob/blob type more than 1GB for distributed system")));
+#endif
+ Oid toastOid = get_toast_oid();
+ result = text_catenate_huge(t1, t2, toastOid);
+ } else {
+ result = (bytea*)palloc(len);
- /* Fill data field of result string... */
- ptr = VARDATA(result);
- if (len1 > 0) {
- rc = memcpy_s(ptr, len1, VARDATA_ANY(t1), len1);
- securec_check(rc, "\0", "\0");
- }
- if (len2 > 0) {
- rc = memcpy_s(ptr + len1, len2, VARDATA_ANY(t2), len2);
- securec_check(rc, "\0", "\0");
+ /* Set size of result string... */
+ SET_VARSIZE(result, len);
+
+ /* Fill data field of result string... */
+ ptr = VARDATA(result);
+ if (len1 > 0) {
+ rc = memcpy_s(ptr, len1, VARDATA_ANY(t1), len1);
+ securec_check(rc, "\0", "\0");
+ }
+ if (len2 > 0) {
+ rc = memcpy_s(ptr + len1, len2, VARDATA_ANY(t2), len2);
+ securec_check(rc, "\0", "\0");
+ }
}
return result;
}
@@ -4071,6 +4150,12 @@ Datum replace_text(PG_FUNCTION_ARGS)
if (!PG_ARGISNULL(2))
to_sub_text = PG_GETARG_TEXT_PP(2);
+ if (VARATT_IS_HUGE_TOAST_POINTER(src_text) || VARATT_IS_HUGE_TOAST_POINTER(from_sub_text)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("replace() arguments cannot exceed 1GB")));
+ }
+
text_position_setup(src_text, from_sub_text, &state);
/*
@@ -4254,8 +4339,9 @@ static void appendStringInfoRegexpSubstr(
*
* Note: to avoid having to include regex.h in builtins.h, we declare
* the regexp argument as void *, but really it's regex_t *.
+ * occur : the n-th matched occurrence, start from 1.
*/
-text* replace_text_regexp(text* src_text, void* regexp, text* replace_text, bool glob)
+text* replace_text_regexp(text* src_text, void* regexp, text* replace_text, int position, int occur)
{
text* ret_text = NULL;
regex_t* re = (regex_t*)regexp;
@@ -4264,8 +4350,10 @@ text* replace_text_regexp(text* src_text, void* regexp, text* replace_text, bool
regmatch_t pmatch[REGEXP_REPLACE_BACKREF_CNT];
pg_wchar* data = NULL;
size_t data_len;
- int search_start;
+ int search_start = position - 1;
int data_pos;
+ int count = 0;
+ int replace_len;
char* start_ptr = NULL;
bool have_escape = false;
@@ -4274,7 +4362,9 @@ text* replace_text_regexp(text* src_text, void* regexp, text* replace_text, bool
/* Convert data string to wide characters. */
data = (pg_wchar*)palloc((src_text_len + 1) * sizeof(pg_wchar));
data_len = pg_mb2wchar_with_len(VARDATA_ANY(src_text), data, src_text_len);
-
+ if ((unsigned int)(position) > data_len) {
+ return src_text;
+ }
/* Check whether replace_text has escape char. */
if (replace_text != NULL)
have_escape = check_replace_text_has_escape_char(replace_text);
@@ -4283,7 +4373,6 @@ text* replace_text_regexp(text* src_text, void* regexp, text* replace_text, bool
start_ptr = (char*)VARDATA_ANY(src_text);
data_pos = 0;
- search_start = 0;
while ((unsigned int)(search_start) <= data_len) {
int regexec_result;
@@ -4327,25 +4416,28 @@ text* replace_text_regexp(text* src_text, void* regexp, text* replace_text, bool
data_pos = pmatch[0].rm_so;
}
- /*
- * Copy the replace_text. Process back references when the
- * replace_text has escape characters.
- */
- if (replace_text != NULL && have_escape)
- appendStringInfoRegexpSubstr(&buf, replace_text, pmatch, start_ptr, data_pos);
- else if (replace_text != NULL)
- appendStringInfoText(&buf, replace_text);
+ count++;
+
+ replace_len = charlen_to_bytelen(start_ptr, pmatch[0].rm_eo - data_pos);
+
+ if (occur == 0 || count == occur) {
+ /*
+ * Copy the replace_text. Process back references when the
+ * replace_text has escape characters.
+ */
+ if (replace_text != NULL && have_escape)
+ appendStringInfoRegexpSubstr(&buf, replace_text, pmatch, start_ptr, data_pos);
+ else if (replace_text != NULL)
+ appendStringInfoText(&buf, replace_text);
+ } else {
+ /* not the n-th matched occurrence */
+ appendBinaryStringInfo(&buf, start_ptr, replace_len);
+ }
/* Advance start_ptr and data_pos over the matched text. */
- start_ptr += charlen_to_bytelen(start_ptr, pmatch[0].rm_eo - data_pos);
+ start_ptr += replace_len;
data_pos = pmatch[0].rm_eo;
- /*
- * When global option is off, replace the first instance only.
- */
- if (!glob)
- break;
-
/*
* Advance search position. Normally we start the next search at the
* end of the previous match; but if the match was of zero length, we
@@ -5719,6 +5811,15 @@ Datum interval_list_agg_noarg2_transfn(PG_FUNCTION_ARGS)
PG_RETURN_POINTER(state);
}
+static void check_huge_toast_pointer(Datum value, Oid valtype)
+{
+ if ((valtype == TEXTOID || valtype == CLOBOID || valtype == BLOBOID) &&
+ VARATT_IS_HUGE_TOAST_POINTER(DatumGetPointer(value))) {
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("concat could not support more than 1GB clob/blob data")));
+ }
+}
+
/*
* Implementation of both concat() and concat_ws().
*
@@ -5779,6 +5880,7 @@ static text* concat_internal(const char* sepstr, int seplen, int argidx, Functio
/* call the appropriate type output function, append the result */
valtype = get_fn_expr_argtype(fcinfo->flinfo, i);
+ check_huge_toast_pointer(value, valtype);
if (!OidIsValid(valtype))
ereport(ERROR, (errcode(ERRCODE_INDETERMINATE_DATATYPE),
errmsg("could not determine data type of concat() input")));
@@ -5834,6 +5936,10 @@ Datum text_concat_ws(PG_FUNCTION_ARGS)
Datum text_left(PG_FUNCTION_ARGS)
{
text* str = PG_GETARG_TEXT_PP(0);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)str)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_left could not support more than 1GB clob/blob data")));
+ }
const char* p = VARDATA_ANY(str);
int len = VARSIZE_ANY_EXHDR(str);
int n = PG_GETARG_INT32(1);
@@ -5867,6 +5973,10 @@ Datum text_left(PG_FUNCTION_ARGS)
Datum text_right(PG_FUNCTION_ARGS)
{
text* str = PG_GETARG_TEXT_PP(0);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)str)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_right could not support more than 1GB clob/blob data")));
+ }
const char* p = VARDATA_ANY(str);
int len = VARSIZE_ANY_EXHDR(str);
int n = PG_GETARG_INT32(1);
@@ -5900,6 +6010,10 @@ Datum text_right(PG_FUNCTION_ARGS)
Datum text_reverse(PG_FUNCTION_ARGS)
{
text* str = PG_GETARG_TEXT_PP(0);
+ if (VARATT_IS_HUGE_TOAST_POINTER((varlena *)str)) {
+ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("text_reverse could not support more than 1GB clob/blob data")));
+ }
const char* p = VARDATA_ANY(str);
int len = VARSIZE_ANY_EXHDR(str);
const char* endp = p + len;
diff --git a/src/common/backend/utils/cache/Makefile b/src/common/backend/utils/cache/Makefile
index fa5261e48..c2ed85ef3 100644
--- a/src/common/backend/utils/cache/Makefile
+++ b/src/common/backend/utils/cache/Makefile
@@ -21,6 +21,11 @@ ifneq "$(MAKECMDGOALS)" "clean"
endif
OBJS = attoptcache.o catcache.o inval.o plancache.o relcache.o relmapper.o \
spccache.o syscache.o lsyscache.o typcache.o ts_cache.o partcache.o \
- relfilenodemap.o
+ relfilenodemap.o \
+ knl_globalsysdbcache.o \
+ knl_localsysdbcache.o \
+ knl_globalsystabcache.o knl_globalsystupcache.o knl_globalbasedefcache.o knl_globaltabdefcache.o knl_globalpartdefcache.o \
+ knl_localsystabcache.o knl_localsystupcache.o knl_localbasedefcache.o knl_localtabdefcache.o knl_localpartdefcache.o \
+ knl_globalrelmapcache.o knl_globalbucketlist.o knl_globaldbstatmanager.o
include $(top_srcdir)/src/gausskernel/common.mk
diff --git a/src/common/backend/utils/cache/attoptcache.cpp b/src/common/backend/utils/cache/attoptcache.cpp
index 6ff6dfc34..a68e12fe7 100644
--- a/src/common/backend/utils/cache/attoptcache.cpp
+++ b/src/common/backend/utils/cache/attoptcache.cpp
@@ -77,9 +77,9 @@ static void InitializeAttoptCache(void)
ctl.hcxt = u_sess->cache_mem_cxt;
u_sess->cache_cxt.att_opt_cache_hash =
hash_create("Attopt cache", 256, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
-
+
/* Watch for invalidation events. */
- CacheRegisterSyscacheCallback(ATTNUM, InvalidateAttoptCacheCallback, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(ATTNUM, InvalidateAttoptCacheCallback, (Datum)0);
}
/*
diff --git a/src/common/backend/utils/cache/catcache.cpp b/src/common/backend/utils/cache/catcache.cpp
index 5bdb8f387..815bfdb41 100644
--- a/src/common/backend/utils/cache/catcache.cpp
+++ b/src/common/backend/utils/cache/catcache.cpp
@@ -49,6 +49,8 @@
#include "utils/fmgrtab.h"
#include "utils/hashutils.h"
#include "utils/inval.h"
+#include "utils/knl_catcache.h"
+#include "utils/knl_relcache.h"
#include "utils/lsyscache.h"
#include "utils/memutils.h"
#include "utils/rel.h"
@@ -94,21 +96,23 @@ static inline HeapTuple SearchCatCacheInternal(
static HeapTuple SearchCatCacheMiss(
CatCache* cache, int nkeys, uint32 hashValue, Index hashIndex, Datum v1, Datum v2, Datum v3, Datum v4, int level);
-static uint32 CatalogCacheComputeHashValue(CatCache* cache, int nkeys, Datum v1, Datum v2, Datum v3, Datum v4);
-static uint32 CatalogCacheComputeTupleHashValue(CatCache* cache, int nkeys, HeapTuple tuple);
-static inline bool CatalogCacheCompareTuple(
- const CatCache* cache, int nkeys, const Datum* cachekeys, const Datum* searchkeys);
-
#ifdef CATCACHE_STATS
static void CatCachePrintStats(int code, Datum arg);
#endif
+static CatCList* SearchCatCacheListMiss(CatCache* cache, int nkeys, Datum* arguments, uint32 lHashValue);
static void CatCacheRemoveCTup(CatCache* cache, CatCTup* ct);
static void CatCacheRemoveCList(CatCache* cache, CatCList* cl);
static void CatalogCacheInitializeCache(CatCache* cache);
static CatCTup* CatalogCacheCreateEntry(CatCache* cache, HeapTuple ntp, Datum* arguments, uint32 hashValue,
Index hashIndex, bool negative, bool isnailed = false);
-static void CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, const int* attnos, Datum* keys);
-static void CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, const int* attnos, Datum* srckeys, Datum* dstkeys);
+
+
+#ifndef ENABLE_MULTIPLE_NODES
+#define PROCALLARGS_KEY_NUM 4
+static uint32 CatalogCacheComputeTupleHashValueForProcAllArgs(
+ int* cc_keyno, TupleDesc cc_tupdesc, CCHashFN *cc_hashfunc, Oid cc_reloid, int nkeys, HeapTuple tuple);
+#endif
+
/*
* internal support functions
@@ -242,7 +246,7 @@ static uint32 uuidhashfast(Datum datum)
}
/* Lookup support functions for a type. */
-static void GetCCHashEqFuncs(Oid keytype, CCHashFN* hashfunc, RegProcedure* eqfunc, CCFastEqualFN* fasteqfunc)
+void GetCCHashEqFuncs(Oid keytype, CCHashFN* hashfunc, RegProcedure* eqfunc, CCFastEqualFN* fasteqfunc)
{
switch (keytype) {
case BOOLOID:
@@ -327,30 +331,29 @@ static void GetCCHashEqFuncs(Oid keytype, CCHashFN* hashfunc, RegProcedure* eqfu
*
* Compute the hash value associated with a given set of lookup keys
*/
-static uint32 CatalogCacheComputeHashValue(CatCache* cache, int nkeys, Datum v1, Datum v2, Datum v3, Datum v4)
+uint32 CatalogCacheComputeHashValue(CCHashFN *cc_hashfunc, int nkeys, Datum *arguments)
{
uint32 hashValue = 0;
uint32 oneHash;
- CCHashFN* cc_hashfunc = cache->cc_hashfunc;
switch (nkeys) {
case 4:
- oneHash = (cc_hashfunc[3])(v4);
+ oneHash = (cc_hashfunc[3])(arguments[3]);
hashValue ^= oneHash << 24;
hashValue ^= oneHash >> 8;
/* FALLTHROUGH */
case 3:
- oneHash = (cc_hashfunc[2])(v3);
+ oneHash = (cc_hashfunc[2])(arguments[2]);
hashValue ^= oneHash << 16;
hashValue ^= oneHash >> 16;
/* FALLTHROUGH */
case 2:
- oneHash = (cc_hashfunc[1])(v2);
+ oneHash = (cc_hashfunc[1])(arguments[1]);
hashValue ^= oneHash << 8;
hashValue ^= oneHash >> 24;
/* FALLTHROUGH */
case 1:
- oneHash = (cc_hashfunc[0])(v1);
+ oneHash = (cc_hashfunc[0])(arguments[0]);
hashValue ^= oneHash;
break;
default:
@@ -361,26 +364,19 @@ static uint32 CatalogCacheComputeHashValue(CatCache* cache, int nkeys, Datum v1,
return hashValue;
}
-/*
- * CatalogCacheComputeTupleHashValue
- *
- * Compute the hash value associated with a given tuple to be cached
- */
-static uint32 CatalogCacheComputeTupleHashValue(CatCache* cache, int nkeys, HeapTuple tuple)
+uint32 CatalogCacheComputeTupleHashValueInternal(
+ int* cc_keyno, TupleDesc cc_tupdesc, CCHashFN *cc_hashfunc, Oid cc_reloid, int nkeys, HeapTuple tuple)
{
Datum v1 = 0, v2 = 0, v3 = 0, v4 = 0;
bool isNull = false;
- int* cc_keyno = cache->cc_keyno;
- TupleDesc cc_tupdesc = cache->cc_tupdesc;
-
/* Now extract key fields from tuple, insert into scankey */
switch (nkeys) {
case 4:
v4 = (cc_keyno[3] == ObjectIdAttributeNumber) ? ObjectIdGetDatum(HeapTupleGetOid(tuple))
: fastgetattr(tuple, cc_keyno[3], cc_tupdesc, &isNull);
#ifndef ENABLE_MULTIPLE_NODES
- Assert(!isNull || (cache->cc_reloid == ProcedureRelationId));
+ Assert(!isNull || ((cc_reloid == ProcedureRelationId) && v4 == 0));
#else
Assert(!isNull);
#endif
@@ -393,10 +389,7 @@ static uint32 CatalogCacheComputeTupleHashValue(CatCache* cache, int nkeys, Heap
v2 = (cc_keyno[1] == ObjectIdAttributeNumber) ? ObjectIdGetDatum(HeapTupleGetOid(tuple))
: fastgetattr(tuple, cc_keyno[1], cc_tupdesc, &isNull);
#ifndef ENABLE_MULTIPLE_NODES
- if (unlikely(cache->cc_indexoid == ProcedureNameAllArgsNspIndexId && isNull)) {
- v2 = 0;
- }
- Assert(!isNull || (cache->cc_reloid == ProcedureRelationId));
+ Assert(!isNull || ((cc_reloid == ProcedureRelationId) && v2 == 0));
#else
Assert(!isNull);
#endif
@@ -411,7 +404,39 @@ static uint32 CatalogCacheComputeTupleHashValue(CatCache* cache, int nkeys, Heap
break;
}
- return CatalogCacheComputeHashValue(cache, nkeys, v1, v2, v3, v4);
+ Datum arguments[CATCACHE_MAXKEYS];
+ arguments[0] = v1;
+ arguments[1] = v2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+ return CatalogCacheComputeHashValue(cc_hashfunc, nkeys, arguments);
+}
+
+/*
+ * CatalogCacheComputeTupleHashValue
+ *
+ * Compute the hash value associated with a given tuple to be cached
+ */
+uint32 CatalogCacheComputeTupleHashValue(
+ int cc_id, int* cc_keyno, TupleDesc cc_tupdesc, CCHashFN *cc_hashfunc, Oid cc_reloid, int cc_nkeys, HeapTuple tup)
+{
+ uint32 hashValue;
+
+ switch (cc_id) {
+#ifndef ENABLE_MULTIPLE_NODES
+ case PROCALLARGS: {
+ hashValue = CatalogCacheComputeTupleHashValueForProcAllArgs(
+ cc_keyno, cc_tupdesc, cc_hashfunc, cc_reloid, cc_nkeys, tup);
+ break;
+ }
+#endif
+ default:
+ hashValue = CatalogCacheComputeTupleHashValueInternal(
+ cc_keyno, cc_tupdesc, cc_hashfunc, cc_reloid, cc_nkeys, tup);
+ break;
+ }
+
+ return hashValue;
}
/*
@@ -419,10 +444,9 @@ static uint32 CatalogCacheComputeTupleHashValue(CatCache* cache, int nkeys, Heap
*
* Compare a tuple to the passed arguments.
*/
-static inline bool CatalogCacheCompareTuple(
- const CatCache* cache, int nkeys, const Datum* cachekeys, const Datum* searchkeys)
+bool CatalogCacheCompareTuple(
+ const CCFastEqualFN *cc_fastequal, int nkeys, const Datum* cachekeys, const Datum* searchkeys)
{
- const CCFastEqualFN* cc_fastequal = cache->cc_fastequal;
int i;
for (i = 0; i < nkeys; i++) {
@@ -546,7 +570,7 @@ static void CatCacheRemoveCList(CatCache* cache, CatCList* cl)
/* delink from member tuples */
for (i = cl->n_members; --i >= 0;) {
- CatCTup* ct = cl->members[i];
+ CatCTup* ct = cl->systups[i];
Assert(ct->c_list == cl);
ct->c_list = NULL;
@@ -587,6 +611,10 @@ static void CatCacheRemoveCList(CatCache* cache, CatCList* cl)
*/
void CatalogCacheIdInvalidate(int cacheId, uint32 hashValue)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->systabcache.CacheIdHashValueInvalidateLocal(cacheId, hashValue);
+ return;
+ }
CatCache* ccp = NULL;
CACHE3_elog(DEBUG2, "CatalogCacheIdInvalidate: called, cacheId %d, hashValue: %d", cacheId, hashValue);
@@ -674,6 +702,10 @@ void CatalogCacheIdInvalidate(int cacheId, uint32 hashValue)
*/
void AtEOXact_CatCache(bool isCommit)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->systabcache.AtEOXact_CatCache(isCommit);
+ return;
+ }
#ifdef USE_ASSERT_CHECKING
if (assert_enabled) {
CatCache* ccp = NULL;
@@ -768,6 +800,10 @@ static void ResetCatalogCache(CatCache* cache)
*/
void ResetCatalogCaches(void)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->systabcache.ResetCatalogCaches();
+ return;
+ }
CatCache* cache = NULL;
if (!RecoveryInProgress()) {
@@ -796,6 +832,10 @@ void ResetCatalogCaches(void)
*/
void CatalogCacheFlushCatalog(Oid catId)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->systabcache.CatalogCacheFlushCatalogLocal(catId);
+ return;
+ }
CatCache* cache = NULL;
CACHE2_elog(DEBUG2, "CatalogCacheFlushCatalog called for %u", catId);
@@ -807,7 +847,7 @@ void CatalogCacheFlushCatalog(Oid catId)
ResetCatalogCache(cache);
/* Tell inval.c to call syscache callbacks for this cache */
- CallSyscacheCallbacks(cache->id, 0);
+ CallSessionSyscacheCallbacks(cache->id, 0);
}
}
@@ -1121,9 +1161,9 @@ void InitCatCachePhase2(CatCache* cache, bool touch_index)
* pg_authid and pg_auth_members syscaches for authentication even if
* we don't yet have relcache entries for those catalogs' indexes.
*/
-static bool IndexScanOK(CatCache* cache, ScanKey cur_skey)
+bool IndexScanOK(int cache_id)
{
- switch (cache->id) {
+ switch (cache_id) {
case INDEXRELID:
/*
@@ -1132,7 +1172,7 @@ static bool IndexScanOK(CatCache* cache, ScanKey cur_skey)
* just force all pg_index searches to be heap scans until we've
* built the critical relcaches.
*/
- if (!u_sess->relcache_cxt.criticalRelcachesBuilt)
+ if (!LocalRelCacheCriticalRelcachesBuilt())
return false;
break;
@@ -1156,7 +1196,7 @@ static bool IndexScanOK(CatCache* cache, ScanKey cur_skey)
* Protect authentication lookups occurring before relcache has
* collected entries for shared indexes.
*/
- if (!u_sess->relcache_cxt.criticalSharedRelcachesBuilt)
+ if (!LocalRelCacheCriticalSharedRelcachesBuilt())
return false;
break;
default:
@@ -1231,6 +1271,8 @@ void SearchCatCacheCheck(){
*/
HeapTuple SearchCatCacheInternal(CatCache* cache, int nkeys, Datum v1, Datum v2, Datum v3, Datum v4, int level)
{
+ /* dont call SearchCatCache , call SearchSysCache instead */
+ Assert(!EnableLocalSysCache());
Datum arguments[CATCACHE_MAXKEYS];
uint32 hashValue;
Index hashIndex;
@@ -1260,7 +1302,7 @@ HeapTuple SearchCatCacheInternal(CatCache* cache, int nkeys, Datum v1, Datum v2,
/*
* find the hash bucket in which to look for the tuple
*/
- hashValue = CatalogCacheComputeHashValue(cache, nkeys, v1, v2, v3, v4);
+ hashValue = CatalogCacheComputeHashValue(cache->cc_hashfunc, nkeys, arguments);
hashIndex = HASH_INDEX(hashValue, (uint32)cache->cc_nbuckets);
/*
@@ -1276,7 +1318,7 @@ HeapTuple SearchCatCacheInternal(CatCache* cache, int nkeys, Datum v1, Datum v2,
if (ct->hash_value != hashValue)
continue; /* quickly skip entry if wrong hash val */
- if (!CatalogCacheCompareTuple(cache, nkeys, ct->keys, arguments))
+ if (!CatalogCacheCompareTuple(cache->cc_fastequal, nkeys, ct->keys, arguments))
continue;
/*
@@ -1327,7 +1369,7 @@ HeapTuple CreateHeapTuple4BuiltinFunc(const Builtin_func* func, TupleDesc desc);
* one buitin function if it exists. Then we create the heap tuple by the infomation we get from builtin
* function arrarys,and return it.
*/
-static HeapTuple SearchBuiltinProcByNameArgNsp(CatCache* cache, int nkeys, Datum* arguments)
+static HeapTuple SearchBuiltinProcByNameArgNsp(int nkeys, Datum* arguments)
{
char* funcname = NULL;
oidvector* argtypes = NULL;
@@ -1390,7 +1432,7 @@ static HeapTuple SearchBuiltinProcByNameArgNsp(CatCache* cache, int nkeys, Datum
* oid is the unique index for builtin functions, so we can find only one buitin function if it exists.
* Then we create the heap tuple by the infomation we get from builtin function arrarys,and return it.
*/
-static HeapTuple SearchBuiltinProcByOid(CatCache* cache, int nkeys, Datum* arguments)
+static HeapTuple SearchBuiltinProcByOid(int nkeys, Datum* arguments)
{
const Builtin_func* bfunc = NULL;
@@ -1417,18 +1459,18 @@ static HeapTuple SearchBuiltinProcByOid(CatCache* cache, int nkeys, Datum* argum
* index for builtin functions. We can get the search mode infomation from cache to determine which
* function will be called for processing
*/
-static HeapTuple SearchBuiltinProcCacheMiss(CatCache* cache, int nkeys, Datum* arguments)
+HeapTuple SearchBuiltinProcCacheMiss(int cache_id, int nkeys, Datum* arguments)
{
- if (CacheIsProcNameArgNsp(cache)) {
- return SearchBuiltinProcByNameArgNsp(cache, nkeys, arguments);
- } else if (CacheIsProcOid(cache)) {
- return SearchBuiltinProcByOid(cache, nkeys, arguments);
+ if (CacheIsProcNameArgNsp(cache_id)) {
+ return SearchBuiltinProcByNameArgNsp(nkeys, arguments);
+ } else if (CacheIsProcOid(cache_id)) {
+ return SearchBuiltinProcByOid(nkeys, arguments);
} else {
return NULL;
}
}
-static HeapTuple GetPgAttributeAttrTuple(TupleDesc tupleDesc, const Form_pg_attribute attr)
+HeapTuple GetPgAttributeAttrTuple(TupleDesc tupleDesc, const Form_pg_attribute attr)
{
Datum values[Natts_pg_attribute];
bool isnull[Natts_pg_attribute];
@@ -1471,7 +1513,7 @@ static HeapTuple GetPgAttributeAttrTuple(TupleDesc tupleDesc, const Form_pg_attr
return heap_form_tuple(tupleDesc, values, isnull);
}
-static HeapTuple SearchPgAttributeCacheMiss(CatCache* cache, int nkeys, const Datum* arguments)
+HeapTuple SearchPgAttributeCacheMiss(int cache_id, TupleDesc cc_tupdesc, int nkeys, const Datum* arguments)
{
Assert(nkeys == 2);
Oid relOid = DatumGetObjectId(arguments[0]);
@@ -1481,15 +1523,16 @@ static HeapTuple SearchPgAttributeCacheMiss(CatCache* cache, int nkeys, const Da
}
const FormData_pg_attribute* catlogAttrs = catalogDesc.attrs;
FormData_pg_attribute tempAttr;
- if (cache->id == ATTNUM) {
+ if (cache_id == ATTNUM) {
int16 attNum = DatumGetInt16(arguments[1]);
Form_pg_attribute attr;
if (attNum < 0) {
- /* The system table does not have the bucket column, so incoming false */
- if ((attNum == ObjectIdAttributeNumber && !catalogDesc.hasoids) || attNum == BucketIdAttributeNumber) {
+ /* The system table does not have the bucket column or uids column, so incoming false */
+ if ((attNum == ObjectIdAttributeNumber && !catalogDesc.hasoids) || attNum == BucketIdAttributeNumber ||
+ attNum == UidAttributeNumber) {
return NULL;
}
- attr = SystemAttributeDefinition(attNum, catalogDesc.hasoids, false);
+ attr = SystemAttributeDefinition(attNum, catalogDesc.hasoids, false, false);
attr->attrelid = relOid;
} else if (attNum <= catalogDesc.natts && attNum > 0) {
tempAttr = catlogAttrs[attNum - 1];
@@ -1497,14 +1540,14 @@ static HeapTuple SearchPgAttributeCacheMiss(CatCache* cache, int nkeys, const Da
} else {
return NULL;
}
- return GetPgAttributeAttrTuple(cache->cc_tupdesc, attr);
- } else if (cache->id == ATTNAME) {
+ return GetPgAttributeAttrTuple(cc_tupdesc, attr);
+ } else if (cache_id == ATTNAME) {
Form_pg_attribute attr;
for (int16 attnum = 0; attnum < catalogDesc.natts; attnum++) {
tempAttr = catlogAttrs[attnum];
attr = &tempAttr;
if (strcmp(NameStr(*DatumGetName(arguments[1])), NameStr(attr->attname)) == 0) {
- return GetPgAttributeAttrTuple(cache->cc_tupdesc, attr);
+ return GetPgAttributeAttrTuple(cc_tupdesc, attr);
}
}
attr = SystemAttributeByName(NameStr(*DatumGetName(arguments[1])), catalogDesc.hasoids);
@@ -1512,11 +1555,11 @@ static HeapTuple SearchPgAttributeCacheMiss(CatCache* cache, int nkeys, const Da
return NULL;
}
attr->attrelid = relOid;
- return GetPgAttributeAttrTuple(cache->cc_tupdesc, attr);
+ return GetPgAttributeAttrTuple(cc_tupdesc, attr);
} else {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("pg_attribute does not have syscache with id %d", cache->id)));
+ errmsg("pg_attribute does not have syscache with id %d", cache_id)));
}
return NULL;
}
@@ -1557,10 +1600,10 @@ static HeapTuple SearchCatCacheMiss(
cur_skey[3].sk_argument = v4;
/* For search a function, we firstly try to search it in built-in function list */
- if (IsProcCache(cache) && u_sess->attr.attr_common.IsInplaceUpgrade == false) {
+ if (IsProcCache(cache->cc_reloid) && u_sess->attr.attr_common.IsInplaceUpgrade == false) {
CACHE2_elog(DEBUG2, "SearchCatCacheMiss(%d): function not found in pg_proc", cache->id);
- ntp = SearchBuiltinProcCacheMiss(cache, nkeys, arguments);
+ ntp = SearchBuiltinProcCacheMiss(cache->id, nkeys, arguments);
if (HeapTupleIsValid(ntp)) {
CACHE2_elog(DEBUG2, "SearchCatCacheMiss(%d): match a built-in function", cache->id);
ct = CatalogCacheCreateEntry(cache, ntp, arguments, hashValue, hashIndex, false);
@@ -1573,9 +1616,9 @@ static HeapTuple SearchCatCacheMiss(
}
/* Insert hardcoded system catalogs' attributes into pg_attribute's syscache. */
- if (IsAttributeCache(cache) && IsSystemObjOid(DatumGetObjectId(arguments[0]))) {
+ if (IsAttributeCache(cache->cc_reloid) && IsSystemObjOid(DatumGetObjectId(arguments[0]))) {
CACHE2_elog(DEBUG2, "SearchCatCacheMiss: cat tuple not in cat cache %d", cache->id);
- ntp = SearchPgAttributeCacheMiss(cache, nkeys, arguments);
+ ntp = SearchPgAttributeCacheMiss(cache->id, cache->cc_tupdesc, nkeys, arguments);
if (HeapTupleIsValid(ntp)) {
ct = CatalogCacheCreateEntry(cache, ntp, arguments, hashValue, hashIndex, false);
heap_freetuple(ntp);
@@ -1606,7 +1649,7 @@ static HeapTuple SearchCatCacheMiss(
ereport(DEBUG1, (errmsg("cache->cc_reloid - %d", cache->cc_reloid)));
scandesc = systable_beginscan(
- relation, cache->cc_indexoid, IndexScanOK(cache, cur_skey), NULL, nkeys, cur_skey);
+ relation, cache->cc_indexoid, IndexScanOK(cache->id), NULL, nkeys, cur_skey);
while (HeapTupleIsValid(ntp = systable_getnext(scandesc))) {
ct = CatalogCacheCreateEntry(cache, ntp, arguments, hashValue, hashIndex, false);
@@ -1667,6 +1710,8 @@ static HeapTuple SearchCatCacheMiss(
return &ct->tuple;
}
+
+
/*
* ReleaseCatCache
*
@@ -1680,6 +1725,8 @@ static HeapTuple SearchCatCacheMiss(
*/
void ReleaseCatCache(HeapTuple tuple)
{
+ /* dont call ReleaseCatCache , call ReleaseSysCache instead */
+ Assert(!EnableLocalSysCache());
CatCTup* ct = (CatCTup*)(((char*)tuple) - offsetof(CatCTup, tuple));
/* Safety checks to ensure we were handed a cache entry */
@@ -1717,7 +1764,12 @@ uint32 GetCatCacheHashValue(CatCache* cache, Datum v1, Datum v2, Datum v3, Datum
/*
* calculate the hash value
*/
- return CatalogCacheComputeHashValue(cache, cache->cc_nkeys, v1, v2, v3, v4);
+ Datum arguments[CATCACHE_MAXKEYS];
+ arguments[0] = v1;
+ arguments[1] = v2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+ return CatalogCacheComputeHashValue(cache->cc_hashfunc, cache->cc_nkeys, arguments);
}
HeapTuple CreateHeapTuple4BuiltinFuncDesc(const Builtin_func* func, TupleDesc desc)
@@ -2054,7 +2106,7 @@ HeapTuple CreateHeapTuple4BuiltinFunc(const Builtin_func* func, TupleDesc desc)
* generic arrays, but they support only one-dimensional arrays with no
* nulls (and no null bitmap).
*/
- oidvector* dummy = MakeMd5HashArgTypes((oidvector*)allParameterTypes);
+ oidvector* dummy = MakeMd5HashOids((oidvector*)allParameterTypes);
values[Anum_pg_proc_allargtypes - 1] = PointerGetDatum(dummy);
values[Anum_pg_proc_allargtypesext - 1] = PointerGetDatum(allParameterTypes);
@@ -2169,7 +2221,8 @@ CatCTup* CreateCatCTup(CatCache* cache, Datum* arguments, HeapTuple ntp)
Index hashIndex;
Dlelem* elt = NULL;
- hashValue = CatalogCacheComputeTupleHashValue(cache, cache->cc_nkeys, ntp);
+ hashValue = CatalogCacheComputeTupleHashValue(cache->id, cache->cc_keyno, cache->cc_tupdesc, cache->cc_hashfunc,
+ cache->cc_reloid, cache->cc_nkeys, ntp);
hashIndex = HASH_INDEX(hashValue, (uint32)cache->cc_nbuckets);
for (elt = DLGetHead(&cache->cc_bucket[hashIndex]); elt; elt = DLGetSucc(elt)) {
@@ -2227,13 +2280,14 @@ List* SearchPgAttributeCacheList(CatCache* cache, int nkey, Datum* arguments, Li
if (!catalogDesc.hasoids && index == 1) {
continue;
}
- /* The system table does not have the bucket column, so incoming false */
- attr = SystemAttributeDefinition(-(index + 1), catalogDesc.hasoids, false);
+ /* The system table does not have the bucket column or uid column, so incoming false */
+ attr = SystemAttributeDefinition(-(index + 1), catalogDesc.hasoids, false, false);
attr->attrelid = relOid;
}
heapTuple = GetPgAttributeAttrTuple(cache->cc_tupdesc, attr);
cTup = NULL;
- hashValue = CatalogCacheComputeTupleHashValue(cache, cache->cc_nkeys, heapTuple);
+ hashValue = CatalogCacheComputeTupleHashValue(cache->id, cache->cc_keyno, cache->cc_tupdesc,
+ cache->cc_hashfunc, cache->cc_reloid, cache->cc_nkeys, heapTuple);
hashIndex = HASH_INDEX(hashValue, static_cast(cache->cc_nbuckets));
for (dlelem = DLGetHead(&cache->cc_bucket[hashIndex]); dlelem; dlelem = DLGetSucc(dlelem)) {
@@ -2456,18 +2510,13 @@ void InsertBuiltinFuncDescInBootstrap()
*/
CatCList* SearchCatCacheList(CatCache* cache, int nkeys, Datum v1, Datum v2, Datum v3, Datum v4)
{
+ /* dont call SearchCatCacheList , call SearchSysCacheList instead */
+ Assert(!EnableLocalSysCache());
+
Datum arguments[CATCACHE_MAXKEYS];
uint32 lHashValue;
Dlelem* elt = NULL;
CatCList* cl = NULL;
- CatCTup* ct = NULL;
- List* volatile ctlist = NULL;
- ListCell* ctlist_item = NULL;
- int nmembers;
- bool ordered = false;
- HeapTuple ntp;
- MemoryContext oldcxt;
- int i;
SearchCatCacheCheck();
@@ -2490,12 +2539,11 @@ CatCList* SearchCatCacheList(CatCache* cache, int nkeys, Datum v1, Datum v2, Dat
arguments[3] = v4;
/*
-
* compute a hash value of the given keys for faster search. We don't
* presently divide the CatCList items into buckets, but this still lets
* us skip non-matching items quickly most of the time.
*/
- lHashValue = CatalogCacheComputeHashValue(cache, nkeys, v1, v2, v3, v4);
+ lHashValue = CatalogCacheComputeHashValue(cache->cc_hashfunc, nkeys, arguments);
/*
* scan the items until we find a match or exhaust our list
@@ -2515,7 +2563,7 @@ CatCList* SearchCatCacheList(CatCache* cache, int nkeys, Datum v1, Datum v2, Dat
if (cl->nkeys != nkeys)
continue;
- if (!CatalogCacheCompareTuple(cache, nkeys, cl->keys, arguments))
+ if (!CatalogCacheCompareTuple(cache->cc_fastequal, nkeys, cl->keys, arguments))
continue;
/*
@@ -2541,6 +2589,22 @@ CatCList* SearchCatCacheList(CatCache* cache, int nkeys, Datum v1, Datum v2, Dat
return cl;
}
+ return SearchCatCacheListMiss(cache, nkeys, arguments, lHashValue);
+}
+
+static CatCList* SearchCatCacheListMiss(CatCache* cache, int nkeys, Datum* arguments, uint32 lHashValue)
+{
+ Dlelem* elt = NULL;
+ CatCList* cl = NULL;
+ CatCTup* ct = NULL;
+ List* volatile ctlist = NULL;
+ ListCell* ctlist_item = NULL;
+ int nmembers;
+ bool ordered = false;
+ HeapTuple ntp;
+ MemoryContext oldcxt;
+ int i;
+
/*
* List was not found in cache, so we have to build it by reading the
* relation. For each matching tuple found in the relation, use an
@@ -2559,11 +2623,12 @@ CatCList* SearchCatCacheList(CatCache* cache, int nkeys, Datum v1, Datum v2, Dat
* which has the same name with the one we want to find, lappend it
* into the ctlist
*/
- if (IsProcCache(cache) && CacheIsProcNameArgNsp(cache) && u_sess->attr.attr_common.IsInplaceUpgrade == false) {
+ if (IsProcCache(cache->cc_reloid) && CacheIsProcNameArgNsp(cache->id) &&
+ u_sess->attr.attr_common.IsInplaceUpgrade == false) {
ctlist = SearchBuiltinProcCacheList(cache, nkeys, arguments, ctlist);
}
- if (IsAttributeCache(cache) && IsSystemObjOid(DatumGetObjectId(arguments[0]))) {
+ if (IsAttributeCache(cache->cc_reloid) && IsSystemObjOid(DatumGetObjectId(arguments[0]))) {
ctlist = SearchPgAttributeCacheList(cache, nkeys, arguments, ctlist);
}
@@ -2581,15 +2646,15 @@ CatCList* SearchCatCacheList(CatCache* cache, int nkeys, Datum v1, Datum v2, Dat
rc = memcpy_s(
cur_skey, sizeof(ScanKeyData) * CATCACHE_MAXKEYS, cache->cc_skey, sizeof(ScanKeyData) * cache->cc_nkeys);
securec_check(rc, "", "");
- cur_skey[0].sk_argument = v1;
- cur_skey[1].sk_argument = v2;
- cur_skey[2].sk_argument = v3;
- cur_skey[3].sk_argument = v4;
+ cur_skey[0].sk_argument = arguments[0];
+ cur_skey[1].sk_argument = arguments[1];
+ cur_skey[2].sk_argument = arguments[2];
+ cur_skey[3].sk_argument = arguments[3];
relation = heap_open(cache->cc_reloid, AccessShareLock);
scandesc = systable_beginscan(
- relation, cache->cc_indexoid, IndexScanOK(cache, cur_skey), NULL, nkeys, cur_skey);
+ relation, cache->cc_indexoid, IndexScanOK(cache->id), NULL, nkeys, cur_skey);
/* The list will be ordered iff we are doing an index scan */
ordered = (scandesc->irel != NULL);
@@ -2598,14 +2663,14 @@ CatCList* SearchCatCacheList(CatCache* cache, int nkeys, Datum v1, Datum v2, Dat
uint32 hashValue;
Index hashIndex;
- if (IsProcCache(cache) && IsSystemObjOid(HeapTupleGetOid(ntp)) &&
+ if (IsProcCache(cache->cc_reloid) && IsSystemObjOid(HeapTupleGetOid(ntp)) &&
u_sess->attr.attr_common.IsInplaceUpgrade == false) {
continue;
}
- if (IsAttributeCache(cache)) {
+ if (IsAttributeCache(cache->cc_reloid)) {
bool attIsNull = false;
- Oid attrelid = DatumGetObjectId(SysCacheGetAttr(cache->id, ntp,
- Anum_pg_attribute_attrelid, &attIsNull));
+ Oid attrelid = DatumGetObjectId(
+ SysCacheGetAttr(cache->id, ntp, Anum_pg_attribute_attrelid, &attIsNull));
if (IsSystemObjOid(attrelid) && IsValidCatalogParam(GetCatalogParam(attrelid))) {
continue;
}
@@ -2615,27 +2680,28 @@ CatCList* SearchCatCacheList(CatCache* cache, int nkeys, Datum v1, Datum v2, Dat
* See if there's an entry for this tuple already.
*/
ct = NULL;
- hashValue = CatalogCacheComputeTupleHashValue(cache, cache->cc_nkeys, ntp);
+ hashValue = CatalogCacheComputeTupleHashValue(cache->id, cache->cc_keyno, cache->cc_tupdesc,
+ cache->cc_hashfunc, cache->cc_reloid, cache->cc_nkeys, ntp);
hashIndex = HASH_INDEX(hashValue, static_cast(cache->cc_nbuckets));
for (elt = DLGetHead(&cache->cc_bucket[hashIndex]); elt; elt = DLGetSucc(elt)) {
ct = (CatCTup*)DLE_VAL(elt);
-
+ /* ignore dead and negative entries */
if (ct->dead || ct->negative)
- continue; /* ignore dead and negative entries */
-
+ continue;
+ /* quickly skip entry if wrong hash val */
if (ct->hash_value != hashValue)
- continue; /* quickly skip entry if wrong hash val */
+ continue;
/* A built-in function is all in pg_proc, in upgrade senario, we skip searching
* the builtin functions from builtin function array. In non-upgrade mode, the function
* found from heap must exist in builtin array.
*/
- if (IsProcCache(cache) && IsSystemObjOid(HeapTupleGetOid(&(ct->tuple))) &&
+ if (IsProcCache(cache->cc_reloid) && IsSystemObjOid(HeapTupleGetOid(&(ct->tuple))) &&
u_sess->attr.attr_common.IsInplaceUpgrade == false) {
continue;
}
- if (IsAttributeCache(cache)) {
+ if (IsAttributeCache(cache->cc_reloid)) {
bool attIsNull = false;
Oid attrelid = DatumGetObjectId(SysCacheGetAttr(cache->id, &(ct->tuple),
Anum_pg_attribute_attrelid, &attIsNull));
@@ -2684,7 +2750,8 @@ CatCList* SearchCatCacheList(CatCache* cache, int nkeys, Datum v1, Datum v2, Dat
*/
oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
nmembers = list_length(ctlist);
- cl = (CatCList*)palloc(offsetof(CatCList, members) + (nmembers + 1) * sizeof(CatCTup*));
+ cl = (CatCList*)palloc(sizeof(CatCList) + (nmembers) * sizeof(CatCTup*));
+ cl->systups = (CatCTup**)(((char *)cl) + sizeof(CatCList));
/* Extract key values */
CatCacheCopyKeys(cache->cc_tupdesc, nkeys, cache->cc_keyno, arguments, cl->keys);
@@ -2718,7 +2785,7 @@ CatCList* SearchCatCacheList(CatCache* cache, int nkeys, Datum v1, Datum v2, Dat
i = 0;
foreach (ctlist_item, ctlist) {
- cl->members[i++] = ct = (CatCTup*)lfirst(ctlist_item);
+ cl->systups[i++] = ct = (CatCTup*)lfirst(ctlist_item);
Assert(ct->c_list == NULL);
ct->c_list = cl;
/* release the temporary refcount on the member */
@@ -2769,6 +2836,8 @@ ct->refcount == 0 && (ct->c_list == NULL || ct->c_list->refcount == 0))
*/
void ReleaseCatCacheList(CatCList* list)
{
+ /* dont call ReleaseCatCacheList , call ReleaseSysCacheList instead */
+ Assert(!EnableLocalSysCache());
/* Safety checks to ensure we were handed a cache entry */
Assert(list->cl_magic == CL_MAGIC);
Assert(list->refcount > 0);
@@ -2884,7 +2953,7 @@ static CatCTup* CatalogCacheCreateEntry(
/*
* Helper routine that frees keys stored in the keys array.
*/
-static void CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, const int* attnos, Datum* keys)
+void CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, const int* attnos, Datum* keys)
{
int i;
@@ -2897,7 +2966,8 @@ static void CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, const int* attnos, Da
Assert(attnum > 0);
if (!tupdesc->attrs[attnum - 1]->attbyval) {
- pfree(DatumGetPointer(keys[i]));
+ void *ptr = DatumGetPointer(keys[i]);
+ pfree_ext(ptr);
keys[i] = (Datum)NULL;
}
}
@@ -2908,7 +2978,7 @@ static void CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, const int* attnos, Da
* one, guaranteeing that the datums are fully allocated in the current memory
* context.
*/
-static void CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, const int* attnos, Datum* srckeys, Datum* dstkeys)
+void CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, const int* attnos, Datum* srckeys, Datum* dstkeys)
{
int i;
@@ -2980,6 +3050,11 @@ static void CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, const int* attnos, Da
void PrepareToInvalidateCacheTuple(
Relation relation, HeapTuple tuple, HeapTuple newtuple, void (*function)(int, uint32, Oid))
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->systabcache.PrepareToInvalidateCacheTuple(
+ relation, tuple, newtuple, function);
+ return;
+ }
CatCache* ccp = NULL;
Oid reloid;
@@ -3015,7 +3090,8 @@ void PrepareToInvalidateCacheTuple(
if (ccp->cc_tupdesc == NULL)
CatalogCacheInitializeCache(ccp);
- hashvalue = CatalogCacheComputeTupleHashValue(ccp, ccp->cc_nkeys, tuple);
+ hashvalue = CatalogCacheComputeTupleHashValue(ccp->id, ccp->cc_keyno, ccp->cc_tupdesc, ccp->cc_hashfunc,
+ ccp->cc_reloid, ccp->cc_nkeys, tuple);
dbid = ccp->cc_relisshared ? (Oid)0 : u_sess->proc_cxt.MyDatabaseId;
(*function)(ccp->id, hashvalue, dbid);
@@ -3023,7 +3099,8 @@ void PrepareToInvalidateCacheTuple(
if (newtuple) {
uint32 newhashvalue;
- newhashvalue = CatalogCacheComputeTupleHashValue(ccp, ccp->cc_nkeys, newtuple);
+ newhashvalue = CatalogCacheComputeTupleHashValue(ccp->id, ccp->cc_keyno, ccp->cc_tupdesc,
+ ccp->cc_hashfunc, ccp->cc_reloid, ccp->cc_nkeys, newtuple);
if (newhashvalue != hashvalue)
(*function)(ccp->id, newhashvalue, dbid);
@@ -3059,3 +3136,288 @@ void PrintCatCacheListLeakWarning(CatCList* list)
list->my_cache->id,
list->refcount)));
}
+
+
+#ifndef ENABLE_MULTIPLE_NODES
+/*
+ * Specific CatalogCacheComputeTupleHashValue Function to support ProcedureCreate!
+ */
+static uint32 CatalogCacheComputeTupleHashValueForProcAllArgs(
+ int* cc_keyno, TupleDesc cc_tupdesc, CCHashFN *cc_hashfunc, Oid cc_reloid, int nkeys, HeapTuple tuple)
+{
+ Assert(nkeys == PROCALLARGS_KEY_NUM);
+ Assert(HeapTupleIsValid(tuple));
+
+ Datum v1 = 0, v2 = 0, v3 = 0, v4 = 0;
+ uint32 hashValue;
+
+ bool isNull = false;
+
+ /* Extract key fields from tuple */
+ v1 = fastgetattr(tuple, cc_keyno[0], cc_tupdesc, &isNull);
+ Assert(!isNull);
+
+ v2 = fastgetattr(tuple, cc_keyno[1], cc_tupdesc, &isNull);
+ Assert(!isNull);
+
+ /*
+ * Comput hashvaule with concat key2 and argmodes
+ * Function with same paramterTypes and different argmodes
+ * should have different hashkeys.
+ */
+ oidvector* allArgTypes = (oidvector*)DatumGetPointer(v2);
+ Assert(allArgTypes != NULL);
+
+ Datum tmp = heap_getattr(tuple, Anum_pg_proc_proargmodes, cc_tupdesc, &isNull);
+
+ oidvector* argModes = ConvertArgModesToMd5Vector(tmp);
+ oidvector* v2WithArgModes = MergeOidVector(allArgTypes, argModes);
+
+ pfree_ext(argModes);
+
+ Datum newKey2 = PointerGetDatum(v2WithArgModes);
+
+ v3 = fastgetattr(tuple, cc_keyno[2], cc_tupdesc, &isNull);
+ Assert(!isNull);
+
+ v4 = fastgetattr(tuple, cc_keyno[3], cc_tupdesc, &isNull);
+ Assert(!isNull);
+
+ Datum arguments[CATCACHE_MAXKEYS];
+ arguments[0] = v1;
+ arguments[1] = newKey2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+ hashValue = CatalogCacheComputeHashValue(cc_hashfunc, nkeys, arguments);
+
+ pfree_ext(v2WithArgModes);
+ return hashValue;
+}
+
+static bool SearchHashBucketWithArgModes(
+ CatCache* cache, int nkeys, uint32 hashValue, const Datum* searchkeys, oidvector* argModes, HeapTuple *tuple)
+{
+ bool found = false;
+ Dlelem* elt = NULL;
+ CatCTup* ct = NULL;
+
+ Index hashIndex = HASH_INDEX(hashValue, (uint32)cache->cc_nbuckets);
+ /*
+ * scan the hash bucket until we find a match or exhaust our tuples
+ */
+ for (elt = DLGetHead(&cache->cc_bucket[hashIndex]); elt; elt = DLGetSucc(elt)) {
+
+ ct = (CatCTup*)DLE_VAL(elt);
+
+ if (ct->dead)
+ continue; /* ignore dead entries */
+
+ if (ct->hash_value != hashValue)
+ continue; /* quickly skip entry if wrong hash val */
+
+ if (!CatalogCacheCompareTuple(cache->cc_fastequal, nkeys, ct->keys, searchkeys))
+ continue;
+
+ /*
+ * The comparison of hashvalue and keys is not enough.
+ */
+ if (!IsProArgModesEqualByTuple(&ct->tuple, cache->cc_tupdesc, argModes)) {
+ continue;
+ }
+
+ /*
+ * We found a match in the cache. Move it to the front of the list
+ * for its hashbucket, in order to speed subsequent searches. (The
+ * most frequently accessed elements in any hashbucket will tend to be
+ * near the front of the hashbucket's list.)
+ */
+ DLMoveToFront(&ct->cache_elem);
+
+ /*
+ * If it's a positive entry, bump its refcount and return it. If it's
+ * negative, we can report failure to the caller.
+ */
+ if (!ct->negative && t_thrd.utils_cxt.CurrentResourceOwner != NULL) {
+ ResourceOwnerEnlargeCatCacheRefs(t_thrd.utils_cxt.CurrentResourceOwner);
+ ct->refcount++;
+ ResourceOwnerRememberCatCacheRef(t_thrd.utils_cxt.CurrentResourceOwner, &ct->tuple);
+
+ CACHE3_elog(DEBUG2, "SearchCatCache(%s): found in bucket %d", cache->cc_relname, hashIndex);
+
+#ifdef CATCACHE_STATS
+ cache->cc_hits++;
+#endif
+
+ *tuple = &ct->tuple;
+ found = true;
+ break;
+ }
+ }
+ return found;
+}
+
+/*
+ * Specific SearchCatCacheMiss Function to support ProcedureCreate!
+ */
+static HeapTuple SearchCatCacheMissWithArgModes(CatCache* cache, int nkeys, uint32 hashValue,
+ Datum* arguments, oidvector* argModes)
+{
+ Assert(cache->id == PROCALLARGS);
+
+ ScanKeyData cur_skey[CATCACHE_MAXKEYS];
+ Relation relation;
+ SysScanDesc scandesc;
+ HeapTuple ntp;
+ CatCTup* ct = NULL;
+ errno_t rc = EOK;
+
+ Index hashIndex = HASH_INDEX(hashValue, (uint32)cache->cc_nbuckets);
+
+ /*
+ * Ok, need to make a lookup in the relation, copy the scankey and fill
+ * out any per-call fields.
+ */
+ rc = memcpy_s(cur_skey, sizeof(ScanKeyData) * CATCACHE_MAXKEYS, cache->cc_skey, sizeof(ScanKeyData) * nkeys);
+ securec_check(rc, "", "");
+ cur_skey[0].sk_argument = arguments[0];
+ cur_skey[1].sk_argument = arguments[1];
+ cur_skey[2].sk_argument = arguments[2];
+ cur_skey[3].sk_argument = arguments[3];
+
+ relation = heap_open(cache->cc_reloid, AccessShareLock);
+
+ ereport(DEBUG1, (errmsg("cache->cc_reloid - %d", cache->cc_reloid)));
+
+ scandesc = systable_beginscan(
+ relation, cache->cc_indexoid, IndexScanOK(cache->id), NULL, nkeys, cur_skey);
+
+ while (HeapTupleIsValid(ntp = systable_getnext(scandesc))) {
+
+ /*
+ * The key2 (pg_proc_allargtypes) can be duplicate in table.
+ * We need to compare the proargmodes to make sure the function is correct.
+ */
+ if (!IsProArgModesEqualByTuple(ntp, cache->cc_tupdesc, argModes)) {
+ continue;
+ }
+
+ ct = CatalogCacheCreateEntry(cache, ntp, arguments, hashValue, hashIndex, false);
+
+ /* immediately set the refcount to 1 */
+ ResourceOwnerEnlargeCatCacheRefs(t_thrd.utils_cxt.CurrentResourceOwner);
+ ct->refcount++;
+ ResourceOwnerRememberCatCacheRef(t_thrd.utils_cxt.CurrentResourceOwner, &ct->tuple);
+ break; /* assume only one match */
+ }
+
+ systable_endscan(scandesc);
+
+ heap_close(relation, AccessShareLock);
+ /*
+ * If tuple was not found, we need to build a negative cache entry
+ * containing a fake tuple. The fake tuple has the correct key columns,
+ * but nulls everywhere else.
+ * However, in this specific function for procallargs, we no longer build
+ * negative entry any more, because when we create a overload pg-style
+ * function with the same number intype parameters and different outtype
+ * parameters (a in int) vs (a in int, b out int), syscache will find no
+ * suitable cache tuple and make a new negative cache entry, but error will
+ * raise in such case, and no one will free the negative cache entry!
+ * In fact, the case metioned above should find a suitable tuple to return
+ * the caller, but for the reason we adapt a suit of Specific Function
+ * to support ProcedureCreate, syscache couldn't find the tuple. Someone
+ * may find new methods to solve the problem and refactor this!
+ */
+ if (ct == NULL) {
+ return NULL;
+ }
+
+ CACHE4_elog(DEBUG2,
+ "SearchCatCacheMissWithArgModes(%s): Contains %d/%d tuples",
+ cache->cc_relname,
+ cache->cc_ntup,
+ u_sess->cache_cxt.cache_header->ch_ntup);
+ CACHE3_elog(DEBUG2, "SearchCatCacheMissWithArgModes(%s): put in bucket %d", cache->cc_relname, hashIndex);
+
+#ifdef CATCACHE_STATS
+ cache->cc_newloads++;
+#endif
+
+ return &ct->tuple;
+}
+
+/*
+ * Specific SearchCatCache Function to support ProcedureCreate!
+ */
+HeapTuple SearchSysCacheForProcAllArgs(Datum v1, Datum v2, Datum v3, Datum v4, Datum proArgModes)
+{
+
+ if (EnableLocalSysCache()) {
+ HeapTuple tmp = t_thrd.lsc_cxt.lsc->systabcache.SearchTupleForProcAllArgs(v1, v2, v3, v4, proArgModes);
+ return tmp;
+ }
+
+ Assert(PointerIsValid(u_sess->syscache_cxt.SysCache[PROCALLARGS]));
+ Assert(u_sess->syscache_cxt.SysCache[PROCALLARGS]->cc_nkeys == PROCALLARGS_KEY_NUM);
+
+ CatCache* cache = u_sess->syscache_cxt.SysCache[PROCALLARGS];
+ int nkeys = cache->cc_nkeys;
+ Datum arguments[CATCACHE_MAXKEYS];
+ uint32 hashValue;
+
+ SearchCatCacheCheck();
+
+ /*
+ * one-time startup overhead for each cache
+ */
+ if (unlikely(cache->cc_tupdesc == NULL))
+ CatalogCacheInitializeCache(cache);
+
+#ifdef CATCACHE_STATS
+ cache->cc_searches++;
+#endif
+
+ /*
+ * Comput hashvaule with concat key2 and argmodes
+ * Function with same paramterTypes and different argmodes
+ * should have different hashkeys.
+ */
+ oidvector* allArgTypes = (oidvector*)DatumGetPointer(v2);
+
+ Assert(allArgTypes != NULL);
+
+ /* remember free the oidvectors when we no longer use them */
+ oidvector* argModes = ConvertArgModesToMd5Vector(proArgModes);
+ oidvector* v2WithArgModes = MergeOidVector(allArgTypes, argModes);
+ Datum newKey2 = PointerGetDatum(v2WithArgModes);
+
+ /* Initialize local parameter array */
+ arguments[0] = v1;
+ arguments[1] = newKey2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+
+ /*
+ * find the hash bucket in which to look for the tuple
+ */
+ hashValue = CatalogCacheComputeHashValue(cache->cc_hashfunc, nkeys, arguments);
+
+ /* reset parameter array */
+ pfree_ext(v2WithArgModes);
+ arguments[1] = v2;
+
+ HeapTuple ret_tuple = NULL;
+ bool found = false;
+ found = SearchHashBucketWithArgModes(cache, nkeys, hashValue, arguments, argModes, &ret_tuple);
+ if (found) {
+
+ pfree_ext(argModes);
+ return ret_tuple;
+ }
+
+ ret_tuple = SearchCatCacheMissWithArgModes(cache, nkeys, hashValue, arguments, argModes);
+
+ pfree_ext(argModes);
+ return ret_tuple;
+}
+#endif
diff --git a/src/common/backend/utils/cache/inval.cpp b/src/common/backend/utils/cache/inval.cpp
index 8a0f403a9..4b5852f7c 100644
--- a/src/common/backend/utils/cache/inval.cpp
+++ b/src/common/backend/utils/cache/inval.cpp
@@ -313,7 +313,8 @@ static void AddRelcacheInvalidationMessage(InvalidationListHeader* hdr, Oid dbId
/* Don't add a duplicate item */
/* We assume dbId need not be checked because it will never change */
- ProcessMessageList(hdr->rclist, if (msg->rc.id == SHAREDINVALRELCACHE_ID && msg->rc.relId == relId) return );
+ ProcessMessageList(hdr->rclist, if (msg->rc.id == SHAREDINVALRELCACHE_ID &&
+ (msg->rc.relId == relId || msg->rc.relId == InvalidOid)) return);
/* OK, add the item */
msg.rc.id = SHAREDINVALRELCACHE_ID;
@@ -411,7 +412,7 @@ static void ProcessInvalidationMessagesMulti(
*/
static void RegisterCatcacheInvalidation(int cacheId, uint32 hashValue, Oid dbId)
{
- AddCatcacheInvalidationMessage(&u_sess->inval_cxt.transInvalInfo->CurrentCmdInvalidMsgs, cacheId, hashValue, dbId);
+ AddCatcacheInvalidationMessage(&GetInvalCxt()->transInvalInfo->CurrentCmdInvalidMsgs, cacheId, hashValue, dbId);
}
/*
@@ -421,7 +422,7 @@ static void RegisterCatcacheInvalidation(int cacheId, uint32 hashValue, Oid dbId
*/
static void RegisterCatalogInvalidation(Oid dbId, Oid catId)
{
- AddCatalogInvalidationMessage(&u_sess->inval_cxt.transInvalInfo->CurrentCmdInvalidMsgs, dbId, catId);
+ AddCatalogInvalidationMessage(&GetInvalCxt()->transInvalInfo->CurrentCmdInvalidMsgs, dbId, catId);
}
/*
@@ -431,7 +432,7 @@ static void RegisterCatalogInvalidation(Oid dbId, Oid catId)
*/
static void RegisterRelcacheInvalidation(Oid dbId, Oid relId)
{
- AddRelcacheInvalidationMessage(&u_sess->inval_cxt.transInvalInfo->CurrentCmdInvalidMsgs, dbId, relId);
+ AddRelcacheInvalidationMessage(&GetInvalCxt()->transInvalInfo->CurrentCmdInvalidMsgs, dbId, relId);
/*
* Most of the time, relcache invalidation is associated with system
@@ -455,7 +456,7 @@ static void RegisterRelcacheInvalidation(Oid dbId, Oid relId)
static void RegisterPartcacheInvalidation(Oid dbId, Oid partId)
{
- AddPartcacheInvalidationMessage(&u_sess->inval_cxt.transInvalInfo->CurrentCmdInvalidMsgs, dbId, partId);
+ AddPartcacheInvalidationMessage(&GetInvalCxt()->transInvalInfo->CurrentCmdInvalidMsgs, dbId, partId);
/*
* Most of the time, relcache invalidation is associated with system
@@ -493,20 +494,141 @@ static void SendCatcacheInvalidation(int cacheId, uint32 hashValue, Oid dbId)
SendSharedInvalidMessages(&msg, 1);
}
+void LocalExecuteThreadAndSessionInvalidationMessage(SharedInvalidationMessage* msg)
+{
+ LocalExecuteThreadInvalidationMessage(msg);
+ LocalExecuteSessionInvalidationMessage(msg);
+}
+
+static void ThreadInvalidCatalog(SharedInvalidationMessage* msg)
+{
+ if (msg->cat.dbId == t_thrd.lsc_cxt.lsc->my_database_id || msg->cat.dbId == InvalidOid) {
+ CatalogCacheFlushCatalog(msg->cat.catId);
+ /* CatalogCacheFlushCatalog calls CallSyscacheCallbacks as needed */
+ }
+}
+static void ThreadInvalidRelCache(SharedInvalidationMessage* msg)
+{
+ if (msg->rc.dbId == t_thrd.lsc_cxt.lsc->my_database_id || msg->rc.dbId == InvalidOid) {
+ RelationCacheInvalidateEntry(msg->rc.relId);
+ knl_u_inval_context *inval_cxt = &t_thrd.lsc_cxt.lsc->inval_cxt;
+ for (int i = 0; i < inval_cxt->relcache_callback_count; i++) {
+ struct RELCACHECALLBACK* ccitem = inval_cxt->relcache_callback_list + i;
+ (*ccitem->function)(ccitem->arg, msg->rc.relId);
+ }
+ }
+}
+static void ThreadInvalidSmgr(SharedInvalidationMessage* msg)
+{
+ /*
+ * We could have smgr entries for relations of other databases, so no
+ * short-circuit test is possible here.
+ */
+ RelFileNodeBackend rnode;
+ RelFileNodeCopy(rnode.node, msg->sm.rnode, InvalidBktId);
+ rnode.backend = (msg->sm.backend_hi << 16) | (int)msg->sm.backend_lo;
+ smgrclosenode(rnode);
+}
+static void ThreadInvalidHbktSmgr(SharedInvalidationMessage* msg)
+{
+ RelFileNodeBackend rnode;
+ /* Hash bucket table is always regular relations */
+ rnode.backend = InvalidBackendId;
+ RelFileNodeCopy(rnode.node, msg->hbksm.rnode, (int) msg->hbksm.bucketId);
+ smgrclosenode(rnode);
+}
+static void ThreadInvalidRelmap(SharedInvalidationMessage* msg)
+{
+ /* We only care about our own database and shared catalogs */
+ if (msg->rm.dbId == InvalidOid) {
+ RelationMapInvalidate(true);
+ } else if (msg->rm.dbId == t_thrd.lsc_cxt.lsc->my_database_id) {
+ RelationMapInvalidate(false);
+ }
+}
+static void ThreadInvalidPartCache(SharedInvalidationMessage* msg)
+{
+ if (msg->pc.dbId == t_thrd.lsc_cxt.lsc->my_database_id || msg->pc.dbId == InvalidOid) {
+ PartitionCacheInvalidateEntry(msg->pc.partId);
+ knl_u_inval_context *inval_cxt = &t_thrd.lsc_cxt.lsc->inval_cxt;
+ for (int i = 0; i < inval_cxt->partcache_callback_count; i++) {
+ struct PARTCACHECALLBACK* ccitem = inval_cxt->partcache_callback_list + i;
+ (*ccitem->function)(ccitem->arg, msg->pc.partId);
+ }
+ }
+}
+static void ThreadInvalidCatCache(SharedInvalidationMessage* msg)
+{
+ if (msg->cc.dbId == t_thrd.lsc_cxt.lsc->my_database_id || msg->cc.dbId == InvalidOid) {
+ CatalogCacheIdInvalidate(msg->cc.id, msg->cc.hashValue);
+ CallThreadSyscacheCallbacks(msg->cc.id, msg->cc.hashValue);
+ }
+}
/*
- * LocalExecuteInvalidationMessage
+ * LocalExecuteThreadInvalidationMessage
*
* Process a single invalidation message (which could be of any type).
* Only the local caches are flushed; this does not transmit the message
* to other backends.
*/
-void LocalExecuteInvalidationMessage(SharedInvalidationMessage* msg)
+void LocalExecuteThreadInvalidationMessage(SharedInvalidationMessage* msg)
+{
+ if (!EnableLocalSysCache()) {
+ return;
+ }
+ Assert(CheckMyDatabaseMatch());
+ switch (msg->id) {
+ case SHAREDINVALCATALOG_ID: { /* reset system table */
+ ThreadInvalidCatalog(msg);
+ break;
+ }
+ case SHAREDINVALRELCACHE_ID: { /* invalid table and call callbackfunc registered on the table */
+ ThreadInvalidRelCache(msg);
+ break;
+ }
+ case SHAREDINVALSMGR_ID: { /* invalid smgr struct, dont care which db it belongs to */
+ ThreadInvalidSmgr(msg);
+ break;
+ }
+ case SHAREDINVALHBKTSMGR_ID: { /* invalid smgr struct, dont care which db it belongs to */
+ ThreadInvalidHbktSmgr(msg);
+ break;
+ }
+ case SHAREDINVALRELMAP_ID: { /* invalid relmap cxt */
+ ThreadInvalidRelmap(msg);
+ break;
+ }
+ case SHAREDINVALPARTCACHE_ID: { /* invalid partcache and call callbackfunc registered on the part */
+ ThreadInvalidPartCache(msg);
+ break;
+ }
+ case SHAREDINVALFUNC_ID: { /* func hashtable no in thread, so invalid it by session inval msg */
+ break;
+ }
+ default:{
+ if (msg->id >= 0) { /* invalid catcache, most cases are ddls on rel */
+ ThreadInvalidCatCache(msg);
+ } else {
+ ereport(FATAL, (errmsg("unrecognized SI message ID: %d", msg->id)));
+ }
+ }
+ }
+}
+
+/*
+ *
+ *
+ * Process a single invalidation message (which could be of any type).
+ * Only the local caches are flushed; this does not transmit the message
+ * to other backends.
+ */
+static void LocalExecuteInvalidationMessage(SharedInvalidationMessage* msg)
{
if (msg->id >= 0) {
if (msg->cc.dbId == u_sess->proc_cxt.MyDatabaseId || msg->cc.dbId == InvalidOid) {
CatalogCacheIdInvalidate(msg->cc.id, msg->cc.hashValue);
- CallSyscacheCallbacks(msg->cc.id, msg->cc.hashValue);
+ CallSessionSyscacheCallbacks(msg->cc.id, msg->cc.hashValue);
}
} else if (msg->id == SHAREDINVALCATALOG_ID) {
if (msg->cat.dbId == u_sess->proc_cxt.MyDatabaseId || msg->cat.dbId == InvalidOid) {
@@ -563,7 +685,7 @@ void LocalExecuteInvalidationMessage(SharedInvalidationMessage* msg)
}
} else if (msg->id == SHAREDINVALFUNC_ID) {
if (msg->fm.dbId == u_sess->proc_cxt.MyDatabaseId || msg->fm.dbId == InvalidOid) {
- plpgsql_HashTableDeleteAndCheckFunc(msg->fm.cacheId, msg->fm.objId);
+ plpgsql_hashtable_delete_and_check_invalid_item(msg->fm.cacheId, msg->fm.objId);
}
} else {
ereport(FATAL, (errmsg("unrecognized SI message ID: %d", msg->id)));
@@ -581,6 +703,60 @@ void LocalExecuteInvalidationMessage(SharedInvalidationMessage* msg)
}
}
+void LocalExecuteSessionInvalidationMessage(SharedInvalidationMessage* msg)
+{
+ if (!EnableLocalSysCache()) {
+ LocalExecuteInvalidationMessage(msg);
+ return;
+ }
+ Assert(CheckMyDatabaseMatch());
+ if (msg->id >= 0) {
+ if (msg->cc.dbId == t_thrd.lsc_cxt.lsc->my_database_id || msg->cc.dbId == InvalidOid) {
+ CallSessionSyscacheCallbacks(msg->cc.id, msg->cc.hashValue);
+ }
+ } else if (msg->id == SHAREDINVALCATALOG_ID) {
+ if (msg->cat.dbId == t_thrd.lsc_cxt.lsc->my_database_id || msg->cat.dbId == InvalidOid) {
+ t_thrd.lsc_cxt.lsc->systabcache.SessionCatCacheCallBack(msg->cat.catId);
+ /* CatalogCacheFlushCatalog calls CallSyscacheCallbacks as needed */
+ }
+ } else if (msg->id == SHAREDINVALRELCACHE_ID) {
+ if (msg->rc.dbId == t_thrd.lsc_cxt.lsc->my_database_id || msg->rc.dbId == InvalidOid) {
+ knl_u_inval_context *inval_cxt = &u_sess->inval_cxt;
+ for (int i = 0; i < inval_cxt->relcache_callback_count; i++) {
+ struct RELCACHECALLBACK* ccitem = inval_cxt->relcache_callback_list + i;
+ (*ccitem->function)(ccitem->arg, msg->rc.relId);
+ }
+ }
+ } else if (msg->id == SHAREDINVALSMGR_ID) {
+ /* on GSC mode, smgrcache is in thread memcxt */
+ } else if (msg->id == SHAREDINVALHBKTSMGR_ID) {
+ /* on GSC mode, smgrcache is in thread memcxt */
+ } else if (msg->id == SHAREDINVALRELMAP_ID) {
+ /* on GSC mode, relmap is in thread memcxt */
+ } else if (msg->id == SHAREDINVALPARTCACHE_ID) {
+ if (msg->pc.dbId == t_thrd.lsc_cxt.lsc->my_database_id || msg->pc.dbId == InvalidOid) {
+ knl_u_inval_context *inval_cxt = &u_sess->inval_cxt;
+ for (int i = 0; i < inval_cxt->partcache_callback_count; i++) {
+ struct PARTCACHECALLBACK* ccitem = inval_cxt->partcache_callback_list + i;
+ (*ccitem->function)(ccitem->arg, msg->pc.partId);
+ }
+ }
+ } else if (msg->id == SHAREDINVALFUNC_ID) {
+ if (msg->fm.dbId == t_thrd.lsc_cxt.lsc->my_database_id || msg->fm.dbId == InvalidOid) {
+ plpgsql_hashtable_delete_and_check_invalid_item(msg->fm.cacheId, msg->fm.objId);
+ }
+ } else {
+ ereport(FATAL, (errmsg("unrecognized SI message ID: %d", msg->id)));
+ }
+
+ if (ENABLE_GPC) {
+ bool check = GlobalPlanCache::MsgCheck(msg);
+ if (check == true && u_sess->pcache_cxt.gpc_remote_msg == false) {
+ u_sess->pcache_cxt.gpc_in_ddl = true;
+ }
+ }
+}
+
/*
* InvalidateSystemCaches
*
@@ -594,26 +770,31 @@ void LocalExecuteInvalidationMessage(SharedInvalidationMessage* msg)
*/
void InvalidateSystemCaches(void)
{
+ InvalidateThreadSystemCaches();
+ InvalidateSessionSystemCaches();
+}
+
+void InvalidateSessionSystemCaches(void)
+{
+ if (!EnableLocalSysCache()) {
+ ResetCatalogCaches();
+ RelationCacheInvalidate();
+ PartitionCacheInvalidate();
+ }
int i;
-
- ResetCatalogCaches();
- RelationCacheInvalidate(); /* gets smgr and relmap too */
- PartitionCacheInvalidate();
- for (i = 0; i < u_sess->inval_cxt.syscache_callback_count; i++) {
- struct SYSCACHECALLBACK* ccitem = u_sess->inval_cxt.syscache_callback_list + i;
-
+ knl_u_inval_context *inval_cxt = &u_sess->inval_cxt;
+ for (i = 0; i < inval_cxt->syscache_callback_count; i++) {
+ struct SYSCACHECALLBACK* ccitem = inval_cxt->syscache_callback_list + i;
(*ccitem->function)(ccitem->arg, ccitem->id, 0);
}
- for (i = 0; i < u_sess->inval_cxt.relcache_callback_count; i++) {
- struct RELCACHECALLBACK* ccitem = u_sess->inval_cxt.relcache_callback_list + i;
-
+ for (i = 0; i < inval_cxt->relcache_callback_count; i++) {
+ struct RELCACHECALLBACK* ccitem = inval_cxt->relcache_callback_list + i;
(*ccitem->function)(ccitem->arg, InvalidOid);
}
- for (i = 0; i < u_sess->inval_cxt.partcache_callback_count; i++) {
- struct PARTCACHECALLBACK* ccitem = u_sess->inval_cxt.partcache_callback_list + i;
-
+ for (i = 0; i < inval_cxt->partcache_callback_count; i++) {
+ struct PARTCACHECALLBACK* ccitem = inval_cxt->partcache_callback_list + i;
(*ccitem->function)(ccitem->arg, InvalidOid);
}
@@ -623,20 +804,34 @@ void InvalidateSystemCaches(void)
}
}
-/*
- * AcceptInvalidationMessages
- * Read and process invalidation messages from the shared invalidation
- * message queue.
- *
- * Note:
- * This should be called as the first step in processing a transaction.
- */
-void AcceptInvalidationMessages(void)
+void InvalidateThreadSystemCaches(void)
+{
+ if (!EnableLocalSysCache()) {
+ return;
+ }
+ int i;
+ ResetCatalogCaches();
+ RelationCacheInvalidate(); /* gets smgr and relmap too */
+ PartitionCacheInvalidate();
+ knl_u_inval_context *inval_cxt = &t_thrd.lsc_cxt.lsc->inval_cxt;
+ for (i = 0; i < inval_cxt->syscache_callback_count; i++) {
+ struct SYSCACHECALLBACK* ccitem = inval_cxt->syscache_callback_list + i;
+ (*ccitem->function)(ccitem->arg, ccitem->id, 0);
+ }
+
+ for (i = 0; i < inval_cxt->relcache_callback_count; i++) {
+ struct RELCACHECALLBACK* ccitem = inval_cxt->relcache_callback_list + i;
+ (*ccitem->function)(ccitem->arg, InvalidOid);
+ }
+
+ for (i = 0; i < inval_cxt->partcache_callback_count; i++) {
+ struct PARTCACHECALLBACK* ccitem = inval_cxt->partcache_callback_list + i;
+ (*ccitem->function)(ccitem->arg, InvalidOid);
+ }
+}
+
+static void TestCodeToForceCacheFlushes()
{
- u_sess->pcache_cxt.gpc_remote_msg = true;
- ++u_sess->inval_cxt.deepthInAcceptInvalidationMessage;
- ReceiveSharedInvalidMessages(LocalExecuteInvalidationMessage, InvalidateSystemCaches);
- u_sess->pcache_cxt.gpc_remote_msg = false;
/*
* Test code to force cache flushes anytime a flush could happen.
*
@@ -665,8 +860,48 @@ void AcceptInvalidationMessages(void)
#elif defined(CLOBBER_CACHE_RECURSIVELY)
InvalidateSystemCaches();
#endif
+}
- --u_sess->inval_cxt.deepthInAcceptInvalidationMessage;
+/*
+ * AcceptInvalidationMessages
+ * Read and process invalidation messages from the shared invalidation
+ * message queue.
+ *
+ * Note:
+ * This should be called as the first step in processing a transaction.
+ */
+void AcceptInvalidationMessages()
+{
+ if (EnableLocalSysCache()) {
+ u_sess->pcache_cxt.gpc_remote_msg = true;
+ knl_u_inval_context *inval_cxt = &t_thrd.lsc_cxt.lsc->inval_cxt;
+ ++inval_cxt->DeepthInAcceptInvalidationMessage;
+ if (!IS_THREAD_POOL_WORKER) {
+ ReceiveSharedInvalidMessages(LocalExecuteThreadAndSessionInvalidationMessage,
+ InvalidateSystemCaches, false);
+ } else {
+ ReceiveSharedInvalidMessages(LocalExecuteThreadInvalidationMessage, InvalidateThreadSystemCaches, false);
+ u_sess->pcache_cxt.gpc_remote_msg = false;
+ TestCodeToForceCacheFlushes();
+ --inval_cxt->DeepthInAcceptInvalidationMessage;
+
+ u_sess->pcache_cxt.gpc_remote_msg = true;
+ inval_cxt = &u_sess->inval_cxt;
+ ++inval_cxt->DeepthInAcceptInvalidationMessage;
+ ReceiveSharedInvalidMessages(LocalExecuteSessionInvalidationMessage, InvalidateSessionSystemCaches, true);
+ }
+ u_sess->pcache_cxt.gpc_remote_msg = false;
+ TestCodeToForceCacheFlushes();
+ --inval_cxt->DeepthInAcceptInvalidationMessage;
+ return;
+ }
+
+ u_sess->pcache_cxt.gpc_remote_msg = true;
+ ++u_sess->inval_cxt.DeepthInAcceptInvalidationMessage;
+ ReceiveSharedInvalidMessages(LocalExecuteInvalidationMessage, InvalidateSystemCaches, false);
+ u_sess->pcache_cxt.gpc_remote_msg = false;
+ TestCodeToForceCacheFlushes();
+ --u_sess->inval_cxt.DeepthInAcceptInvalidationMessage;
}
/*
@@ -675,12 +910,13 @@ void AcceptInvalidationMessages(void)
*/
void AtStart_Inval(void)
{
- Assert(u_sess->inval_cxt.transInvalInfo == NULL);
- u_sess->inval_cxt.transInvalInfo =
+ knl_u_inval_context *inval_cxt = GetInvalCxt();
+ Assert(inval_cxt->transInvalInfo == NULL);
+ inval_cxt->transInvalInfo =
(TransInvalidationInfo*)MemoryContextAllocZero(u_sess->top_transaction_mem_cxt, sizeof(TransInvalidationInfo));
- u_sess->inval_cxt.transInvalInfo->my_level = GetCurrentTransactionNestLevel();
- u_sess->inval_cxt.SharedInvalidMessagesArray = NULL;
- u_sess->inval_cxt.numSharedInvalidMessagesArray = 0;
+ inval_cxt->transInvalInfo->my_level = GetCurrentTransactionNestLevel();
+ inval_cxt->SharedInvalidMessagesArray = NULL;
+ inval_cxt->numSharedInvalidMessagesArray = 0;
}
/*
@@ -707,53 +943,54 @@ void PostPrepare_Inval(void)
void AtSubStart_Inval(void)
{
TransInvalidationInfo* myInfo = NULL;
-
- Assert(u_sess->inval_cxt.transInvalInfo != NULL);
+ knl_u_inval_context *inval_cxt = GetInvalCxt();
+ Assert(inval_cxt->transInvalInfo != NULL);
myInfo =
(TransInvalidationInfo*)MemoryContextAllocZero(u_sess->top_transaction_mem_cxt, sizeof(TransInvalidationInfo));
- myInfo->parent = u_sess->inval_cxt.transInvalInfo;
+ myInfo->parent = inval_cxt->transInvalInfo;
myInfo->my_level = GetCurrentTransactionNestLevel();
- u_sess->inval_cxt.transInvalInfo = myInfo;
+ inval_cxt->transInvalInfo = myInfo;
}
/*
- * Collect invalidation messages into u_sess->inval_cxt.SharedInvalidMessagesArray array.
+ * Collect invalidation messages into GetInvalCxt()->SharedInvalidMessagesArray array.
*/
static void MakeSharedInvalidMessagesArray(const SharedInvalidationMessage* msgs, int n)
{
/*
* Initialise array first time through in each commit
*/
- if (u_sess->inval_cxt.SharedInvalidMessagesArray == NULL) {
- u_sess->inval_cxt.maxSharedInvalidMessagesArray = FIRSTCHUNKSIZE;
- u_sess->inval_cxt.numSharedInvalidMessagesArray = 0;
+ knl_u_inval_context *inval_cxt = GetInvalCxt();
+ if (inval_cxt->SharedInvalidMessagesArray == NULL) {
+ inval_cxt->maxSharedInvalidMessagesArray = FIRSTCHUNKSIZE;
+ inval_cxt->numSharedInvalidMessagesArray = 0;
/*
* Although this is being palloc'd we don't actually free it directly.
* We're so close to EOXact that we now we're going to lose it anyhow.
*/
- u_sess->inval_cxt.SharedInvalidMessagesArray = (SharedInvalidationMessage*)palloc(
- u_sess->inval_cxt.maxSharedInvalidMessagesArray * sizeof(SharedInvalidationMessage));
+ inval_cxt->SharedInvalidMessagesArray = (SharedInvalidationMessage*)palloc(
+ inval_cxt->maxSharedInvalidMessagesArray * sizeof(SharedInvalidationMessage));
}
- if ((u_sess->inval_cxt.numSharedInvalidMessagesArray + n) > u_sess->inval_cxt.maxSharedInvalidMessagesArray) {
- while ((u_sess->inval_cxt.numSharedInvalidMessagesArray + n) > u_sess->inval_cxt.maxSharedInvalidMessagesArray)
- u_sess->inval_cxt.maxSharedInvalidMessagesArray *= 2;
+ if ((inval_cxt->numSharedInvalidMessagesArray + n) > inval_cxt->maxSharedInvalidMessagesArray) {
+ while ((inval_cxt->numSharedInvalidMessagesArray + n) > inval_cxt->maxSharedInvalidMessagesArray)
+ inval_cxt->maxSharedInvalidMessagesArray *= 2;
- u_sess->inval_cxt.SharedInvalidMessagesArray =
- (SharedInvalidationMessage*)repalloc(u_sess->inval_cxt.SharedInvalidMessagesArray,
- u_sess->inval_cxt.maxSharedInvalidMessagesArray * sizeof(SharedInvalidationMessage));
+ inval_cxt->SharedInvalidMessagesArray =
+ (SharedInvalidationMessage*)repalloc(inval_cxt->SharedInvalidMessagesArray,
+ inval_cxt->maxSharedInvalidMessagesArray * sizeof(SharedInvalidationMessage));
}
/*
* Append the next chunk onto the array
*/
- int rc = memcpy_s(u_sess->inval_cxt.SharedInvalidMessagesArray + u_sess->inval_cxt.numSharedInvalidMessagesArray,
+ int rc = memcpy_s(inval_cxt->SharedInvalidMessagesArray + inval_cxt->numSharedInvalidMessagesArray,
n * sizeof(SharedInvalidationMessage),
msgs,
n * sizeof(SharedInvalidationMessage));
securec_check(rc, "\0", "\0");
- u_sess->inval_cxt.numSharedInvalidMessagesArray += n;
+ inval_cxt->numSharedInvalidMessagesArray += n;
}
/*
@@ -772,16 +1009,16 @@ static void MakeSharedInvalidMessagesArray(const SharedInvalidationMessage* msgs
int xactGetCommittedInvalidationMessages(SharedInvalidationMessage** msgs, bool* RelcacheInitFileInval)
{
MemoryContext oldcontext;
-
+ knl_u_inval_context *inval_cxt = GetInvalCxt();
/* Must be at top of stack */
- Assert(u_sess->inval_cxt.transInvalInfo != NULL && u_sess->inval_cxt.transInvalInfo->parent == NULL);
+ Assert(inval_cxt->transInvalInfo != NULL && inval_cxt->transInvalInfo->parent == NULL);
/*
* Relcache init file invalidation requires processing both before and
* after we send the SI messages. However, we need not do anything unless
* we committed.
*/
- *RelcacheInitFileInval = u_sess->inval_cxt.transInvalInfo->RelcacheInitFileInval;
+ *RelcacheInitFileInval = inval_cxt->transInvalInfo->RelcacheInitFileInval;
/*
* Walk through TransInvalidationInfo to collect all the messages into a
@@ -794,17 +1031,17 @@ int xactGetCommittedInvalidationMessages(SharedInvalidationMessage** msgs, bool*
oldcontext = MemoryContextSwitchTo(t_thrd.mem_cxt.cur_transaction_mem_cxt);
ProcessInvalidationMessagesMulti(
- &u_sess->inval_cxt.transInvalInfo->CurrentCmdInvalidMsgs, MakeSharedInvalidMessagesArray);
+ &inval_cxt->transInvalInfo->CurrentCmdInvalidMsgs, MakeSharedInvalidMessagesArray);
ProcessInvalidationMessagesMulti(
- &u_sess->inval_cxt.transInvalInfo->PriorCmdInvalidMsgs, MakeSharedInvalidMessagesArray);
+ &inval_cxt->transInvalInfo->PriorCmdInvalidMsgs, MakeSharedInvalidMessagesArray);
MemoryContextSwitchTo(oldcontext);
Assert(
- !(u_sess->inval_cxt.numSharedInvalidMessagesArray > 0 && u_sess->inval_cxt.SharedInvalidMessagesArray == NULL));
+ !(inval_cxt->numSharedInvalidMessagesArray > 0 && inval_cxt->SharedInvalidMessagesArray == NULL));
- *msgs = u_sess->inval_cxt.SharedInvalidMessagesArray;
+ *msgs = inval_cxt->SharedInvalidMessagesArray;
- return u_sess->inval_cxt.numSharedInvalidMessagesArray;
+ return inval_cxt->numSharedInvalidMessagesArray;
}
/*
@@ -874,37 +1111,38 @@ void ProcessCommittedInvalidationMessages(
*/
void AtEOXact_Inval(bool isCommit)
{
+ knl_u_inval_context *inval_cxt = GetInvalCxt();
if (isCommit) {
/* Must be at top of stack */
- Assert(u_sess->inval_cxt.transInvalInfo != NULL && u_sess->inval_cxt.transInvalInfo->parent == NULL);
+ Assert(inval_cxt->transInvalInfo != NULL && inval_cxt->transInvalInfo->parent == NULL);
/*
* Relcache init file invalidation requires processing both before and
* after we send the SI messages. However, we need not do anything
* unless we committed.
*/
- if (u_sess->inval_cxt.transInvalInfo->RelcacheInitFileInval) {
+ if (inval_cxt->transInvalInfo->RelcacheInitFileInval) {
RelationCacheInitFilePreInvalidate();
}
- AppendInvalidationMessages(&u_sess->inval_cxt.transInvalInfo->PriorCmdInvalidMsgs,
- &u_sess->inval_cxt.transInvalInfo->CurrentCmdInvalidMsgs);
+
+ AppendInvalidationMessages(&inval_cxt->transInvalInfo->PriorCmdInvalidMsgs,
+ &inval_cxt->transInvalInfo->CurrentCmdInvalidMsgs);
ProcessInvalidationMessagesMulti(
- &u_sess->inval_cxt.transInvalInfo->PriorCmdInvalidMsgs, SendSharedInvalidMessages);
+ &inval_cxt->transInvalInfo->PriorCmdInvalidMsgs, SendSharedInvalidMessages);
- if (u_sess->inval_cxt.transInvalInfo->RelcacheInitFileInval) {
+ if (inval_cxt->transInvalInfo->RelcacheInitFileInval) {
RelationCacheInitFilePostInvalidate();
}
- } else if (u_sess->inval_cxt.transInvalInfo != NULL) {
+ } else if (inval_cxt->transInvalInfo != NULL) {
/* Must be at top of stack */
- Assert(u_sess->inval_cxt.transInvalInfo->parent == NULL);
-
+ Assert(inval_cxt->transInvalInfo->parent == NULL);
ProcessInvalidationMessages(
- &u_sess->inval_cxt.transInvalInfo->PriorCmdInvalidMsgs, LocalExecuteInvalidationMessage);
+ &inval_cxt->transInvalInfo->PriorCmdInvalidMsgs, LocalExecuteThreadAndSessionInvalidationMessage);
}
/* Need not free anything explicitly */
- u_sess->inval_cxt.transInvalInfo = NULL;
+ inval_cxt->transInvalInfo = NULL;
}
/*
@@ -928,7 +1166,8 @@ void AtEOXact_Inval(bool isCommit)
void AtEOSubXact_Inval(bool isCommit)
{
int my_level = GetCurrentTransactionNestLevel();
- TransInvalidationInfo* myInfo = u_sess->inval_cxt.transInvalInfo;
+ knl_u_inval_context *inval_cxt = GetInvalCxt();
+ TransInvalidationInfo* myInfo = inval_cxt->transInvalInfo;
if (isCommit) {
/* Must be at non-top of stack */
@@ -947,18 +1186,17 @@ void AtEOSubXact_Inval(bool isCommit)
}
/* Pop the transaction state stack */
- u_sess->inval_cxt.transInvalInfo = myInfo->parent;
+ inval_cxt->transInvalInfo = myInfo->parent;
/* Need not free anything else explicitly */
pfree_ext(myInfo);
} else if (myInfo != NULL && myInfo->my_level == my_level) {
/* Must be at non-top of stack */
Assert(myInfo->parent != NULL);
-
- ProcessInvalidationMessages(&myInfo->PriorCmdInvalidMsgs, LocalExecuteInvalidationMessage);
+ ProcessInvalidationMessages(&myInfo->PriorCmdInvalidMsgs, LocalExecuteThreadAndSessionInvalidationMessage);
/* Pop the transaction state stack */
- u_sess->inval_cxt.transInvalInfo = myInfo->parent;
+ inval_cxt->transInvalInfo = myInfo->parent;
/* Need not free anything else explicitly */
pfree_ext(myInfo);
@@ -982,19 +1220,21 @@ void AtEOSubXact_Inval(bool isCommit)
*/
void CommandEndInvalidationMessages(void)
{
+ knl_u_inval_context *inval_cxt = GetInvalCxt();
/*
* You might think this shouldn't be called outside any transaction, but
* bootstrap does it, and also ABORT issued when not in a transaction. So
* just quietly return if no state to work on.
*/
- if (u_sess->inval_cxt.transInvalInfo == NULL) {
+ if (inval_cxt->transInvalInfo == NULL) {
return;
}
-
+ ProcessInvalidationMessagesMulti(
+ &inval_cxt->transInvalInfo->CurrentCmdInvalidMsgs, GlobalExecuteSharedInvalidMessages);
ProcessInvalidationMessages(
- &u_sess->inval_cxt.transInvalInfo->CurrentCmdInvalidMsgs, LocalExecuteInvalidationMessage);
- AppendInvalidationMessages(&u_sess->inval_cxt.transInvalInfo->PriorCmdInvalidMsgs,
- &u_sess->inval_cxt.transInvalInfo->CurrentCmdInvalidMsgs);
+ &inval_cxt->transInvalInfo->CurrentCmdInvalidMsgs, LocalExecuteThreadAndSessionInvalidationMessage);
+ AppendInvalidationMessages(&inval_cxt->transInvalInfo->PriorCmdInvalidMsgs,
+ &inval_cxt->transInvalInfo->CurrentCmdInvalidMsgs);
}
/*
@@ -1111,7 +1351,7 @@ void CacheInvalidateHeapTuple(Relation relation, HeapTuple tuple, HeapTuple newt
void CacheInvalidateFunction(Oid funcId, Oid pkgId)
{
- AddFunctionCacheInvalidationMessage(&u_sess->inval_cxt.transInvalInfo->CurrentCmdInvalidMsgs,
+ AddFunctionCacheInvalidationMessage(&GetInvalCxt()->transInvalInfo->CurrentCmdInvalidMsgs,
u_sess->proc_cxt.MyDatabaseId, funcId, pkgId);
}
@@ -1129,7 +1369,6 @@ void CacheInvalidateFunction(Oid funcId, Oid pkgId)
void CacheInvalidateCatalog(Oid catalogId)
{
Oid databaseId;
-
if (IsSharedRelation(catalogId)) {
databaseId = InvalidOid;
} else {
@@ -1340,7 +1579,7 @@ void CacheInvalidateHeapTupleInplace(Relation relation, HeapTuple tuple)
}
/*
- * CacheRegisterSyscacheCallback
+ * CacheRegisterThreadSyscacheCallback
* Register the specified function to be called for all future
* invalidation events in the specified cache. The cache ID and the
* hash value of the tuple being invalidated will be passed to the
@@ -1352,21 +1591,62 @@ void CacheInvalidateHeapTupleInplace(Relation relation, HeapTuple tuple)
* worth troubling over, especially since most of the current callees just
* flush all cached state anyway.
*/
-void CacheRegisterSyscacheCallback(int cacheid, SyscacheCallbackFunction func, Datum arg)
+void CacheRegisterThreadSyscacheCallback(int cacheid, SyscacheCallbackFunction func, Datum arg)
{
- if (u_sess->inval_cxt.syscache_callback_count >= MAX_SYSCACHE_CALLBACKS) {
+ if (!EnableLocalSysCache()) {
+ CacheRegisterSessionSyscacheCallback(cacheid, func, arg);
+ return;
+ }
+ knl_u_inval_context *inval_cxt = &t_thrd.lsc_cxt.lsc->inval_cxt;
+ for (int i = 0; i < inval_cxt->syscache_callback_count; i++) {
+ if (inval_cxt->syscache_callback_list[i].id == cacheid &&
+ inval_cxt->syscache_callback_list[i].function == func) {
+ Assert(IS_THREAD_POOL_STREAM);
+ if (inval_cxt->syscache_callback_list[i].arg != arg) {
+ inval_cxt->syscache_callback_list[i].arg = arg;
+ }
+ return;
+ }
+ }
+ if (inval_cxt->syscache_callback_count >= MAX_SYSCACHE_CALLBACKS) {
+ ereport(FATAL, (errmsg("out of syscache_callback_list slots")));
+ }
+ Assert(func != NULL);
+ inval_cxt->syscache_callback_list[inval_cxt->syscache_callback_count].id = cacheid;
+ inval_cxt->syscache_callback_list[inval_cxt->syscache_callback_count].function = func;
+ inval_cxt->syscache_callback_list[inval_cxt->syscache_callback_count].arg = arg;
+
+ ++inval_cxt->syscache_callback_count;
+}
+
+/*
+ * CacheRegisterSessionSyscacheCallback
+ * make sure the cache the func flush is in u_sess, or you should use CacheRegisterThreadSyscacheCallback
+ */
+void CacheRegisterSessionSyscacheCallback(int cacheid, SyscacheCallbackFunction func, Datum arg)
+{
+ knl_u_inval_context *inval_cxt = &u_sess->inval_cxt;
+ for (int i = 0; i < inval_cxt->syscache_callback_count; i++) {
+ if (inval_cxt->syscache_callback_list[i].id == cacheid &&
+ inval_cxt->syscache_callback_list[i].function == func) {
+ Assert(inval_cxt->syscache_callback_list[i].arg == arg);
+ inval_cxt->syscache_callback_list[i].arg = arg;
+ return;
+ }
+ }
+ if (inval_cxt->syscache_callback_count >= MAX_SYSCACHE_CALLBACKS) {
ereport(FATAL, (errmsg("out of syscache_callback_list slots")));
}
- u_sess->inval_cxt.syscache_callback_list[u_sess->inval_cxt.syscache_callback_count].id = cacheid;
- u_sess->inval_cxt.syscache_callback_list[u_sess->inval_cxt.syscache_callback_count].function = func;
- u_sess->inval_cxt.syscache_callback_list[u_sess->inval_cxt.syscache_callback_count].arg = arg;
+ inval_cxt->syscache_callback_list[inval_cxt->syscache_callback_count].id = cacheid;
+ inval_cxt->syscache_callback_list[inval_cxt->syscache_callback_count].function = func;
+ inval_cxt->syscache_callback_list[inval_cxt->syscache_callback_count].arg = arg;
- ++u_sess->inval_cxt.syscache_callback_count;
+ ++inval_cxt->syscache_callback_count;
}
/*
- * CacheRegisterRelcacheCallback
+ * CacheRegisterThreadRelcacheCallback
* Register the specified function to be called for all future
* relcache invalidation events. The OID of the relation being
* invalidated will be passed to the function.
@@ -1374,19 +1654,58 @@ void CacheRegisterSyscacheCallback(int cacheid, SyscacheCallbackFunction func, D
* NOTE: InvalidOid will be passed if a cache reset request is received.
* In this case the called routines should flush all cached state.
*/
-void CacheRegisterRelcacheCallback(RelcacheCallbackFunction func, Datum arg)
+void CacheRegisterThreadRelcacheCallback(RelcacheCallbackFunction func, Datum arg)
{
- if (u_sess->inval_cxt.relcache_callback_count >= MAX_RELCACHE_CALLBACKS) {
+ if (!EnableLocalSysCache()) {
+ CacheRegisterSessionRelcacheCallback(func, arg);
+ return;
+ }
+ knl_u_inval_context *inval_cxt = &t_thrd.lsc_cxt.lsc->inval_cxt;
+ for (int i = 0; i < inval_cxt->relcache_callback_count; i++) {
+ if (inval_cxt->relcache_callback_list[i].function == func) {
+ Assert(IS_THREAD_POOL_STREAM);
+ Assert(inval_cxt->relcache_callback_list[i].arg == arg);
+ if (inval_cxt->relcache_callback_list[i].arg != arg) {
+ inval_cxt->relcache_callback_list[i].arg = arg;
+ }
+ return;
+ }
+ }
+ if (inval_cxt->relcache_callback_count >= MAX_RELCACHE_CALLBACKS) {
ereport(FATAL, (errmsg("out of relcache_callback_list slots")));
}
+ Assert(func != NULL);
+ inval_cxt->relcache_callback_list[inval_cxt->relcache_callback_count].function = func;
+ inval_cxt->relcache_callback_list[inval_cxt->relcache_callback_count].arg = arg;
- u_sess->inval_cxt.relcache_callback_list[u_sess->inval_cxt.relcache_callback_count].function = func;
- u_sess->inval_cxt.relcache_callback_list[u_sess->inval_cxt.relcache_callback_count].arg = arg;
+ ++inval_cxt->relcache_callback_count;
+}
- ++u_sess->inval_cxt.relcache_callback_count;
+/*
+ * CacheRegisterSessionRelcacheCallback
+ * make sure the cache the func flush is in u_sess, or you should use CacheRegisterThreadRelcacheCallback
+ */
+void CacheRegisterSessionRelcacheCallback(RelcacheCallbackFunction func, Datum arg)
+{
+ knl_u_inval_context *inval_cxt = &u_sess->inval_cxt;
+ for (int i = 0; i < inval_cxt->relcache_callback_count; i++) {
+ if (inval_cxt->relcache_callback_list[i].function == func) {
+ if (inval_cxt->relcache_callback_list[i].arg != arg) {
+ inval_cxt->relcache_callback_list[i].arg = arg;
+ }
+ return;
+ }
+ }
+ if (inval_cxt->relcache_callback_count >= MAX_RELCACHE_CALLBACKS) {
+ ereport(FATAL, (errmsg("out of relcache_callback_list slots")));
+ }
+ inval_cxt->relcache_callback_list[inval_cxt->relcache_callback_count].function = func;
+ inval_cxt->relcache_callback_list[inval_cxt->relcache_callback_count].arg = arg;
+
+ ++inval_cxt->relcache_callback_count;
}
/*
- * CacheRegisterRelcacheCallback
+ * CacheRegisterThreadPartcacheCallback
* Register the specified function to be called for all future
* relcache invalidation events. The OID of the relation being
* invalidated will be passed to the function.
@@ -1394,30 +1713,86 @@ void CacheRegisterRelcacheCallback(RelcacheCallbackFunction func, Datum arg)
* NOTE: InvalidOid will be passed if a cache reset request is received.
* In this case the called routines should flush all cached state.
*/
-void CacheRegisterPartcacheCallback(PartcacheCallbackFunction func, Datum arg)
+void CacheRegisterThreadPartcacheCallback(PartcacheCallbackFunction func, Datum arg)
{
- if (u_sess->inval_cxt.partcache_callback_count >= MAX_PARTCACHE_CALLBACKS) {
+ if (!EnableLocalSysCache()) {
+ CacheRegisterSessionPartcacheCallback(func, arg);
+ return;
+ }
+ knl_u_inval_context *inval_cxt = &t_thrd.lsc_cxt.lsc->inval_cxt;
+ for (int i = 0; i < inval_cxt->partcache_callback_count; i++) {
+ if (inval_cxt->partcache_callback_list[i].function == func) {
+ Assert(IS_THREAD_POOL_STREAM);
+ Assert(inval_cxt->partcache_callback_list[i].arg == arg);
+ if (inval_cxt->partcache_callback_list[i].arg != arg) {
+ inval_cxt->partcache_callback_list[i].arg = arg;
+ }
+ return;
+ }
+ }
+ if (inval_cxt->partcache_callback_count >= MAX_PARTCACHE_CALLBACKS) {
ereport(FATAL, (errmsg("out of partcache_callback_list slots")));
}
+ Assert(func != NULL);
+ inval_cxt->partcache_callback_list[inval_cxt->partcache_callback_count].function = func;
+ inval_cxt->partcache_callback_list[inval_cxt->partcache_callback_count].arg = arg;
- u_sess->inval_cxt.partcache_callback_list[u_sess->inval_cxt.partcache_callback_count].function = func;
- u_sess->inval_cxt.partcache_callback_list[u_sess->inval_cxt.partcache_callback_count].arg = arg;
-
- ++u_sess->inval_cxt.partcache_callback_count;
+ ++inval_cxt->partcache_callback_count;
}
/*
- * CallSyscacheCallbacks
+ * CacheRegisterSessionPartcacheCallback
+ * make sure the cache the func flush is in u_sess, or you should use CacheRegisterThreadPartcacheCallback
+ */
+void CacheRegisterSessionPartcacheCallback(PartcacheCallbackFunction func, Datum arg)
+{
+ knl_u_inval_context *inval_cxt = &u_sess->inval_cxt;
+ for (int i = 0; i < inval_cxt->partcache_callback_count; i++) {
+ if (inval_cxt->partcache_callback_list[i].function == func) {
+ if (inval_cxt->partcache_callback_list[i].arg != arg) {
+ inval_cxt->partcache_callback_list[i].arg = arg;
+ }
+ return;
+ }
+ }
+ if (inval_cxt->partcache_callback_count >= MAX_PARTCACHE_CALLBACKS) {
+ ereport(FATAL, (errmsg("out of partcache_callback_list slots")));
+ }
+ inval_cxt->partcache_callback_list[inval_cxt->partcache_callback_count].function = func;
+ inval_cxt->partcache_callback_list[inval_cxt->partcache_callback_count].arg = arg;
+
+ ++inval_cxt->partcache_callback_count;
+}
+
+/*
+ * CallThreadSyscacheCallbacks
*
* This is exported so that CatalogCacheFlushCatalog can call it, saving
* this module from knowing which catcache IDs correspond to which catalogs.
*/
-void CallSyscacheCallbacks(int cacheid, uint32 hashvalue)
+void CallThreadSyscacheCallbacks(int cacheid, uint32 hashvalue)
+{
+ Assert(EnableGlobalSysCache());
+ int i;
+ knl_u_inval_context *inval_cxt = &t_thrd.lsc_cxt.lsc->inval_cxt;
+ for (i = 0; i < inval_cxt->syscache_callback_count; i++) {
+ struct SYSCACHECALLBACK* ccitem = inval_cxt->syscache_callback_list + i;
+ if (ccitem->id == cacheid) {
+ (*ccitem->function)(ccitem->arg, cacheid, hashvalue);
+ }
+ }
+}
+
+/*
+ * CallSessionSyscacheCallbacks
+ * make sure the cache the func flush is in u_sess, or you should use CallThreadSyscacheCallbacks
+ */
+void CallSessionSyscacheCallbacks(int cacheid, uint32 hashvalue)
{
int i;
-
- for (i = 0; i < u_sess->inval_cxt.syscache_callback_count; i++) {
- struct SYSCACHECALLBACK* ccitem = u_sess->inval_cxt.syscache_callback_list + i;
+ knl_u_inval_context *inval_cxt = &u_sess->inval_cxt;
+ for (i = 0; i < inval_cxt->syscache_callback_count; i++) {
+ struct SYSCACHECALLBACK* ccitem = inval_cxt->syscache_callback_list + i;
if (ccitem->id == cacheid) {
(*ccitem->function)(ccitem->arg, cacheid, hashvalue);
}
@@ -1431,23 +1806,25 @@ void CallSyscacheCallbacks(int cacheid, uint32 hashvalue)
static void PrepareInvalidationState(void)
{
TransInvalidationInfo *myInfo;
+ knl_u_inval_context *inval_cxt = GetInvalCxt();
- if (u_sess->inval_cxt.transInvalInfo != NULL &&
- u_sess->inval_cxt.transInvalInfo->my_level == GetCurrentTransactionNestLevel())
+ if (inval_cxt->transInvalInfo != NULL &&
+ inval_cxt->transInvalInfo->my_level == GetCurrentTransactionNestLevel()) {
return;
+ }
myInfo =
(TransInvalidationInfo *)MemoryContextAllocZero(u_sess->top_transaction_mem_cxt, sizeof(TransInvalidationInfo));
- myInfo->parent = u_sess->inval_cxt.transInvalInfo;
+ myInfo->parent = inval_cxt->transInvalInfo;
myInfo->my_level = GetCurrentTransactionNestLevel();
/*
* If there's any previous entry, this one should be for a deeper nesting
* level.
*/
- Assert(u_sess->inval_cxt.transInvalInfo == NULL || myInfo->my_level > u_sess->inval_cxt.transInvalInfo->my_level);
+ Assert(inval_cxt->transInvalInfo == NULL || myInfo->my_level > inval_cxt->transInvalInfo->my_level);
- u_sess->inval_cxt.transInvalInfo = myInfo;
+ inval_cxt->transInvalInfo = myInfo;
}
/*
diff --git a/src/common/backend/utils/cache/knl_globalbasedefcache.cpp b/src/common/backend/utils/cache/knl_globalbasedefcache.cpp
new file mode 100644
index 000000000..a275640f1
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_globalbasedefcache.cpp
@@ -0,0 +1,403 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "access/transam.h"
+#include "executor/executor.h"
+#include "miscadmin.h"
+#include "postgres.h"
+#include "utils/knl_catcache.h"
+#include "utils/knl_globalbasedefcache.h"
+#include "utils/knl_globaldbstatmanager.h"
+#include "utils/knl_partcache.h"
+#include "utils/memutils.h"
+
+static uint64 GetBitmapSetSize(int nwords)
+{
+ return (offsetof(Bitmapset, words) + (nwords) * sizeof(bitmapword));
+}
+
+static uint64 GetRelEstimateSize(GlobalRelationEntry *entry)
+{
+ uint64 rel_size =
+ ((AllocSet)entry->rel_mem_manager)->totalSpace + /* memcxt total space */
+ sizeof(GlobalRelationEntry) + CHUNK_ALGIN_PAD + /* palloc GlobalRelationEntry with chunk head */
+ sizeof(AllocSetContext) + CHUNK_ALGIN_PAD; /* create MemoryContext with chunk head */
+ return rel_size;
+}
+
+static uint64 GetPartEstimateSize(GlobalPartitionEntry *entry)
+{
+ /* every palloc attached with a chunk head */
+ uint64 part_size =
+ sizeof(GlobalPartitionEntry) + CHUNK_ALGIN_PAD + /* palloc GlobalPartitionEntry with chunk head */
+ sizeof(PartitionData) + CHUNK_ALGIN_PAD + /* palloc PartitionData with chunk head */
+ PARTITION_TUPLE_SIZE + CHUNK_ALGIN_PAD + /* palloc pd_part with chunk head */
+ (entry->part->rd_options == NULL ? 0 : (VARSIZE(entry->part->rd_options) + CHUNK_ALGIN_PAD)) +
+ /* palloc rd_options with chunk head */
+ (entry->part->pd_indexattr == NULL ? 0 : /* palloc pd_indexattr with chunk head */
+ (GetBitmapSetSize(entry->part->pd_indexattr->nwords) + CHUNK_ALGIN_PAD)) +
+ (entry->part->pd_indexlist == NULL ? 0 : /* palloc pd_indexlist with chunk head, and its elements */
+ sizeof(List) + CHUNK_ALGIN_PAD +
+ (sizeof(ListCell) + CHUNK_ALGIN_PAD) * entry->part->pd_indexlist->length);
+ return part_size;
+}
+
+template
+void GlobalBaseDefCache::RemoveElemFromBucket(GlobalBaseEntry *base)
+{
+ if (is_relation) {
+ GlobalRelationEntry *entry = (GlobalRelationEntry *)base;
+ uint64 rel_size = GetRelEstimateSize(entry);
+ pg_atomic_fetch_sub_u64(&m_base_space, rel_size);
+ m_db_entry->MemoryEstimateSub(rel_size);
+ } else {
+ GlobalPartitionEntry *entry = (GlobalPartitionEntry *)base;
+ uint64 part_size = GetPartEstimateSize(entry);
+ pg_atomic_fetch_sub_u64(&m_base_space, part_size);
+ m_db_entry->MemoryEstimateSub(part_size);
+ }
+ m_bucket_list.RemoveElemFromBucket(&base->cache_elem);
+}
+template
+void GlobalBaseDefCache::AddHeadToBucket(Index hash_index, GlobalBaseEntry *base)
+{
+ if (is_relation) {
+ GlobalRelationEntry *entry = (GlobalRelationEntry *)base;
+ uint64 rel_size = GetRelEstimateSize(entry);
+ pg_atomic_fetch_add_u64(&m_base_space, rel_size);
+ m_db_entry->MemoryEstimateAdd(rel_size);
+ } else {
+ GlobalPartitionEntry *entry = (GlobalPartitionEntry *)base;
+ uint64 part_size = GetPartEstimateSize(entry);
+ pg_atomic_fetch_add_u64(&m_base_space, part_size);
+ m_db_entry->MemoryEstimateAdd(part_size);
+ }
+ m_bucket_list.AddHeadToBucket(hash_index, &base->cache_elem);
+}
+
+template void GlobalBaseDefCache::AddHeadToBucket(Index hash_index, GlobalBaseEntry *base);
+template void GlobalBaseDefCache::AddHeadToBucket(Index hash_index, GlobalBaseEntry *base);
+template void GlobalBaseDefCache::RemoveElemFromBucket(GlobalBaseEntry *base);
+template void GlobalBaseDefCache::RemoveElemFromBucket(GlobalBaseEntry *base);
+
+
+template
+void GlobalBaseEntry::Free(GlobalBaseEntry *entry)
+{
+ Assert(entry->refcount == 0);
+ if (is_relation) {
+ Assert(entry->type == GLOBAL_RELATION_ENTRY);
+ if (((GlobalRelationEntry *)entry)->rel_mem_manager != NULL) {
+ MemoryContextDelete(((GlobalRelationEntry *)entry)->rel_mem_manager);
+ }
+ } else {
+ Assert(entry->type == GLOBAL_PARTITION_ENTRY);
+ if (((GlobalPartitionEntry *)entry)->part != NULL) {
+ PartitionDestroyPartition(((GlobalPartitionEntry *)entry)->part);
+ }
+ }
+ pfree(entry);
+}
+template void GlobalBaseEntry::Free(GlobalBaseEntry *entry);
+template void GlobalBaseEntry::Free(GlobalBaseEntry *entry);
+
+void GlobalBaseEntry::Release()
+{
+ /* we dont free entry here, free when search */
+ Assert(this->refcount > 0);
+ (void)pg_atomic_fetch_sub_u64(&this->refcount, 1);
+}
+
+void GlobalBaseDefCache::InitHashTable()
+{
+ MemoryContext old = MemoryContextSwitchTo(m_db_entry->GetRandomMemCxt());
+ m_bucket_list.Init(m_nbuckets);
+ m_obj_locks = (pthread_rwlock_t *)palloc0(sizeof(pthread_rwlock_t) * m_nbuckets);
+ for (int i = 0; i < m_nbuckets; i++) {
+ PthreadRwLockInit(&m_obj_locks[i], NULL);
+ }
+
+ m_is_swappingouts = (volatile uint32 *)palloc0(sizeof(volatile uint32) * m_nbuckets);
+
+ /* acquire more oid locks for concurrent ddl */
+ if (!m_is_shared) {
+ m_oid_locks = (pthread_rwlock_t *)palloc0(sizeof(pthread_rwlock_t) * m_nbuckets);
+ for (int i = 0; i < m_nbuckets; i++) {
+ PthreadRwLockInit(&m_oid_locks[i], NULL);
+ }
+ } else {
+ m_oid_locks = NULL;
+ }
+ (void)MemoryContextSwitchTo(old);
+}
+
+void GlobalBaseDefCache::Init(int nbucket)
+{
+ Assert(!m_is_inited);
+ m_nbuckets = ResizeHashBucket(nbucket, g_instance.global_sysdbcache.dynamic_hash_bucket_strategy);
+ InitHashTable();
+}
+
+GlobalBaseEntry *GlobalBaseDefCache::SearchReadOnly(Oid obj_oid, uint32 hash_value)
+{
+ pg_atomic_fetch_add_u64(m_searches, 1);
+ Index hash_index = HASH_INDEX(hash_value, (uint32)m_nbuckets);
+ pthread_rwlock_t *obj_lock = &m_obj_locks[hash_index];
+
+ int location = INVALID_LOCATION;
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ GlobalBaseEntry *entry = FindEntryWithIndex(obj_oid, hash_index, &location);
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ if (entry == NULL) {
+ return NULL;
+ }
+ pg_atomic_fetch_add_u64(m_hits, 1);
+ TopnLruMoveToFront(&entry->cache_elem, m_bucket_list.GetBucket(hash_index), obj_lock, location);
+ return entry;
+}
+
+template
+void GlobalBaseDefCache::FreeDeadEntrys()
+{
+ while (m_dead_entries.GetLength() > 0) {
+ Dlelem *elt = m_dead_entries.RemoveHead();
+ if (elt == NULL) {
+ break;
+ }
+ GlobalBaseEntry *entry = (GlobalBaseEntry *)DLE_VAL(elt);
+ if (entry->refcount != 0) {
+ /* we move the active entry to tail of list and let next call free it */
+ m_dead_entries.AddTail(&entry->cache_elem);
+ break;
+ } else {
+ entry->Free(entry);
+ }
+ }
+}
+template void GlobalBaseDefCache::FreeDeadEntrys();
+template void GlobalBaseDefCache::FreeDeadEntrys();
+
+template
+void GlobalBaseDefCache::Invalidate(Oid dbid, Oid obj_oid)
+{
+ uint32 hash_value = oid_hash((void *)&(obj_oid), sizeof(Oid));
+ pthread_rwlock_t *oid_lock = NULL;
+ bool need_oid_lock = !is_relation || !IsSystemObjOid(obj_oid);
+ if (need_oid_lock) {
+ oid_lock = GetHashValueLock(hash_value);
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, oid_lock);
+ }
+
+ Index hash_index = HASH_INDEX(hash_value, (uint32)m_nbuckets);
+ pthread_rwlock_t *obj_lock = &m_obj_locks[hash_index];
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ for (Dlelem *elt = DLGetHead(m_bucket_list.GetBucket(hash_index)); elt != NULL;) {
+ GlobalBaseEntry *entry = (GlobalBaseEntry *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ if (entry->oid != obj_oid) {
+ continue;
+ }
+ HandleDeadEntry(entry);
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ if (need_oid_lock) {
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, oid_lock);
+ }
+}
+template void GlobalBaseDefCache::Invalidate(Oid dbid, Oid obj_oid);
+template void GlobalBaseDefCache::Invalidate(Oid dbid, Oid obj_oid);
+
+template
+void GlobalBaseDefCache::InvalidateRelationNodeListBy(bool (*IsInvalidEntry)(GlobalBaseEntry *))
+{
+ for (int hash_index = 0; hash_index < m_nbuckets; hash_index++) {
+ pthread_rwlock_t *obj_lock = &m_obj_locks[hash_index];
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ for (Dlelem *elt = DLGetHead(m_bucket_list.GetBucket(hash_index)); elt != NULL;) {
+ GlobalBaseEntry *entry = (GlobalBaseEntry *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ if (IsInvalidEntry(entry)) {
+ HandleDeadEntry(entry);
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ }
+}
+template void GlobalBaseDefCache::InvalidateRelationNodeListBy(bool (*IsInvalidEntry)(GlobalBaseEntry *));
+
+template
+void GlobalBaseDefCache::ResetCaches()
+{
+ for (int hash_index = 0; hash_index < m_nbuckets; hash_index++) {
+ /* if not force, we are swappingout, oid lock is not needed */
+ if (force && !m_is_shared) {
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_oid_locks[hash_index]);
+ }
+
+ pthread_rwlock_t *obj_lock = &m_obj_locks[hash_index];
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ for (Dlelem *elt = DLGetHead(m_bucket_list.GetBucket(hash_index)); elt;) {
+ GlobalBaseEntry *entry = (GlobalBaseEntry *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ if (force || entry->refcount == 0) {
+ HandleDeadEntry(entry);
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+
+ if (force && !m_is_shared) {
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_oid_locks[hash_index]);
+ }
+ }
+}
+template void GlobalBaseDefCache::ResetCaches();
+template void GlobalBaseDefCache::ResetCaches();
+template void GlobalBaseDefCache::ResetCaches();
+template void GlobalBaseDefCache::ResetCaches();
+
+
+template
+void GlobalBaseDefCache::HandleDeadEntry(GlobalBaseEntry *entry)
+{
+ RemoveElemFromBucket(entry);
+ if (entry->refcount == 0) {
+ m_dead_entries.AddHead(&entry->cache_elem);
+ } else {
+ m_dead_entries.AddTail(&entry->cache_elem);
+ }
+}
+template void GlobalBaseDefCache::HandleDeadEntry(GlobalBaseEntry *entry);
+template void GlobalBaseDefCache::HandleDeadEntry(GlobalBaseEntry *entry);
+
+GlobalBaseEntry *GlobalBaseDefCache::FindEntryWithIndex(Oid obj_oid, Index hash_index, int *location)
+{
+ int index = 0;
+ for (Dlelem *elt = DLGetHead(m_bucket_list.GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ index++;
+ GlobalBaseEntry *entry = (GlobalBaseEntry *)DLE_VAL(elt);
+ if (entry->oid != obj_oid) {
+ continue;
+ }
+ pg_atomic_fetch_add_u64(&entry->refcount, 1);
+ *location = index;
+ return entry;
+ }
+ return NULL;
+}
+
+bool GlobalBaseDefCache::EntryExist(Oid obj_oid, Index hash_index)
+{
+ for (Dlelem *elt = DLGetHead(m_bucket_list.GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ GlobalBaseEntry *entry = (GlobalBaseEntry *)DLE_VAL(elt);
+ if (entry->oid != obj_oid) {
+ continue;
+ }
+ return true;
+ }
+ return false;
+}
+
+template
+void GlobalBaseDefCache::RemoveTailElements(Index hash_index)
+{
+ /* shared db never do lru on tabdef */
+ if (m_is_shared) {
+ return;
+ }
+
+ /* only one thread can do swapout for the bucket */
+ ResourceOwnerEnlargeGlobalIsExclusive(LOCAL_SYSDB_RESOWNER);
+ if (!atomic_compare_exchange_u32(&m_is_swappingouts[hash_index], 0, 1)) {
+ return;
+ }
+ ResourceOwnerRememberGlobalIsExclusive(LOCAL_SYSDB_RESOWNER, &m_is_swappingouts[hash_index]);
+
+ bool listBelowThreshold = m_bucket_list.GetBucket(hash_index)->dll_len < MAX_GSC_LIST_LENGTH;
+
+ uint64 swapout_count_once = 0;
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_obj_locks[hash_index]);
+ uint64 max_swapout_count_once = GetSwapOutNum(listBelowThreshold, m_bucket_list.GetBucket(hash_index)->dll_len);
+ for (Dlelem *elt = DLGetTail(m_bucket_list.GetBucket(hash_index)); elt != NULL;) {
+ Dlelem *tmp = elt;
+ elt = DLGetPred(elt);
+ if (is_relation) {
+ GlobalRelationEntry *entry = (GlobalRelationEntry *)DLE_VAL(tmp);
+ if (g_instance.global_sysdbcache.RelationHasSysCache(entry->rel->rd_id) ||
+ unlikely(!RelationHasReferenceCountZero(entry->rel))) {
+ Assert(entry->type == GLOBAL_RELATION_ENTRY);
+ DLMoveToFront(&entry->cache_elem);
+ break;
+ }
+ }
+ HandleDeadEntry((GlobalBaseEntry *)DLE_VAL(tmp));
+ swapout_count_once++;
+
+ /* keep elements as many as possible */
+ if (swapout_count_once == max_swapout_count_once) {
+ break;
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_obj_locks[hash_index]);
+
+ Assert(m_is_swappingouts[hash_index] == 1);
+ atomic_compare_exchange_u32(&m_is_swappingouts[hash_index], 1, 0);
+ ResourceOwnerForgetGlobalIsExclusive(LOCAL_SYSDB_RESOWNER, &m_is_swappingouts[hash_index]);
+}
+template void GlobalBaseDefCache::RemoveTailElements(Index hash_index);
+template void GlobalBaseDefCache::RemoveTailElements(Index hash_index);
+
+template
+void GlobalBaseDefCache::RemoveAllTailElements()
+{
+ /* shared db never do lru on tabdef */
+ if (m_is_shared) {
+ return;
+ }
+ for (int hash_index = 0; hash_index < m_nbuckets; hash_index++) {
+ RemoveTailElements(hash_index);
+#ifndef ENABLE_LITE_MODE
+ /* memory is under control, so stop swapout */
+ if (g_instance.global_sysdbcache.MemoryUnderControl()) {
+ break;
+ }
+#endif
+ }
+}
+
+template void GlobalBaseDefCache::RemoveAllTailElements();
+template void GlobalBaseDefCache::RemoveAllTailElements();
+
+GlobalBaseDefCache::GlobalBaseDefCache(Oid db_oid, bool is_shared, GlobalSysDBCacheEntry *entry, char relkind)
+{
+ m_db_oid = db_oid;
+ m_is_shared = is_shared;
+ m_is_inited = false;
+
+ m_relkind = relkind;
+ if (m_relkind == PARTTYPE_PARTITIONED_RELATION) {
+ m_searches = &entry->m_dbstat->part_searches;
+ m_hits = &entry->m_dbstat->part_hits;
+ m_newloads = &entry->m_dbstat->part_newloads;
+ } else {
+ Assert(m_relkind == RELKIND_RELATION);
+ m_searches = &entry->m_dbstat->rel_searches;
+ m_hits = &entry->m_dbstat->rel_hits;
+ m_newloads = &entry->m_dbstat->rel_newloads;
+ }
+ m_base_space = 0;
+ m_obj_locks = NULL;
+ m_db_entry = entry;
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/knl_globalbucketlist.cpp b/src/common/backend/utils/cache/knl_globalbucketlist.cpp
new file mode 100644
index 000000000..c6367e552
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_globalbucketlist.cpp
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+#include "postgres.h"
+#include "utils/atomic.h"
+#include "utils/knl_globalbucketlist.h"
+#include "utils/knl_globaldbstatmanager.h"
+
+void GlobalBucketList::Init(int nbuckets)
+{
+ m_nbuckets = nbuckets;
+ Assert(m_bucket_entry == NULL);
+ m_bucket_entry = (BucketEntry *)palloc0(sizeof(BucketEntry) * (uint)m_nbuckets);
+ DLInitList(&m_active_bucket_list);
+ SpinLockInit(&m_active_bucket_list_lock);
+ for (int i = 0; i < nbuckets; i++) {
+ m_bucket_entry[i].elem.dle_val = &m_bucket_entry[i];
+ }
+ m_elem_count = 0;
+}
+void GlobalBucketList::AddHeadToBucket(Index hash_index, Dlelem *elem)
+{
+ Dllist *bucket = &(m_bucket_entry[hash_index].cc_bucket);
+ /* active bucket */
+ if (DLIsNIL(bucket)) {
+ SpinLockAcquire(&(m_active_bucket_list_lock));
+ DLAddHead(&m_active_bucket_list, &m_bucket_entry[hash_index].elem);
+ SpinLockRelease(&(m_active_bucket_list_lock));
+ }
+ DLAddHead(bucket, elem);
+ pg_atomic_fetch_add_u64(&m_elem_count, 1);
+}
+
+void GlobalBucketList::RemoveElemFromBucket(Dlelem *elem)
+{
+ Dllist *bucket = elem->dle_list;
+ DLRemove(elem);
+ /* inactive bucket */
+ if (DLIsNIL(bucket)) {
+ BucketEntry *bucket_obj = (BucketEntry *)(bucket);
+ Assert(&bucket_obj->cc_bucket == bucket);
+ Assert(DLGetListHdr(&bucket_obj->elem) == &m_active_bucket_list);
+ SpinLockAcquire(&(m_active_bucket_list_lock));
+ DLRemove(&bucket_obj->elem);
+ SpinLockRelease(&(m_active_bucket_list_lock));
+ }
+ pg_atomic_fetch_sub_u64(&m_elem_count, 1);
+}
+
+/*
+ * @return INVALID_INDEX means there are no active bucket, no need weedout, otherwise return natural number
+ */
+Index GlobalBucketList::GetTailBucketIndex()
+{
+ Index tail_index = INVALID_INDEX;
+ SpinLockAcquire(&(m_active_bucket_list_lock));
+ if (!DLIsNIL(&m_active_bucket_list)) {
+ Dlelem *elt = DLGetTail(&m_active_bucket_list);
+ BucketEntry *bucket_entry = (BucketEntry *)DLE_VAL(elt);
+ tail_index = bucket_entry - m_bucket_entry;
+ }
+ SpinLockRelease(&(m_active_bucket_list_lock));
+ return tail_index;
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/knl_globaldbstatmanager.cpp b/src/common/backend/utils/cache/knl_globaldbstatmanager.cpp
new file mode 100644
index 000000000..437ba36a4
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_globaldbstatmanager.cpp
@@ -0,0 +1,235 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "utils/knl_globalsysdbcache.h"
+#include "executor/executor.h"
+
+void GlobalSysDBCacheEntry::Free(GlobalSysDBCacheEntry *entry)
+{
+ GSC_CACHE2_elog("GlobalSysDBCacheEntry Free with db oid %u", entry->db_id);
+ /* in case palloc fail */
+ for (uint i = 0; i < entry->m_memcxt_nums; i++) {
+ if (entry->m_mem_cxt_groups[i] != NULL) {
+ MemoryContextDelete(entry->m_mem_cxt_groups[i]);
+ }
+ }
+ pfree_ext(entry->m_dbstat);
+ pfree(entry);
+}
+
+void GlobalSysDBCacheEntry::Release()
+{
+ g_instance.global_sysdbcache.ReleaseGSCEntry(this);
+}
+
+template
+void GlobalSysDBCacheEntry::ResetDBCache()
+{
+ m_systabCache->ResetCatCaches();
+ m_tabdefCache->ResetRelCaches();
+ if (m_dbOid != InvalidOid) {
+ m_partdefCache->ResetPartCaches();
+ }
+}
+
+void GlobalSysDBCacheEntry::RemoveTailElements()
+{
+ m_systabCache->RemoveAllTailElements();
+ m_tabdefCache->RemoveAllTailElements();
+ if (m_dbOid != InvalidOid) {
+ m_partdefCache->RemoveAllTailElements();
+ }
+}
+
+template void GlobalSysDBCacheEntry::ResetDBCache();
+template void GlobalSysDBCacheEntry::ResetDBCache();
+
+void GlobalSysDBCacheEntry::MemoryEstimateAdd(uint64 size)
+{
+ (void)pg_atomic_fetch_add_u64(&m_rough_used_space, size);
+ (void)pg_atomic_fetch_add_u64(&g_instance.global_sysdbcache.gsc_rough_used_space, size);
+}
+void GlobalSysDBCacheEntry::MemoryEstimateSub(uint64 size)
+{
+ (void)pg_atomic_fetch_sub_u64(&m_rough_used_space, size);
+ (void)pg_atomic_fetch_sub_u64(&g_instance.global_sysdbcache.gsc_rough_used_space, size);
+}
+
+GlobalDBStatManager::GlobalDBStatManager()
+{
+ m_nbuckets = 0;
+ m_dbstat_nbuckets= NULL;
+ m_dbstat_buckets = NULL;
+
+ m_mydb_refs = NULL;
+ m_mydb_roles = NULL;
+ m_max_backend_id = 0;
+ m_backend_ref_lock = NULL;
+
+ m_dbstat_memcxt = NULL;
+}
+
+void GlobalDBStatManager::InitDBStat(int nbuckets, MemoryContext top)
+{
+ m_dbstat_memcxt =
+#ifdef ENABLE_LITE_MODE
+ AllocSetContextCreate(top, "GlobalSysDBStatCache", ALLOCSET_SMALL_MINSIZE, ALLOCSET_SMALL_INITSIZE,
+ ALLOCSET_SMALL_MAXSIZE, SHARED_CONTEXT);
+#else
+ AllocSetContextCreate(top, "GlobalSysDBStatCache", ALLOCSET_DEFAULT_MINSIZE, ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE, SHARED_CONTEXT);
+#endif
+ MemoryContext old = MemoryContextSwitchTo(m_dbstat_memcxt);
+ /* dbstat use lock as dbentry */
+ m_nbuckets = nbuckets;
+ m_dbstat_nbuckets = (int *)palloc0(nbuckets * sizeof(int));
+ m_dbstat_buckets = (List**)palloc0(nbuckets * sizeof(List *));
+
+ m_backend_ref_lock = (pthread_rwlock_t *)palloc0(sizeof(pthread_rwlock_t));
+ PthreadRwLockInit(m_backend_ref_lock, NULL);
+#ifdef ENABLE_LITE_MODE
+ m_max_backend_id = 64;
+#else
+ m_max_backend_id = 1024;
+#endif
+ m_mydb_refs = (GlobalSysDBCacheEntry **)palloc0(sizeof(GlobalSysDBCacheEntry *) * m_max_backend_id);
+ m_mydb_roles = (int *)palloc0(sizeof(int) * m_max_backend_id);
+
+ (void)MemoryContextSwitchTo(old);
+}
+
+void GlobalDBStatManager::RecordSwapOutDBEntry(GlobalSysDBCacheEntry *entry)
+{
+ List *cur_dbstat_bucket = m_dbstat_buckets[entry->m_hash_index];
+ ListCell *lc;
+ foreach(lc, cur_dbstat_bucket) {
+ GlobalSysCacheStat *cur_dbstat = (GlobalSysCacheStat *)lfirst(lc);
+ if (cur_dbstat->db_oid == entry->m_dbOid) {
+ cur_dbstat->tup_searches += entry->m_dbstat->tup_searches;
+ cur_dbstat->tup_hits += entry->m_dbstat->tup_hits;
+ cur_dbstat->tup_newloads += entry->m_dbstat->tup_newloads;
+
+ cur_dbstat->rel_searches += entry->m_dbstat->rel_searches;
+ cur_dbstat->rel_hits += entry->m_dbstat->rel_hits;
+ cur_dbstat->rel_newloads += entry->m_dbstat->rel_newloads;
+
+ cur_dbstat->part_searches += entry->m_dbstat->part_searches;
+ cur_dbstat->part_hits += entry->m_dbstat->part_hits;
+ cur_dbstat->part_newloads += entry->m_dbstat->part_newloads;
+
+ cur_dbstat->swapout_count += 1;
+
+ break;
+ }
+ }
+ if (lc != NULL) {
+ return;
+ }
+ MemoryContext old = MemoryContextSwitchTo(m_dbstat_memcxt);
+ m_dbstat_buckets[entry->m_hash_index] = lappend(m_dbstat_buckets[entry->m_hash_index], entry->m_dbstat);
+ entry->m_dbstat = NULL;
+ (void)MemoryContextSwitchTo(old);
+}
+
+void GlobalDBStatManager::DropDB(Oid db_oid, Index hash_index)
+{
+ GlobalSysCacheStat *cur_dbstat = NULL;
+
+ ListCell *lc = NULL;
+ foreach(lc, m_dbstat_buckets[hash_index]) {
+ cur_dbstat = (GlobalSysCacheStat *)lfirst(lc);
+ if (cur_dbstat->db_oid == db_oid) {
+ m_dbstat_buckets[hash_index] = list_delete_ptr(m_dbstat_buckets[hash_index], cur_dbstat);
+ pfree_ext(cur_dbstat);
+ break;
+ }
+ }
+}
+
+void GlobalDBStatManager::GetDBStat(GlobalSysCacheStat *db_stat)
+{
+ List *cur_dbstat_bucket = m_dbstat_buckets[db_stat->hash_index];
+ ListCell *lc = NULL;
+ foreach(lc, cur_dbstat_bucket) {
+ GlobalSysCacheStat *cur_dbstat = (GlobalSysCacheStat *)lfirst(lc);
+ if (cur_dbstat->db_oid == db_stat->db_oid) {
+ db_stat->tup_searches += cur_dbstat->tup_searches;
+ db_stat->tup_hits += cur_dbstat->tup_hits;
+ db_stat->tup_newloads += cur_dbstat->tup_newloads;
+
+ db_stat->rel_searches += cur_dbstat->rel_searches;
+ db_stat->rel_hits += cur_dbstat->rel_hits;
+ db_stat->rel_newloads += cur_dbstat->rel_newloads;
+
+ db_stat->part_searches += cur_dbstat->part_searches;
+ db_stat->part_hits += cur_dbstat->part_hits;
+ db_stat->part_newloads += cur_dbstat->part_newloads;
+
+ db_stat->swapout_count = cur_dbstat->swapout_count;
+ break;
+ }
+ }
+}
+
+
+bool GlobalDBStatManager::IsDBUsedByProc(GlobalSysDBCacheEntry *entry)
+{
+ Assert(entry->m_dbOid != InvalidOid);
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, m_backend_ref_lock);
+ bool used = false;
+ for (int i = 0; i < (int)m_max_backend_id; i++) {
+ if (m_mydb_refs[i] == entry) {
+ used = true;
+ break;
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_backend_ref_lock);
+ return used;
+}
+
+void GlobalDBStatManager::RepallocThreadEntryArray(Oid backend_id)
+{
+ while ((uint)backend_id >= m_max_backend_id) {
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, m_backend_ref_lock);
+ if ((uint)backend_id < m_max_backend_id) {
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_backend_ref_lock);
+ return;
+ }
+
+ GSC_CACHE3_elog("MyBackendId %d is greater equal than m_max_backend_id %u", backend_id, m_max_backend_id);
+ uint max_backend_id = m_max_backend_id << 1;
+ int len_refs = sizeof(GlobalSysDBCacheEntry *) * max_backend_id;
+ m_mydb_refs = (GlobalSysDBCacheEntry **)repalloc(m_mydb_refs, len_refs);
+ int len_roles = sizeof(int) * max_backend_id;
+ m_mydb_roles = (int *)repalloc(m_mydb_roles, len_roles);
+ errno_t rc = memset_s(m_mydb_refs + m_max_backend_id, len_refs >> 1, 0, len_refs >> 1);
+ securec_check(rc, "\0", "\0");
+ rc = memset_s(m_mydb_roles + m_max_backend_id, len_roles >> 1, 0, len_roles >> 1);
+ securec_check(rc, "\0", "\0");
+ m_max_backend_id = max_backend_id;
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_backend_ref_lock);
+ }
+}
+
+void GlobalDBStatManager::ThreadHoldDB(GlobalSysDBCacheEntry *db)
+{
+ RepallocThreadEntryArray(t_thrd.proc_cxt.MyBackendId);
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, m_backend_ref_lock);
+ BackendId MyBackendId = t_thrd.proc_cxt.MyBackendId;
+ m_mydb_refs[MyBackendId] = db;
+ m_mydb_roles[MyBackendId] = t_thrd.role;
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_backend_ref_lock);
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/knl_globalpartdefcache.cpp b/src/common/backend/utils/cache/knl_globalpartdefcache.cpp
new file mode 100644
index 000000000..4573ac53a
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_globalpartdefcache.cpp
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "executor/executor.h"
+#include "miscadmin.h"
+#include "utils/knl_catcache.h"
+#include "utils/knl_globaldbstatmanager.h"
+#include "utils/knl_globalpartdefcache.h"
+#include "utils/knl_globaltabdefcache.h"
+#include "utils/knl_partcache.h"
+#include "utils/memutils.h"
+
+static void PartitionPointerToNULL(Partition part)
+{
+ part->pd_indexattr = NULL;
+ part->pd_indexlist = NULL;
+ part->pd_part = NULL;
+ part->pd_smgr = NULL;
+ part->rd_options = NULL;
+ part->pd_pgstat_info = NULL;
+}
+
+void CopyPartitionData(Partition dest_partition, Partition src_partition)
+{
+ /* if you add variable to partition, please check if you need put it in gsc,
+ * if not, set it zero when copy, and reinit it when local get the copy result
+ * if the variable changed, there is no lock and no part inval msg,
+ * set it zero and reinit it when copy into local */
+ Assert(sizeof(PartitionData) == 168);
+ *dest_partition = *src_partition;
+ /* init all pointers to NULL, so we can free memory correctly when meeting exception */
+ PartitionPointerToNULL(dest_partition);
+ dest_partition->pd_indexattr = bms_copy(src_partition->pd_indexattr);
+ dest_partition->pd_indexlist = list_copy(src_partition->pd_indexlist);
+ Assert(src_partition->pd_refcnt == 0);
+ dest_partition->pd_refcnt = 0;
+
+ /* We just copy fixed field */
+ dest_partition->pd_part = (Form_pg_partition)palloc(PARTITION_TUPLE_SIZE);
+ memcpy_s(dest_partition->pd_part, PARTITION_TUPLE_SIZE, src_partition->pd_part, PARTITION_TUPLE_SIZE);
+
+ dest_partition->pd_smgr = NULL;
+ Assert(src_partition->pd_isvalid);
+ dest_partition->pd_isvalid = true;
+ dest_partition->rd_options = CopyOption(src_partition->rd_options);
+ Assert(src_partition->pd_pgstat_info == NULL);
+ dest_partition->pd_pgstat_info = NULL;
+}
+
+void GlobalPartDefCache::Insert(Partition part, uint32 hash_value)
+{
+ Index hash_index = HASH_INDEX(hash_value, (uint32)m_nbuckets);
+ /* dllist is too long, swapout some */
+ if (m_bucket_list.GetBucket(hash_index)->dll_len >= MAX_GSC_LIST_LENGTH) {
+ GlobalBaseDefCache::RemoveTailElements(hash_index);
+ /* maybe no element can be swappedout */
+ return;
+ }
+
+ pthread_rwlock_t *obj_lock = &m_obj_locks[hash_index];
+ GlobalPartitionEntry *entry = CreateEntry(part);
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ bool found = GlobalBaseDefCache::EntryExist(part->pd_id, hash_index);
+ if (found) {
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ entry->Free(entry);
+ return;
+ }
+ GlobalBaseDefCache::AddHeadToBucket(hash_index, entry);
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ pg_atomic_fetch_add_u64(m_newloads, 1);
+}
+
+GlobalPartitionEntry *GlobalPartDefCache::CreateEntry(Partition part)
+{
+ ResourceOwnerEnlargeGlobalBaseEntry(LOCAL_SYSDB_RESOWNER);
+ MemoryContext old = MemoryContextSwitchTo(m_db_entry->GetRandomMemCxt());
+ GlobalPartitionEntry *entry = (GlobalPartitionEntry *)palloc(sizeof(GlobalPartitionEntry));
+ entry->type = GLOBAL_PARTITION_ENTRY;
+ entry->oid = part->pd_id;
+ entry->refcount = 0;
+ entry->part = NULL;
+ DLInitElem(&entry->cache_elem, (void *)entry);
+ ResourceOwnerRememberGlobalBaseEntry(LOCAL_SYSDB_RESOWNER, entry);
+ entry->part = (Partition)palloc0(sizeof(PartitionData));
+ CopyPartitionData(entry->part, part);
+ ResourceOwnerForgetGlobalBaseEntry(LOCAL_SYSDB_RESOWNER, entry);
+ MemoryContextSwitchTo(old);
+ return entry;
+}
+
+void GlobalPartDefCache::Init()
+{
+ MemoryContext old = MemoryContextSwitchTo(m_db_entry->GetRandomMemCxt());
+ GlobalBaseDefCache::Init(GLOBAL_INIT_PARTCACHE_SIZE);
+ MemoryContextSwitchTo(old);
+ m_is_inited = true;
+}
+
+GlobalPartDefCache::GlobalPartDefCache(Oid dbOid, bool isShared, struct GlobalSysDBCacheEntry *entry)
+ : GlobalBaseDefCache(dbOid, isShared, entry, PARTTYPE_PARTITIONED_RELATION)
+{
+ m_is_inited = false;
+}
+
+template void GlobalPartDefCache::ResetPartCaches();
+template void GlobalPartDefCache::ResetPartCaches();
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/knl_globalrelmapcache.cpp b/src/common/backend/utils/cache/knl_globalrelmapcache.cpp
new file mode 100644
index 000000000..450282c0b
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_globalrelmapcache.cpp
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "executor/executor.h"
+#include "knl/knl_session.h"
+#include "knl/knl_thread.h"
+#include "utils/knl_globalrelmapcache.h"
+#include "utils/relmapper.h"
+#include "postgres.h"
+#include "securec.h"
+#include "storage/lock/lwlock.h"
+#include "storage/smgr/fd.h"
+
+GlobalRelMapCache::GlobalRelMapCache(Oid dbOid, bool shared)
+{
+ m_dbOid = dbOid;
+ m_isInited = false;
+ m_isShared = shared;
+}
+
+GlobalRelMapCache::~GlobalRelMapCache()
+{
+ m_isInited = false;
+}
+
+/* RelMapCache initialization phase 1 */
+void GlobalRelMapCache::Init()
+{
+ errno_t rc = memset_s(&m_relmap, sizeof(RelMapFile), 0, sizeof(RelMapFile));
+ securec_check(rc, "\0", "\0");
+
+ PthreadRwLockInit(&m_lock, NULL);
+}
+
+/* RelMapCache initialization phase 2 */
+void GlobalRelMapCache::InitPhase2()
+{
+ if (m_isInited) {
+ return;
+ }
+
+ LWLockAcquire(RelationMappingLock, LW_SHARED);
+
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_lock);
+ if (!m_isInited) {
+ load_relmap_file(m_isShared, &m_relmap);
+ pg_memory_barrier();
+
+ /* Mark relmapcache as initalized once relmap is loaded */
+ m_isInited = true;
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_lock);
+
+ LWLockRelease(RelationMappingLock);
+}
+
+void GlobalRelMapCache::UpdateBy(RelMapFile *rel_map)
+{
+ /* here we have write lock of RelationMappingLock */
+ if (!m_isInited) {
+ return;
+ }
+
+ /*
+ * dont lock relmap by RelationMappingLock, the only call happened after
+ * lwlockaquire(relmap), ?? need refine
+ */
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_lock);
+
+ /* we dont care what magic the rel_map is */
+ errno_t rc = memcpy_s(&m_relmap, sizeof(RelMapFile), rel_map, sizeof(RelMapFile));
+ securec_check(rc, "\0", "\0");
+
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_lock);
+}
+
+void GlobalRelMapCache::CopyInto(RelMapFile *dest_relmap)
+{
+ Assert(m_isInited);
+
+ /* obtain a lock and do copy */
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, &m_lock);
+
+ /* crc and pad needn't copy.
+ * should make sure the dest_relmap are all zero */
+ errno_t rc = memcpy_s(dest_relmap, sizeof(RelMapFile), &m_relmap,
+ offsetof(RelMapFile, mappings) + m_relmap.num_mappings * sizeof(RelMapping));
+ securec_check(rc, "\0", "\0");
+
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_lock);
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/knl_globalsysdbcache.cpp b/src/common/backend/utils/cache/knl_globalsysdbcache.cpp
new file mode 100644
index 000000000..3c4b6d562
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_globalsysdbcache.cpp
@@ -0,0 +1,1280 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "utils/knl_globalsysdbcache.h"
+#include "utils/memutils.h"
+#include "utils/builtins.h"
+#include "access/xlog.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_auth_members.h"
+#include "catalog/pg_database.h"
+#include "catalog/pg_pltemplate.h"
+#include "catalog/pg_shdescription.h"
+#include "catalog/pg_shdepend.h"
+#include "catalog/pg_shseclabel.h"
+#include "catalog/pg_auth_history.h"
+#include "catalog/pg_user_status.h"
+#include "catalog/pgxc_group.h"
+#include "catalog/pg_workload_group.h"
+#include "catalog/pg_app_workloadgroup_mapping.h"
+#include "catalog/gs_global_config.h"
+#include "catalog/pg_db_role_setting.h"
+#include "catalog/pg_job.h"
+#include "catalog/pg_job_proc.h"
+#include "catalog/pg_extension_data_source.h"
+#include "catalog/gs_obsscaninfo.h"
+#include "catalog/indexing.h"
+#include "catalog/toasting.h"
+#include "catalog/pg_am.h"
+#include "postgres.h"
+#include "executor/executor.h"
+#include "utils/knl_globalsystupcache.h"
+#include "utils/knl_catcache.h"
+#include "knl/knl_session.h"
+#include "utils/syscache.h"
+#include "storage/proc.h"
+#include "funcapi.h"
+#include "commands/dbcommands.h"
+
+bool atomic_compare_exchange_u32(volatile uint32* ptr, uint32 expected, uint32 newval)
+{
+ Assert((expected == 0 && newval == 1) || (expected == 1 && newval == 0));
+ uint32 current = expected;
+ bool ret = pg_atomic_compare_exchange_u32(ptr, ¤t, newval);
+ Assert((ret && current == expected) || (!ret && current != expected));
+ Assert(expected == 0 || ret);
+ return ret;
+}
+
+void TopnLruMoveToFront(Dlelem *e, Dllist *list, pthread_rwlock_t *lock, int location)
+{
+ if (location <= GLOBAL_BUCKET_DEFAULT_TOP_N) {
+ return;
+ }
+ if (PthreadRWlockTryWrlock(LOCAL_SYSDB_RESOWNER, lock) != 0) {
+ return;
+ }
+ if (DLGetListHdr(e) == list) {
+ DLMoveToFront(e);
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, lock);
+}
+
+void GlobalSysDBCache::ReleaseGSCEntry(GlobalSysDBCacheEntry *entry)
+{
+ Assert(entry != NULL && entry->m_dbOid != InvalidOid);
+ Assert(entry->m_hash_index == HASH_INDEX(oid_hash((void *)&(entry->m_dbOid),
+ sizeof(Oid)), m_nbuckets));
+ Assert(entry->m_refcount > 0);
+
+ /* minus m_refcount */
+ pg_atomic_fetch_sub_u64(&entry->m_refcount, 1);
+}
+
+void GlobalSysDBCache::RemoveElemFromBucket(GlobalSysDBCacheEntry *entry)
+{
+ /* shared db never remove */
+ Assert(entry->m_dbOid != InvalidOid);
+ m_bucket_list.RemoveElemFromBucket(&entry->m_cache_elem);
+ m_dbstat_manager.RecordSwapOutDBEntry(entry);
+}
+
+void GlobalSysDBCache::AddHeadToBucket(Index hash_index, GlobalSysDBCacheEntry *entry)
+{
+ m_bucket_list.AddHeadToBucket(hash_index, &entry->m_cache_elem);
+
+ /* add this for hashtable */
+ entry->MemoryEstimateAdd(GLOBAL_DB_MEMORY_MIN);
+ m_dbstat_manager.ThreadHoldDB(entry);
+}
+
+void GlobalSysDBCache::HandleDeadDB(GlobalSysDBCacheEntry *entry)
+{
+ RemoveElemFromBucket(entry);
+ if (entry->m_refcount == 0) {
+ m_dead_dbs.AddHead(&entry->m_cache_elem);
+ } else {
+ m_dead_dbs.AddTail(&entry->m_cache_elem);
+ }
+}
+
+void GlobalSysDBCache::FreeDeadDBs()
+{
+ while (m_dead_dbs.GetLength() > 0) {
+ Dlelem *elt = m_dead_dbs.RemoveHead();
+ if (elt == NULL) {
+ break;
+ }
+ GlobalSysDBCacheEntry *dbEntry = (GlobalSysDBCacheEntry *)DLE_VAL(elt);
+ Assert(dbEntry->m_dbOid != InvalidOid);
+ /* refcount means ref may leak */
+ if (dbEntry->m_refcount != 0 && m_dbstat_manager.IsDBUsedByProc(dbEntry)) {
+ GSC_CACHE1_elog("GlobalSysDBCacheEntry used can not be freed");
+ /* clear memory, this proc may exit, and forget to call releasedb */
+ dbEntry->ResetDBCache();
+ /* we move the active entry to tail of list and let next call free it */
+ m_dead_dbs.AddTail(&dbEntry->m_cache_elem);
+ break;
+ } else {
+ /* sub all to delete, make sure no one use the entry */
+ dbEntry->MemoryEstimateSub(dbEntry->m_rough_used_space);
+ Assert(dbEntry->m_rough_used_space == 0);
+ dbEntry->Free(dbEntry);
+ }
+ }
+}
+
+GlobalSysDBCacheEntry *GlobalSysDBCache::FindGSCEntryWithoutLock(Oid db_id, Index hash_index, int *location)
+{
+ int index = 0;
+ for (Dlelem *elt = DLGetHead(m_bucket_list.GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ index++;
+ GlobalSysDBCacheEntry *entry = (GlobalSysDBCacheEntry *)DLE_VAL(elt);
+ if (entry->m_dbOid != db_id) {
+ continue;
+ }
+ pg_atomic_fetch_add_u64(&entry->m_refcount, 1);
+ *location = index;
+ return entry;
+ }
+ return NULL;
+}
+
+GlobalSysDBCacheEntry *GlobalSysDBCache::SearchGSCEntry(Oid db_id, Index hash_index, char *db_name)
+{
+ int location = INVALID_LOCATION;
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ GlobalSysDBCacheEntry *existDbEntry = FindGSCEntryWithoutLock(db_id, hash_index, &location);
+ if (existDbEntry != NULL) {
+ m_dbstat_manager.ThreadHoldDB(existDbEntry);
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ if (existDbEntry != NULL) {
+ TopnLruMoveToFront(&existDbEntry->m_cache_elem, m_bucket_list.GetBucket(hash_index), &m_db_locks[hash_index],
+ location);
+ return existDbEntry;
+ }
+
+ /* create existDbEntry is a simple operator, so put the code in the write lock is ok */
+ GlobalSysDBCacheEntry *newDbEntry = CreateGSCEntry(db_id, hash_index, db_name);
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+
+ /* otherwise other thread insert one db before */
+ existDbEntry = FindGSCEntryWithoutLock(db_id, hash_index, &location);
+ if (existDbEntry != NULL) {
+ m_dbstat_manager.ThreadHoldDB(existDbEntry);
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ newDbEntry->Free(newDbEntry);
+ return existDbEntry;
+ }
+
+ AddHeadToBucket(hash_index, newDbEntry);
+ newDbEntry->m_refcount = 1;
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ return newDbEntry;
+}
+
+GlobalSysDBCacheEntry *GlobalSysDBCache::GetGSCEntry(Oid db_id, char *db_name)
+{
+ Assert(db_id != InvalidOid);
+ uint32 hash_value = oid_hash((void *)&(db_id), sizeof(Oid));
+ Index hash_index = HASH_INDEX(hash_value, m_nbuckets);
+ GlobalSysDBCacheEntry *entry = SearchGSCEntry(db_id, hash_index, db_name);
+
+ Refresh(entry);
+ return entry;
+}
+
+GlobalSysDBCacheEntry *GlobalSysDBCache::GetSharedGSCEntry()
+{
+ if (unlikely(m_global_shared_db_entry->GetDBUsedSpace() > GLOBAL_DB_MEMORY_MAX)) {
+ m_global_shared_db_entry->ResetDBCache();
+ }
+
+ return m_global_shared_db_entry;
+}
+
+void GlobalSysDBCache::ReleaseTempGSCEntry(GlobalSysDBCacheEntry *entry)
+{
+ ResourceOwner owner = LOCAL_SYSDB_RESOWNER;
+ ResourceOwnerForgetGlobalDBEntry(owner, entry);
+ pg_atomic_fetch_sub_u64(&entry->m_refcount, 1);
+ PthreadRWlockUnlock(owner, &m_db_locks[entry->m_hash_index]);
+}
+
+GlobalSysDBCacheEntry *GlobalSysDBCache::FindTempGSCEntry(Oid db_id)
+{
+ ResourceOwner owner = LOCAL_SYSDB_RESOWNER;
+ ResourceOwnerEnlargeGlobalDBEntry(owner);
+ uint32 hash_value = oid_hash((void *)&(db_id), sizeof(Oid));
+ Index hash_index = HASH_INDEX(hash_value, m_nbuckets);
+ int location = INVALID_LOCATION;
+ PthreadRWlockRdlock(owner, &m_db_locks[hash_index]);
+ GlobalSysDBCacheEntry *exist_db = FindGSCEntryWithoutLock(db_id, hash_index, &location);
+ if (exist_db == NULL) {
+ PthreadRWlockUnlock(owner, &m_db_locks[hash_index]);
+ return NULL;
+ }
+ Assert(exist_db->m_hash_index == hash_index);
+ ResourceOwnerRememberGlobalDBEntry(owner, exist_db);
+ return exist_db;
+}
+
+void GlobalSysDBCache::DropDB(Oid db_id, bool need_clear)
+{
+ Assert(db_id != InvalidOid);
+ uint32 hash_value = oid_hash((void *)&(db_id), sizeof(Oid));
+ Index hash_index = HASH_INDEX(hash_value, m_nbuckets);
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ for (Dlelem *elt = DLGetHead(m_bucket_list.GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ GlobalSysDBCacheEntry *entry = (GlobalSysDBCacheEntry *)DLE_VAL(elt);
+ if (entry->m_dbOid != db_id) {
+ continue; /* ignore dead entries */
+ }
+ /* we dont care refcount here, all dropdb caller make sure that no other active backend accesses this db
+ * if any new session access dead db, ereport fatal and retry */
+ entry->m_isDead = true;
+ HandleDeadDB(entry);
+ if (need_clear) {
+ m_dbstat_manager.DropDB(db_id, hash_index);
+ }
+ break;
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ FreeDeadDBs();
+}
+
+static void InitGlobalSysDBCacheEntry(GlobalSysDBCacheEntry *entry, MemoryContext entry_parent, Oid db_id,
+ Index hash_index, char *db_name)
+{
+ entry->m_refcount = 0;
+ entry->m_isDead = false;
+ entry->m_hash_value = oid_hash((void *)&(db_id), sizeof(Oid));
+ entry->m_hash_index = hash_index;
+ entry->m_dbOid = db_id;
+ entry->m_dbstat =
+ (GlobalSysCacheStat *)MemoryContextAllocZero(entry_parent, sizeof(GlobalSysCacheStat));
+ entry->m_dbstat->hash_index = hash_index;
+ entry->m_dbstat->db_oid = db_id;
+ /* the follow code may bring about exception like error report, which will be converted to FATAL */
+ const int MAX_CXT_NAME = 100;
+ char cxtname[MAX_CXT_NAME];
+ error_t rc = sprintf_s(cxtname, MAX_CXT_NAME, "%s_%u", "GlobalSysDBCacheEntryMemCxt", db_id);
+ securec_check_ss(rc, "\0", "\0");
+ for (uint32 i = 0; i < entry->m_memcxt_nums; i++) {
+ entry->m_mem_cxt_groups[i] =
+#ifdef ENABLE_LIET_MODE
+ AllocSetContextCreate(entry_parent, cxtname, ALLOCSET_SMALL_MINSIZE, ALLOCSET_SMALL_INITSIZE,
+ ALLOCSET_SMALL_MAXSIZE, SHARED_CONTEXT);
+#else
+ AllocSetContextCreate(entry_parent, cxtname, ALLOCSET_DEFAULT_MINSIZE, ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE, SHARED_CONTEXT);
+#endif
+ }
+ entry->m_dbName = MemoryContextStrdup(entry->m_mem_cxt_groups[0], db_name);
+
+ /* allocate global CatCache memory */
+ entry->m_systabCache = New(entry->m_mem_cxt_groups[0]) GlobalSysTabCache(db_id,
+ db_id == InvalidOid, entry);
+ entry->m_systabCache->Init();
+
+ /* allocate global RelCache memory */
+ entry->m_tabdefCache = New(entry->m_mem_cxt_groups[0]) GlobalTabDefCache(db_id,
+ db_id == InvalidOid, entry);
+ entry->m_tabdefCache->Init();
+
+ /* emptry shared partdef, need refine */
+ if (db_id == InvalidOid) {
+ entry->m_partdefCache = NULL;
+ } else {
+ entry->m_partdefCache = New(entry->m_mem_cxt_groups[0]) GlobalPartDefCache(db_id,
+ db_id == InvalidOid, entry);
+ entry->m_partdefCache->Init();
+ }
+
+ /* allocate global RelmapCache */
+ entry->m_relmapCache = New(entry->m_mem_cxt_groups[0]) GlobalRelMapCache(db_id,
+ db_id == InvalidOid);
+ entry->m_relmapCache->Init();
+}
+
+/**
+ * assign appropriate nums of memory context for one db according to nums of active dbs
+ * for high concurrent scene, nums of dbs is small, conflict of palloc is high, so need more nums of memcxts
+ * for multidbs scene, conflict of palloc in one db is low, so need less nums of memcxts
+ **/
+static uint32 GetMemoryContextNum(uint32 active_db_num)
+{
+ uint32 memcxt_nums;
+ if (active_db_num < 16) {
+ memcxt_nums = 16;
+ } else if (active_db_num < 64) {
+ memcxt_nums = 8;
+ } else {
+ memcxt_nums = 4;
+ }
+ return memcxt_nums;
+}
+
+GlobalSysDBCacheEntry *GlobalSysDBCache::CreateGSCEntry(Oid db_id, Index hash_index, char *db_name)
+{
+ Assert(hash_index == HASH_INDEX(oid_hash((void *)&(db_id), sizeof(Oid)), m_nbuckets));
+ ResourceOwner owner = LOCAL_SYSDB_RESOWNER;
+ Assert(t_thrd.lsc_cxt.lsc != NULL);
+ Assert(owner != NULL);
+ ResourceOwnerEnlargeGlobalDBEntry(owner);
+ uint32 memcxt_nums = GetMemoryContextNum(m_bucket_list.GetActiveElementCount());
+
+ GlobalSysDBCacheEntry *entry =
+ (GlobalSysDBCacheEntry *)MemoryContextAllocZero(m_global_sysdb_mem_cxt,
+ offsetof(GlobalSysDBCacheEntry, m_mem_cxt_groups) + memcxt_nums * sizeof(MemoryContext));
+ entry->m_memcxt_nums = memcxt_nums;
+ ResourceOwnerRememberGlobalDBEntry(owner, entry);
+ InitGlobalSysDBCacheEntry(entry, m_global_sysdb_mem_cxt, db_id, hash_index, db_name);
+ ResourceOwnerForgetGlobalDBEntry(owner, entry);
+ DLInitElem(&entry->m_cache_elem, (void *)entry);
+
+ GSC_CACHE2_elog("GlobalSysDBCacheEntry Create with db oid %u", db_id);
+ return entry;
+}
+
+GlobalSysDBCacheEntry *GlobalSysDBCache::CreateSharedGSCEntry()
+{
+ Oid db_id = InvalidOid;
+ uint32 hash_value = oid_hash((void *)&(db_id), sizeof(Oid));
+ Index hash_index = HASH_INDEX(hash_value, m_nbuckets);
+ uint32 memcxt_nums = GetMemoryContextNum(0);
+ GlobalSysDBCacheEntry *entry =
+ (GlobalSysDBCacheEntry *)MemoryContextAllocZero(m_global_sysdb_mem_cxt,
+ offsetof(GlobalSysDBCacheEntry, m_mem_cxt_groups) + memcxt_nums * sizeof(MemoryContext));
+ entry->m_memcxt_nums = memcxt_nums;
+ InitGlobalSysDBCacheEntry(entry, m_global_sysdb_mem_cxt, db_id, hash_index, "");
+
+ DLInitElem(&entry->m_cache_elem, (void *)entry);
+ return entry;
+}
+
+void GlobalSysDBCache::CalcDynamicHashBucketStrategy()
+{
+ uint64 expect_max_db_count = EXPECT_MAX_DB_COUNT;
+ uint64 rel_db_count = m_bucket_list.GetActiveElementCount();
+ if (rel_db_count < expect_max_db_count) {
+ dynamic_hash_bucket_strategy = DynamicHashBucketDefault;
+ return;
+ }
+
+ if (rel_db_count <= (expect_max_db_count << 1)) {
+ dynamic_hash_bucket_strategy = DynamicHashBucketHalf;
+ return;
+ }
+ if (rel_db_count <= (expect_max_db_count << 2)) {
+ dynamic_hash_bucket_strategy = DynamicHashBucketQuarter;
+ return;
+ }
+ if (rel_db_count <= (expect_max_db_count << 3)) {
+ dynamic_hash_bucket_strategy = DynamicHashBucketEighth;
+ return;
+ }
+ dynamic_hash_bucket_strategy = DynamicHashBucketMin;
+}
+
+DynamicGSCMemoryLevel GlobalSysDBCache::CalcDynamicGSCMemoryLevel(uint64 total_space)
+{
+ if (total_space < SAFETY_GSC_MEMORY_SPACE) {
+ return DynamicGSCMemoryLow;
+ }
+
+ if (total_space < REAL_GSC_MEMORY_SPACE) {
+ return DynamicGSCMemoryHigh;
+ }
+
+ if (total_space < MAX_GSC_MEMORY_SPACE) {
+ return DynamicGSCMemoryOver;
+ }
+ return DynamicGSCMemoryOutOfControl;
+}
+
+void GlobalSysDBCache::GSCMemThresholdCheck()
+{
+ if (!StopInsertGSC()) {
+ return;
+ }
+
+ /* only one clean is enough */
+ ResourceOwnerEnlargeGlobalIsExclusive(LOCAL_SYSDB_RESOWNER);
+ if (!atomic_compare_exchange_u32(&m_is_memorychecking, 0, 1)) {
+ return;
+ }
+ ResourceOwnerRememberGlobalIsExclusive(LOCAL_SYSDB_RESOWNER, &m_is_memorychecking);
+
+ CalcDynamicHashBucketStrategy();
+ DynamicGSCMemoryLevel memory_level = CalcDynamicGSCMemoryLevel(gsc_rough_used_space);
+
+ Index last_hash_index = m_swapout_hash_index;
+ switch (memory_level) {
+ /* clean all to recycle memory */
+ case DynamicGSCMemoryOutOfControl:
+ while (last_hash_index < (Index)m_nbuckets) {
+ SwapoutGivenDBInstance(last_hash_index, ALL_DB_OID);
+ SwapOutGivenDBContent(last_hash_index, ALL_DB_OID, memory_level);
+ last_hash_index++;
+#ifndef ENABLE_LITE_MODE
+ if (MemoryUnderControl()) {
+ break;
+ }
+#endif
+ }
+ break;
+ /* swapout all to recycle memory */
+ case DynamicGSCMemoryOver:
+ /* fall through */
+
+ /* swapout one to recycle memory */
+ case DynamicGSCMemoryHigh:
+ while (last_hash_index < (Index)m_nbuckets) {
+#ifdef ENABLE_LITE_MODE
+ SwapoutGivenDBInstance(last_hash_index, ALL_DB_OID);
+#endif
+ SwapOutGivenDBContent(last_hash_index, ALL_DB_OID, memory_level);
+ last_hash_index++;
+#ifndef ENABLE_LITE_MODE
+ if (MemoryUnderControl()) {
+ break;
+ }
+#endif
+ }
+ break;
+ case DynamicGSCMemoryLow:
+ /* memory is enough, needn't swapout */
+ break;
+ }
+ m_swapout_hash_index = last_hash_index % ((Index)m_nbuckets);
+
+ Assert(m_is_memorychecking == 1);
+ atomic_compare_exchange_u32(&m_is_memorychecking, 1, 0);
+ ResourceOwnerForgetGlobalIsExclusive(LOCAL_SYSDB_RESOWNER, &m_is_memorychecking);
+ FreeDeadDBs();
+}
+
+void GlobalSysDBCache::InvalidAllRelations()
+{
+ for (Index hash_index = 0; hash_index < (Index)m_nbuckets; hash_index++) {
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ for (Dlelem *elt = DLGetTail(m_bucket_list.GetBucket(hash_index)); elt != NULL;) {
+ GlobalSysDBCacheEntry *entry = (GlobalSysDBCacheEntry *)DLE_VAL(elt);
+ elt = DLGetPred(elt);
+ entry->m_tabdefCache->ResetRelCaches();
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ }
+ m_global_shared_db_entry->m_tabdefCache->ResetRelCaches();
+}
+
+void GlobalSysDBCache::SwapOutGivenDBContent(Index hash_index, Oid db_id, DynamicGSCMemoryLevel mem_level)
+{
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ for (Dlelem *elt = DLGetTail(m_bucket_list.GetBucket(hash_index)); elt != NULL;) {
+ GlobalSysDBCacheEntry *entry = (GlobalSysDBCacheEntry *)DLE_VAL(elt);
+ elt = DLGetPred(elt);
+ if (db_id != (Oid)ALL_DB_OID && entry->m_dbOid != db_id) {
+ continue;
+ }
+
+ if (mem_level == DynamicGSCMemoryOutOfControl) {
+ /* we need drop the element, but dbentry is special, we clean it instead */
+ entry->ResetDBCache();
+ } else if (mem_level == DynamicGSCMemoryOver) {
+ entry->RemoveTailElements();
+ } else if (mem_level == DynamicGSCMemoryHigh) {
+ if (entry->GetDBUsedSpace() > GLOBAL_DB_MEMORY_MAX) {
+ entry->RemoveTailElements();
+ /* memory is under control, swapout one db is enough */
+ break;
+ }
+ } else {
+ Assert(false);
+ }
+#ifndef ENABLE_LITE_MODE
+ /* we are not in gs_gsc_clean, so break when memory is under control */
+ if (mem_level != DynamicGSCMemoryOutOfControl && MemoryUnderControl()) {
+ break;
+ }
+#endif
+
+ /* clean given db only */
+ if (db_id != (Oid)ALL_DB_OID) {
+ break;
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+}
+
+void GlobalSysDBCache::SwapoutGivenDBInstance(Index hash_index, Oid db_id)
+{
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ for (Dlelem *elt = DLGetTail(m_bucket_list.GetBucket(hash_index)); elt != NULL;) {
+ GlobalSysDBCacheEntry *entry = (GlobalSysDBCacheEntry *)DLE_VAL(elt);
+ elt = DLGetPred(elt);
+ if (db_id != (Oid)ALL_DB_OID && entry->m_dbOid != db_id) {
+ continue;
+ }
+
+ if (entry->m_refcount == 0) {
+ GSC_CACHE2_elog("GlobalSysDBCacheEntry Weedout with db oid %u", entry->db_id);
+ HandleDeadDB(entry);
+ }
+
+ /* clean given db only */
+ if (db_id != (Oid)ALL_DB_OID) {
+ break;
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+}
+
+void GlobalSysDBCache::InitRelStoreInSharedFlag()
+{
+ errno_t rc = memset_s(m_rel_store_in_shared, FirstBootstrapObjectId, 0, FirstBootstrapObjectId);
+ securec_check(rc, "\0", "\0");
+ m_rel_store_in_shared[AuthIdRelationId] = true;
+ m_rel_store_in_shared[AuthMemRelationId] = true;
+ m_rel_store_in_shared[DatabaseRelationId] = true;
+ m_rel_store_in_shared[PLTemplateRelationId] = true;
+ m_rel_store_in_shared[SharedDescriptionRelationId] = true;
+ m_rel_store_in_shared[SharedDependRelationId] = true;
+ m_rel_store_in_shared[SharedSecLabelRelationId] = true;
+ m_rel_store_in_shared[TableSpaceRelationId] = true;
+ m_rel_store_in_shared[AuthHistoryRelationId] = true;
+ m_rel_store_in_shared[UserStatusRelationId] = true;
+
+ m_rel_store_in_shared[PgxcGroupRelationId] = true;
+ m_rel_store_in_shared[PgxcNodeRelationId] = true;
+ m_rel_store_in_shared[ResourcePoolRelationId] = true;
+ m_rel_store_in_shared[WorkloadGroupRelationId] = true;
+ m_rel_store_in_shared[AppWorkloadGroupMappingRelationId] = true;
+ m_rel_store_in_shared[GsGlobalConfigRelationId] = true;
+
+ m_rel_store_in_shared[DbRoleSettingRelationId] = true;
+ m_rel_store_in_shared[PgJobRelationId] = true;
+ m_rel_store_in_shared[PgJobProcRelationId] = true;
+ m_rel_store_in_shared[DataSourceRelationId] = true;
+ m_rel_store_in_shared[GSObsScanInfoRelationId] = true;
+ m_rel_store_in_shared[AuthIdRolnameIndexId] = true;
+ m_rel_store_in_shared[AuthIdOidIndexId] = true;
+ m_rel_store_in_shared[AuthMemRoleMemIndexId] = true;
+ m_rel_store_in_shared[AuthMemMemRoleIndexId] = true;
+ m_rel_store_in_shared[DatabaseNameIndexId] = true;
+ m_rel_store_in_shared[DatabaseOidIndexId] = true;
+ m_rel_store_in_shared[PLTemplateNameIndexId] = true;
+ m_rel_store_in_shared[SharedDescriptionObjIndexId] = true;
+ m_rel_store_in_shared[SharedDependDependerIndexId] = true;
+ m_rel_store_in_shared[SharedDependReferenceIndexId] = true;
+ m_rel_store_in_shared[SharedSecLabelObjectIndexId] = true;
+ m_rel_store_in_shared[TablespaceOidIndexId] = true;
+ m_rel_store_in_shared[TablespaceNameIndexId] = true;
+ m_rel_store_in_shared[AuthHistoryIndexId] = true;
+ m_rel_store_in_shared[AuthHistoryOidIndexId] = true;
+ m_rel_store_in_shared[UserStatusRoleidIndexId] = true;
+ m_rel_store_in_shared[UserStatusOidIndexId] = true;
+
+ m_rel_store_in_shared[PgxcNodeNodeNameIndexId] = true;
+ m_rel_store_in_shared[PgxcNodeNodeNameIndexIdOld] = true;
+ m_rel_store_in_shared[PgxcNodeNodeIdIndexId] = true;
+ m_rel_store_in_shared[PgxcNodeOidIndexId] = true;
+ m_rel_store_in_shared[PgxcGroupGroupNameIndexId] = true;
+ m_rel_store_in_shared[PgxcGroupOidIndexId] = true;
+ m_rel_store_in_shared[PgxcGroupToastTable] = true;
+ m_rel_store_in_shared[PgxcGroupToastIndex] = true;
+ m_rel_store_in_shared[ResourcePoolPoolNameIndexId] = true;
+ m_rel_store_in_shared[ResourcePoolOidIndexId] = true;
+ m_rel_store_in_shared[WorkloadGroupGroupNameIndexId] = true;
+ m_rel_store_in_shared[WorkloadGroupOidIndexId] = true;
+ m_rel_store_in_shared[AppWorkloadGroupMappingNameIndexId] = true;
+ m_rel_store_in_shared[AppWorkloadGroupMappingOidIndexId] = true;
+
+ m_rel_store_in_shared[DbRoleSettingDatidRolidIndexId] = true;
+ m_rel_store_in_shared[PgJobOidIndexId] = true;
+ m_rel_store_in_shared[PgJobIdIndexId] = true;
+ m_rel_store_in_shared[PgJobProcOidIndexId] = true;
+ m_rel_store_in_shared[PgJobProcIdIndexId] = true;
+ m_rel_store_in_shared[DataSourceOidIndexId] = true;
+ m_rel_store_in_shared[DataSourceNameIndexId] = true;
+ m_rel_store_in_shared[PgShdescriptionToastTable] = true;
+ m_rel_store_in_shared[PgShdescriptionToastIndex] = true;
+ m_rel_store_in_shared[PgDbRoleSettingToastTable] = true;
+ m_rel_store_in_shared[PgDbRoleSettingToastIndex] = true;
+
+ m_rel_store_in_shared[SubscriptionRelationId] = true;
+ m_rel_store_in_shared[SubscriptionObjectIndexId] = true;
+ m_rel_store_in_shared[SubscriptionNameIndexId] = true;
+ m_rel_store_in_shared[ReplicationOriginRelationId] = true;
+ m_rel_store_in_shared[ReplicationOriginIdentIndex] = true;
+ m_rel_store_in_shared[ReplicationOriginNameIndex] = true;
+}
+
+void GlobalSysDBCache::InitRelForInitSysCacheFlag()
+{
+ errno_t rc = memset_s(m_rel_for_init_syscache, FirstNormalObjectId, 0, FirstNormalObjectId);
+ securec_check(rc, "\0", "\0");
+ m_rel_for_init_syscache[ClassOidIndexId] = true;
+ m_rel_for_init_syscache[AttributeRelidNumIndexId] = true;
+ m_rel_for_init_syscache[IndexRelidIndexId] = true;
+ m_rel_for_init_syscache[OpclassOidIndexId] = true;
+ m_rel_for_init_syscache[AccessMethodProcedureIndexId] = true;
+ m_rel_for_init_syscache[RewriteRelRulenameIndexId] = true;
+ m_rel_for_init_syscache[TriggerRelidNameIndexId] = true;
+ m_rel_for_init_syscache[DatabaseNameIndexId] = true;
+ m_rel_for_init_syscache[DatabaseOidIndexId] = true;
+ m_rel_for_init_syscache[AuthIdRolnameIndexId] = true;
+ m_rel_for_init_syscache[AuthIdOidIndexId] = true;
+ m_rel_for_init_syscache[AuthMemMemRoleIndexId] = true;
+ m_rel_for_init_syscache[UserStatusRoleidIndexId] = true;
+}
+
+void GlobalSysDBCache::InitSysCacheRelIds()
+{
+ errno_t rc = memset_s(m_syscache_relids, FirstNormalObjectId, 0, FirstNormalObjectId);
+ securec_check(rc, "\0", "\0");
+ for (int i = 0; i < SysCacheSize; i++) {
+ m_syscache_relids[cacheinfo[i].reloid] = true;
+ }
+}
+
+/*
+ * whenever you change server_mode, call RefreshHotStandby plz
+ * we need know current_mode to support gsc feature
+ */
+void GlobalSysDBCache::RefreshHotStandby()
+{
+ hot_standby = (t_thrd.postmaster_cxt.HaShmData->current_mode != STANDBY_MODE || XLogStandbyInfoActive());
+}
+
+void GlobalSysDBCache::Init(MemoryContext parent)
+{
+ /* every process should call this func once */
+ Assert(!m_is_inited);
+ if (!EnableGlobalSysCache()) {
+ return;
+ }
+ Assert(m_global_sysdb_mem_cxt == NULL);
+ InitRelStoreInSharedFlag();
+ InitRelForInitSysCacheFlag();
+ InitSysCacheRelIds();
+#ifdef ENABLE_LIET_MODE
+ m_global_sysdb_mem_cxt = AllocSetContextCreate(parent, "GlobalSysDBCache", ALLOCSET_SMALL_MINSIZE,
+ ALLOCSET_SMALL_INITSIZE, ALLOCSET_SMALL_MAXSIZE, SHARED_CONTEXT);
+#else
+ m_global_sysdb_mem_cxt = AllocSetContextCreate(parent, "GlobalSysDBCache", ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE, ALLOCSET_DEFAULT_MAXSIZE, SHARED_CONTEXT);
+#endif
+
+ MemoryContext old = MemoryContextSwitchTo(m_global_sysdb_mem_cxt);
+ m_nbuckets = INIT_DB_SIZE;
+ m_bucket_list.Init(m_nbuckets);
+ m_db_locks = (pthread_rwlock_t *)palloc0(sizeof(pthread_rwlock_t) * m_nbuckets);
+ for (int i = 0; i < m_nbuckets; i++) {
+ PthreadRwLockInit(&m_db_locks[i], NULL);
+ }
+ m_dbstat_manager.InitDBStat(m_nbuckets, m_global_sysdb_mem_cxt);
+ Assert(g_instance.attr.attr_memory.global_syscache_threshold != 0);
+ /* the conf file dont have value of gsc threshold, so we need init it by default value */
+ if (m_global_syscache_threshold == 0) {
+ UpdateGSCConfig(g_instance.attr.attr_memory.global_syscache_threshold);
+ }
+ m_global_shared_db_entry = CreateSharedGSCEntry();
+ MemoryContextSwitchTo(old);
+ dynamic_hash_bucket_strategy = DynamicHashBucketDefault;
+ m_is_inited = true;
+}
+
+GlobalSysDBCache::GlobalSysDBCache()
+{
+ m_db_locks = NULL;
+ m_global_sysdb_mem_cxt = NULL;
+ m_nbuckets = 0;
+ m_global_shared_db_entry = NULL;
+ m_global_syscache_threshold = 0;
+ m_is_memorychecking = 0;
+ hot_standby = true;
+ recovery_finished = false;
+ m_swapout_hash_index = 0;
+ m_is_inited = false;
+}
+
+void GlobalSysDBCache::Refresh(GlobalSysDBCacheEntry *entry)
+{
+ if (unlikely(gsc_rough_used_space > MAX_GSC_MEMORY_SPACE)) {
+ GSCMemThresholdCheck();
+ }
+ FreeDeadDBs();
+}
+
+struct GlobalDBStatInfo : GlobalSysCacheStat {
+ Datum db_name;
+ uint64 tup_count;
+ uint64 tup_dead;
+ uint64 tup_space;
+
+ uint64 rel_count;
+ uint64 rel_dead;
+ uint64 rel_space;
+
+ uint64 part_count;
+ uint64 part_dead;
+ uint64 part_space;
+ uint64 total_space;
+ uint64 refcount;
+};
+
+static GlobalDBStatInfo *ConstructGlobalDBStatInfo(GlobalSysDBCacheEntry *entry, GlobalDBStatManager *dbstat_manager)
+{
+ GlobalDBStatInfo *statinfo = (GlobalDBStatInfo *)palloc0(sizeof(GlobalDBStatInfo));
+ statinfo->db_oid = entry->m_dbOid;
+ statinfo->db_name = CStringGetTextDatum(entry->m_dbName);
+ statinfo->hash_index = entry->m_hash_index;
+ statinfo->swapout_count = 0;
+ statinfo->tup_searches = entry->m_dbstat->tup_searches;
+ statinfo->tup_hits = entry->m_dbstat->tup_hits;
+ statinfo->tup_newloads = entry->m_dbstat->tup_newloads;
+ statinfo->tup_count = entry->m_systabCache->GetActiveElementsNum();
+ statinfo->tup_dead = entry->m_systabCache->GetDeadElementsNum();
+ statinfo->tup_space = entry->m_systabCache->GetSysCacheSpaceNum();
+
+ statinfo->rel_searches = entry->m_dbstat->rel_searches;
+ statinfo->rel_hits = entry->m_dbstat->rel_hits;
+ statinfo->rel_newloads = entry->m_dbstat->rel_newloads;
+ statinfo->rel_count = entry->m_tabdefCache->GetActiveElementsNum();
+ statinfo->rel_dead = entry->m_tabdefCache->GetDeadElementsNum();
+ statinfo->rel_space = entry->m_tabdefCache->GetSysCacheSpaceNum();
+ if (entry->m_partdefCache == NULL) {
+ statinfo->part_searches = 0;
+ statinfo->part_hits = 0;
+ statinfo->part_newloads = 0;
+ statinfo->part_count = 0;
+ statinfo->part_dead = 0;
+ statinfo->part_space = 0;
+ } else {
+ statinfo->part_searches = entry->m_dbstat->part_searches;
+ statinfo->part_hits = entry->m_dbstat->part_hits;
+ statinfo->part_newloads = entry->m_dbstat->part_newloads;
+ statinfo->part_count = entry->m_partdefCache->GetActiveElementsNum();
+ statinfo->part_dead = entry->m_partdefCache->GetDeadElementsNum();
+ statinfo->part_space = entry->m_partdefCache->GetSysCacheSpaceNum();
+ }
+ statinfo->total_space = entry->GetDBUsedSpace();
+ statinfo->refcount = entry->m_refcount;
+ if (dbstat_manager != NULL) {
+ dbstat_manager->GetDBStat((GlobalSysCacheStat *)statinfo);
+ }
+ return statinfo;
+}
+
+/* @param db_id 0 means fetch shared db, >0 means fetch given db and shared db, ALL_DB_OID/null means fetch all dbs
+ @param ALL_REL_OID/null means fetch all cache, otherwise fetch given cache */
+List *GlobalSysDBCache::GetGlobalDBStatDetail(Oid db_id, Oid rel_id, GscStatDetail stat_detail)
+{
+ List *stat_list = NIL;
+ /* collect stat info of shared db */
+ GlobalSysDBCacheEntry *shared = GetSharedGSCEntry();
+ if (stat_detail == GscStatDetailDBInfo) {
+ stat_list = lappend(stat_list, ConstructGlobalDBStatInfo(shared, NULL));
+ } else if (stat_detail == GscStatDetailTuple) {
+ stat_list = lappend3(stat_list, shared->m_systabCache->GetCatalogTupleStats(rel_id));
+ } else {
+ Assert(stat_detail == GscStatDetailTable);
+ stat_list = lappend3(stat_list, shared->m_tabdefCache->GetTableStats(rel_id));
+ }
+ if (db_id == InvalidOid) {
+ return stat_list;
+ }
+ Index given_hash_index = ALL_DB_INDEX;
+ if (db_id != ALL_DB_OID) {
+ uint32 hash_value = oid_hash((void *)&(db_id), sizeof(Oid));
+ given_hash_index = HASH_INDEX(hash_value, m_nbuckets);
+ }
+ for (int hash_index = 0; hash_index < m_nbuckets; hash_index++) {
+ if (DLIsNIL(m_bucket_list.GetBucket(hash_index))) {
+ continue;
+ }
+ if (given_hash_index != ALL_DB_INDEX && given_hash_index != (Index)hash_index) {
+ continue;
+ }
+ CHECK_FOR_INTERRUPTS();
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ for (Dlelem *elt = DLGetHead(m_bucket_list.GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ GlobalSysDBCacheEntry *entry = (GlobalSysDBCacheEntry *)DLE_VAL(elt);
+ if (db_id != ALL_DB_OID && db_id != entry->m_dbOid) {
+ continue;
+ }
+ if (stat_detail == GscStatDetailDBInfo) {
+ stat_list = lappend(stat_list, ConstructGlobalDBStatInfo(entry, &m_dbstat_manager));
+ } else if (stat_detail == GscStatDetailTuple) {
+ stat_list = lappend3(stat_list, entry->m_systabCache->GetCatalogTupleStats(rel_id));
+ } else {
+ Assert(stat_detail == GscStatDetailTable);
+ stat_list = lappend3(stat_list, entry->m_tabdefCache->GetTableStats(rel_id));
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_db_locks[hash_index]);
+ }
+ return stat_list;
+}
+
+static void CheckDbOidValid(Oid dbOid)
+{
+ if (dbOid != InvalidOid && dbOid != ALL_DB_OID &&
+ !SearchSysCacheExists(DATABASEOID, ObjectIdGetDatum(dbOid), 0, 0, 0)) {
+ ereport(ERROR, (errmodule(MOD_GSC), errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("dbOid doesn't exist."),
+ errdetail("dbOid is invalid, please pass valid dbOid."), errcause("N/A"),
+ erraction("Please search pg_database table to find valid dbOid.")));
+ }
+}
+
+static const int GLOBAL_STAT_INFO_NUM = 23;
+bool gs_gsc_dbstat_firstcall(PG_FUNCTION_ARGS)
+{
+ if (!superuser()) {
+ ereport(ERROR, (errmodule(MOD_GSC), errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("Fail to see gsc dbstat info."),
+ errdetail("Insufficient privilege to see gsc dbstat info."), errcause("N/A"),
+ erraction("Please login in with superuser or sysdba role or contact database administrator.")));
+ }
+ Oid dbOid = PG_ARGISNULL(0) ? ALL_DB_OID : PG_GETARG_OID(0);
+ CheckDbOidValid(dbOid);
+ FuncCallContext *funcctx = NULL;
+ if (!SRF_IS_FIRSTCALL()) {
+ return true;
+ }
+ funcctx = SRF_FIRSTCALL_INIT();
+ MemoryContext oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ funcctx->tuple_desc = CreateTemplateTupleDesc(GLOBAL_STAT_INFO_NUM, false);
+ int i = 1;
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "database_id", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "database_name", TEXTOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "tup_searches", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "tup_hit", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "tup_miss", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "tup_count", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "tup_dead", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "tup_memory", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "rel_searches", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "rel_hit", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "rel_miss", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "rel_count", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "rel_dead", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "rel_memory", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "part_searches", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "part_hit", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "part_miss", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "part_count", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "part_dead", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "part_memory", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "total_memory", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "swapout_count", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "refcount", INT8OID, -1, 0);
+ funcctx->tuple_desc = BlessTupleDesc(funcctx->tuple_desc);
+
+ List *tmp_list = NIL;
+ if (EnableGlobalSysCache()) {
+ tmp_list = g_instance.global_sysdbcache.GetGlobalDBStatDetail(dbOid, ALL_REL_OID, GscStatDetailDBInfo);
+ }
+ if (list_length(tmp_list) == 0) {
+ MemoryContextSwitchTo(oldcontext);
+ return false;
+ }
+ funcctx->max_calls = list_length(tmp_list);
+ GlobalDBStatInfo **stat_infos = (GlobalDBStatInfo **)palloc(sizeof(GlobalDBStatInfo *) * funcctx->max_calls);
+ MemoryContextSwitchTo(oldcontext);
+ funcctx->user_fctx = stat_infos;
+ ListCell *cell = NULL;
+ foreach (cell, tmp_list) {
+ *stat_infos = (GlobalDBStatInfo *)lfirst(cell);
+ stat_infos++;
+ }
+ list_free_ext(tmp_list);
+ return true;
+}
+
+Datum gs_gsc_dbstat_info(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx = NULL;
+ if (!gs_gsc_dbstat_firstcall(fcinfo)) {
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ if (funcctx->call_cntr >= funcctx->max_calls) {
+ SRF_RETURN_DONE(funcctx);
+ }
+ Datum values[GLOBAL_STAT_INFO_NUM];
+ bool nulls[GLOBAL_STAT_INFO_NUM] = {0};
+ GlobalDBStatInfo *stat_info = ((GlobalDBStatInfo **)funcctx->user_fctx)[funcctx->call_cntr];
+ int i = 0;
+ values[i++] = Int64GetDatum(stat_info->db_oid);
+ values[i++] = stat_info->db_name;
+
+ values[i++] = Int64GetDatum((int64)stat_info->tup_searches);
+ values[i++] = Int64GetDatum((int64)stat_info->tup_hits);
+ values[i++] = Int64GetDatum((int64)stat_info->tup_newloads);
+ values[i++] = Int64GetDatum((int64)stat_info->tup_count);
+ values[i++] = Int64GetDatum((int64)stat_info->tup_dead);
+ values[i++] = Int64GetDatum((int64)stat_info->tup_space);
+
+ values[i++] = Int64GetDatum((int64)stat_info->rel_searches);
+ values[i++] = Int64GetDatum((int64)stat_info->rel_hits);
+ values[i++] = Int64GetDatum((int64)stat_info->rel_newloads);
+ values[i++] = Int64GetDatum((int64)stat_info->rel_count);
+ values[i++] = Int64GetDatum((int64)stat_info->rel_dead);
+ values[i++] = Int64GetDatum((int64)stat_info->rel_space);
+
+ values[i++] = Int64GetDatum((int64)stat_info->part_searches);
+ values[i++] = Int64GetDatum((int64)stat_info->part_hits);
+ values[i++] = Int64GetDatum((int64)stat_info->part_newloads);
+ values[i++] = Int64GetDatum((int64)stat_info->part_count);
+ values[i++] = Int64GetDatum((int64)stat_info->part_dead);
+ values[i++] = Int64GetDatum((int64)stat_info->part_space);
+
+ values[i++] = Int64GetDatum((int64)stat_info->total_space);
+ values[i++] = Int64GetDatum((int64)stat_info->swapout_count);
+ values[i++] = Int64GetDatum((int64)stat_info->refcount);
+ HeapTuple tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+ Datum result = HeapTupleGetDatum(tuple);
+ SRF_RETURN_NEXT(funcctx, result);
+}
+
+/* @param db_id 0 means clean shared db, >0 means clean given db and shared db, ALL_DB_OID/null means clean all dbs */
+void GlobalSysDBCache::Clean(Oid db_id)
+{
+ m_global_shared_db_entry->ResetDBCache();
+ if (db_id == InvalidOid) {
+ return;
+ }
+ Index hash_index = ALL_DB_INDEX;
+ if (db_id != ALL_DB_OID) {
+ uint32 hash_value = oid_hash((void *)&(db_id), sizeof(Oid));
+ hash_index = HASH_INDEX(hash_value, m_nbuckets);
+ }
+ /* skip m_is_swappingout check here */
+ if (hash_index == ALL_DB_INDEX) {
+ Assert(db_id == ALL_DB_OID);
+ for (Index hash_index = 0; hash_index < (Index)m_nbuckets; hash_index++) {
+ SwapoutGivenDBInstance(hash_index, ALL_DB_OID);
+ SwapOutGivenDBContent(hash_index, ALL_DB_OID, DynamicGSCMemoryOutOfControl);
+ }
+ } else {
+ SwapoutGivenDBInstance(hash_index, ALL_DB_OID);
+ SwapOutGivenDBContent(hash_index, ALL_DB_OID, DynamicGSCMemoryOutOfControl);
+ }
+ FreeDeadDBs();
+}
+
+Datum gs_gsc_clean(PG_FUNCTION_ARGS)
+{
+ if (!superuser()) {
+ ereport(ERROR, (errmodule(MOD_GSC), errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("Fail to clean gsc."),
+ errdetail("Insufficient privilege to clean gsc."), errcause("N/A"),
+ erraction("Please login in with superuser or sysdba role or contact database administrator.")));
+ }
+ Oid dbOid = PG_ARGISNULL(0) ? ALL_DB_OID : PG_GETARG_OID(0);
+ CheckDbOidValid(dbOid);
+ if (EnableGlobalSysCache()) {
+ g_instance.global_sysdbcache.Clean(dbOid);
+ PG_RETURN_BOOL(true);
+ }
+ PG_RETURN_BOOL(false);
+}
+
+static const int GLOBAL_CATALOG_INFO_NUM = 11;
+bool gs_gsc_catalog_firstcall(PG_FUNCTION_ARGS)
+{
+ if (!superuser()) {
+ ereport(ERROR, (errmodule(MOD_GSC), errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("Fail to see gsc catalog detail."),
+ errdetail("Insufficient privilege to see gsc catalog detail."), errcause("N/A"),
+ erraction("Please login in with superuser or sysdba role or contact database administrator.")));
+ }
+ Oid dbOid = PG_ARGISNULL(0) ? ALL_DB_OID : PG_GETARG_OID(0);
+ Oid relOid = PG_ARGISNULL(1) ? ALL_REL_OID : PG_GETARG_INT32(1);
+ CheckDbOidValid(dbOid);
+ FuncCallContext *funcctx = NULL;
+ if (!SRF_IS_FIRSTCALL()) {
+ return true;
+ }
+ funcctx = SRF_FIRSTCALL_INIT();
+ MemoryContext oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ funcctx->tuple_desc = CreateTemplateTupleDesc(GLOBAL_CATALOG_INFO_NUM, false);
+ int i = 1;
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "database_id", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "database_name", TEXTOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "rel_id", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "rel_name", TEXTOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "cache_id", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "self", TEXTOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "ctid", TEXTOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "infomask", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "infomask2", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "hash_value", INT8OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)i++, "refcount", INT8OID, -1, 0);
+ funcctx->tuple_desc = BlessTupleDesc(funcctx->tuple_desc);
+
+ List *tmp_list = NIL;
+ if (EnableGlobalSysCache()) {
+ tmp_list = g_instance.global_sysdbcache.GetGlobalDBStatDetail(dbOid, relOid, GscStatDetailTuple);
+ }
+ if (list_length(tmp_list) == 0) {
+ MemoryContextSwitchTo(oldcontext);
+ return false;
+ }
+ funcctx->max_calls = list_length(tmp_list);
+ GlobalCatalogTupleStat **tuple_stat_list =
+ (GlobalCatalogTupleStat **)palloc(sizeof(GlobalCatalogTupleStat *) * funcctx->max_calls);
+ MemoryContextSwitchTo(oldcontext);
+ funcctx->user_fctx = tuple_stat_list;
+ ListCell *cell = NULL;
+ foreach (cell, tmp_list) {
+ *tuple_stat_list = (GlobalCatalogTupleStat *)lfirst(cell);
+ tuple_stat_list++;
+ }
+ list_free_ext(tmp_list);
+ return true;
+}
+
+Datum gs_gsc_catalog_detail(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx = NULL;
+ if (!gs_gsc_catalog_firstcall(fcinfo)) {
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ if (funcctx->call_cntr >= funcctx->max_calls) {
+ SRF_RETURN_DONE(funcctx);
+ }
+ Datum values[GLOBAL_CATALOG_INFO_NUM];
+ bool nulls[GLOBAL_CATALOG_INFO_NUM] = {0};
+ GlobalCatalogTupleStat *tuple_stat = ((GlobalCatalogTupleStat **)funcctx->user_fctx)[funcctx->call_cntr];
+ int i = 0;
+ char str[NAMEDATALEN];
+ values[i++] = Int64GetDatum(tuple_stat->db_oid);
+ values[i++] = tuple_stat->db_name_datum;
+ values[i++] = Int64GetDatum((int64)tuple_stat->rel_oid);
+ values[i++] = tuple_stat->rel_name_datum;
+ values[i++] = Int64GetDatum((int64)tuple_stat->cache_id);
+
+ error_t rc = sprintf_s(str, NAMEDATALEN, "(%u, %u)", BlockIdGetBlockNumber(&tuple_stat->self.ip_blkid),
+ (uint)tuple_stat->self.ip_posid);
+ securec_check_ss(rc, "\0", "\0");
+ values[i++] = CStringGetTextDatum(str);
+ rc = sprintf_s(str, NAMEDATALEN, "(%u, %u)", BlockIdGetBlockNumber(&tuple_stat->ctid.ip_blkid),
+ (uint)tuple_stat->ctid.ip_posid);
+ securec_check_ss(rc, "\0", "\0");
+ values[i++] = CStringGetTextDatum(str);
+
+ values[i++] = Int64GetDatum((int64)tuple_stat->infomask);
+ values[i++] = Int64GetDatum((int64)tuple_stat->infomask2);
+ values[i++] = Int64GetDatum((int64)tuple_stat->hash_value);
+ values[i++] = Int64GetDatum((int64)tuple_stat->refcount);
+ HeapTuple tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+ Datum result = HeapTupleGetDatum(tuple);
+ SRF_RETURN_NEXT(funcctx, result);
+}
+
+static const int GLOBAL_TABLE_INFO_NUM = 21;
+bool gs_gsc_table_firstcall(PG_FUNCTION_ARGS)
+{
+ if (!superuser()) {
+ ereport(ERROR, (errmodule(MOD_GSC), errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("Fail to see gsc table detail."),
+ errdetail("Insufficient privilege to see gsc table detail."), errcause("N/A"),
+ erraction("Please login in with superuser or sysdba role or contact database administrator.")));
+ }
+
+ Oid dbOid = PG_ARGISNULL(0) ? ALL_DB_OID : PG_GETARG_OID(0);
+ Oid relOid = PG_ARGISNULL(1) ? ALL_REL_OID : PG_GETARG_INT32(1);
+ CheckDbOidValid(dbOid);
+
+ FuncCallContext *funcctx = NULL;
+ if (!SRF_IS_FIRSTCALL()) {
+ return true;
+ }
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ MemoryContext oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+ funcctx->tuple_desc = CreateTemplateTupleDesc(GLOBAL_TABLE_INFO_NUM, false);
+ int attrno = 1;
+
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "database_id", OIDOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "database_name", TEXTOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "reloid", OIDOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relname", TEXTOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relnamespace", OIDOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "reltype", OIDOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "reloftype", OIDOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relowner", OIDOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relam", OIDOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relfilenode", OIDOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "reltablespace", OIDOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relhasindex", BOOLOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relisshared", BOOLOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relkind", CHAROID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relnatts", INT2OID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relhasoids", BOOLOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "relhaspkey", BOOLOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "parttype", CHAROID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "tdhasuids", BOOLOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "attnames", TEXTOID, -1, 0);
+ TupleDescInitEntry(funcctx->tuple_desc, (AttrNumber)attrno++, "extinfo", TEXTOID, -1, 0);
+
+ funcctx->tuple_desc = BlessTupleDesc(funcctx->tuple_desc);
+
+ List *tmp_list = NIL;
+ if (EnableGlobalSysCache()) {
+ tmp_list = g_instance.global_sysdbcache.GetGlobalDBStatDetail(dbOid, relOid, GscStatDetailTable);
+ }
+
+ if (list_length(tmp_list) == 0) {
+ MemoryContextSwitchTo(oldcontext);
+ return false;
+ }
+
+ funcctx->max_calls = list_length(tmp_list);
+ GlobalCatalogTableStat **table_stat_list =
+ (GlobalCatalogTableStat **)palloc(sizeof(GlobalCatalogTableStat *) * funcctx->max_calls);
+ MemoryContextSwitchTo(oldcontext);
+ funcctx->user_fctx = table_stat_list;
+ ListCell *cell = NULL;
+ foreach (cell, tmp_list) {
+ *table_stat_list = (GlobalCatalogTableStat *)lfirst(cell);
+ table_stat_list++;
+ }
+ list_free_ext(tmp_list);
+
+ return true;
+}
+
+int rd_rel_to_datum(Datum *values, Form_pg_class rd_rel)
+{
+ int attrno = 0;
+ values[attrno++] = rd_rel->relnamespace;
+ values[attrno++] = rd_rel->reltype;
+ values[attrno++] = rd_rel->reloftype;
+ values[attrno++] = rd_rel->relowner;
+ values[attrno++] = rd_rel->relam;
+ values[attrno++] = rd_rel->relfilenode;
+ values[attrno++] = rd_rel->reltablespace;
+ values[attrno++] = rd_rel->relhasindex;
+ values[attrno++] = rd_rel->relisshared;
+ values[attrno++] = rd_rel->relkind;
+ values[attrno++] = rd_rel->relnatts;
+ values[attrno++] = rd_rel->relhasoids;
+ values[attrno++] = rd_rel->relhaspkey;
+ values[attrno++] = rd_rel->parttype;
+ return attrno;
+}
+
+int rd_att_to_datum(Datum *values, TupleDesc rd_att)
+{
+ int attrno = 0;
+ values[attrno++] = rd_att->tdhasuids;
+ StringInfoData strinfo;
+ initStringInfo(&strinfo);
+
+ for (int i = 0; i < rd_att->natts; i++) {
+ if (i != 0) {
+ appendStringInfoString(&strinfo, ",");
+ }
+ appendStringInfoString(&strinfo, "'");
+ appendStringInfoString(&strinfo, rd_att->attrs[i]->attname.data);
+ appendStringInfoString(&strinfo, "'");
+ }
+ values[attrno++] = CStringGetTextDatum(strinfo.data);
+ pfree_ext(strinfo.data);
+
+ return attrno;
+}
+
+Datum gs_gsc_table_detail(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx = NULL;
+ if (!gs_gsc_table_firstcall(fcinfo)) {
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ if (funcctx->call_cntr >= funcctx->max_calls) {
+ SRF_RETURN_DONE(funcctx);
+ }
+
+ Datum values[GLOBAL_TABLE_INFO_NUM];
+ bool nulls[GLOBAL_TABLE_INFO_NUM] = {0};
+ nulls[GLOBAL_TABLE_INFO_NUM - 1] = true;
+ GlobalCatalogTableStat *table_stat = ((GlobalCatalogTableStat **)funcctx->user_fctx)[funcctx->call_cntr];
+ int attrno = 0;
+
+ values[attrno++] = Int64GetDatum(table_stat->db_id);
+ values[attrno++] = table_stat->db_name;
+ values[attrno++] = Int64GetDatum((int64)table_stat->rel_id);
+ values[attrno++] = CStringGetTextDatum(table_stat->rd_rel->relname.data);
+ attrno = rd_rel_to_datum(values + attrno, table_stat->rd_rel) + attrno;
+ attrno = rd_att_to_datum(values + attrno, table_stat->rd_att) + attrno;
+ Assert(attrno == GLOBAL_TABLE_INFO_NUM - 1);
+
+ /* form physical tuple and return as datum tuple */
+ HeapTuple tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+ Datum result = HeapTupleGetDatum(tuple);
+
+ SRF_RETURN_NEXT(funcctx, result);
+}
+
+
+int ResizeHashBucket(int origin_nbucket, DynamicHashBucketStrategy strategy)
+{
+ int cc_nbuckets = origin_nbucket;
+ Assert(cc_nbuckets > 0 && (cc_nbuckets & -cc_nbuckets) == cc_nbuckets);
+ if (cc_nbuckets <= MinHashBucketSize) {
+ return cc_nbuckets;
+ }
+ switch (strategy) {
+ case DynamicHashBucketDefault:
+ break;
+ case DynamicHashBucketHalf:
+ cc_nbuckets = cc_nbuckets >> 1;
+ break;
+ case DynamicHashBucketQuarter:
+ cc_nbuckets = cc_nbuckets >> 2;
+ break;
+ case DynamicHashBucketEighth:
+ cc_nbuckets = cc_nbuckets >> 3;
+ break;
+ case DynamicHashBucketMin:
+ /* when off, dont do palloc */
+ cc_nbuckets = MinHashBucketSize;
+ break;
+ }
+ if (cc_nbuckets <= MinHashBucketSize) {
+ return MinHashBucketSize;
+ }
+ return cc_nbuckets;
+}
+
+void NotifyGscRecoveryFinished()
+{
+ if (EnableGlobalSysCache()) {
+ g_instance.global_sysdbcache.recovery_finished = true;
+ }
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/knl_globalsystabcache.cpp b/src/common/backend/utils/cache/knl_globalsystabcache.cpp
new file mode 100644
index 000000000..cc1400519
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_globalsystabcache.cpp
@@ -0,0 +1,245 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "executor/executor.h"
+#include "utils/knl_globalsystabcache.h"
+#include "utils/knl_globaldbstatmanager.h"
+#include "knl/knl_instance.h"
+#include "knl/knl_session.h"
+#include "utils/memutils.h"
+#include "storage/lmgr.h"
+
+GlobalSysTabCache::GlobalSysTabCache(Oid dbOid, bool isShared, GlobalSysDBCacheEntry *dbEntry)
+{
+ Assert((isShared && dbOid == InvalidOid) || (!isShared && dbOid != InvalidOid));
+ m_dbOid = dbOid;
+ m_isShared = isShared;
+ m_dbEntry = dbEntry;
+ m_isInited = false;
+ m_global_systupcaches = NULL;
+ m_systab_locks = NULL;
+ m_tup_count = 0;
+ m_tup_space = 0;
+}
+
+/*
+ * @Description:
+ * Initialization function for current GlobalSysTabCache objects, in lite-mode to reduce
+ * memory consumption we do lazy initialization, here lazy says do init when it gets used
+ *
+ * @param[IN] void
+ *
+ * @return: void
+ */
+void GlobalSysTabCache::Init()
+{
+ Assert(!m_isInited);
+ MemoryContext old = MemoryContextSwitchTo(m_dbEntry->GetRandomMemCxt());
+ m_systab_locks = (pthread_rwlock_t *)palloc0(sizeof(pthread_rwlock_t) * SysCacheSize);
+ m_global_systupcaches = (GlobalSysTupCache **)palloc0(sizeof(GlobalSysTupCache *) * SysCacheSize);
+
+ /*
+ * For lite-mode, we do not create GlobalSysTupCache aggresively to limit memory
+ * consumption as lower as possible
+ */
+#ifndef ENABLE_LITE_MODE
+ for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
+ PthreadRwLockInit(&m_systab_locks[cache_id], NULL);
+ /* we split catcache into shared_db_entry and mydb_entry,
+ * so for different db_entry, just init systupcaches which are necessary */
+ if ((m_isShared && g_instance.global_sysdbcache.HashSearchSharedRelation(cacheinfo[cache_id].reloid)) ||
+ (!m_isShared && !g_instance.global_sysdbcache.HashSearchSharedRelation(cacheinfo[cache_id].reloid))) {
+ m_global_systupcaches[cache_id] = New(m_dbEntry->GetRandomMemCxt()) GlobalSysTupCache(
+ m_dbOid, cache_id, m_isShared, m_dbEntry);
+ m_global_systupcaches[cache_id]->SetStatInfoPtr(&m_tup_count, &m_tup_space);
+ }
+ }
+#endif
+ MemoryContextSwitchTo(old);
+
+ /* Mark initialization stage is done */
+ m_isInited = true;
+}
+
+/*
+ * @Description:
+ * Reset all none-shared catlog table in current, here reset means delete the GloablCTup
+ * from cc_list and cc_bucket and move all systuple dead_list
+ *
+ * @param[IN] void
+ *
+ * @return: void
+ */
+template
+void GlobalSysTabCache::ResetCatCaches()
+{
+ /* global reset dont reset shared cache */
+ for (int i = 0; i < SysCacheSize; i++) {
+ /* shared table is separated from normal db */
+ if (m_global_systupcaches[i] == NULL) {
+ continue;
+ }
+
+ /* handle SysTupCache's cc_list and cc_bucket's CatCTup elements */
+ m_global_systupcaches[i]->ResetCatalogCache();
+ }
+}
+template void GlobalSysTabCache::ResetCatCaches();
+template void GlobalSysTabCache::ResetCatCaches();
+
+void GlobalSysTabCache::RemoveAllTailElements()
+{
+ for (int i = 0; i < SysCacheSize; i++) {
+ // shared table is separated from normal db
+ if (m_global_systupcaches[i] == NULL) {
+ continue;
+ }
+ m_global_systupcaches[i]->RemoveAllTailElements();
+#ifndef ENABLE_LITE_MODE
+ /* memory is under control, so stop swapout */
+ if (g_instance.global_sysdbcache.MemoryUnderControl()) {
+ break;
+ }
+#endif
+ }
+}
+
+/*
+ * @Description:
+ * Find GlobalSysTupCatch(table level) with given cache_id
+ *
+ * @param[IN] cache_id: GSTC's cache id (array index of SysTabCache)
+ *
+ * @return: target GlobalSysTupCache object
+ */
+GlobalSysTupCache *GlobalSysTabCache::CacheIdGetGlobalSysTupCache(int cache_id)
+{
+ Assert(m_isInited);
+ Assert((m_isShared && g_instance.global_sysdbcache.HashSearchSharedRelation(cacheinfo[cache_id].reloid)) ||
+ (!m_isShared && !g_instance.global_sysdbcache.HashSearchSharedRelation(cacheinfo[cache_id].reloid)));
+
+#ifdef ENABLE_LITE_MODE
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, &m_systab_locks[cache_id]);
+ if (unlikely(m_global_systupcaches[cache_id] == NULL)) {
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_systab_locks[cache_id]);
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_systab_locks[cache_id]);
+ if (m_global_systupcaches[cache_id] == NULL) {
+ m_global_systupcaches[cache_id] = New(m_dbEntry->GetRandomMemCxt()) GlobalSysTupCache(
+ m_dbOid, cache_id, m_isShared, m_dbEntry);
+ m_global_systupcaches[cache_id]->SetStatInfoPtr(&m_tup_count, &m_tup_space);
+ }
+ m_global_systupcaches[cache_id]->Init();
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_systab_locks[cache_id]);
+#endif
+
+ if (likely(m_global_systupcaches[cache_id]->Inited())) {
+ return m_global_systupcaches[cache_id];
+ }
+
+ /* do cache initialization if not set up yet */
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_systab_locks[cache_id]);
+ m_global_systupcaches[cache_id]->Init();
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_systab_locks[cache_id]);
+
+ return m_global_systupcaches[cache_id];
+}
+
+/*
+ * @Description:
+ * Find GlobalSysTupCatch(table level) with given cache_id and hash_value and mark
+ * it(them) as dead and move to dead_list
+ *
+ * Invalid: means mark systuple satisfy cache_id and hash_value as "dead"
+ * Reset: means mark all systuples under cache_id as "dead"
+ *
+ * @param[IN] cache_id: GSTC's cache id (array index of SysTabCache), hash_value
+ *
+ * @return: target GlobalSysTupCache object
+ */
+void GlobalSysTabCache::InvalidTuples(int cache_id, uint32 hash_value, bool reset)
+{
+#ifdef ENABLE_LITE_MODE
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, &m_systab_locks[cache_id]);
+ if (unlikely(m_global_systupcaches[cache_id] == NULL)) {
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_systab_locks[cache_id]);
+ return;
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_systab_locks[cache_id]);
+#endif
+
+ /* maybe upgrade from version before v5r2c00, the cacheid is out of order
+ * whatever, we cache nothing except relmap, so just ignore the catcache invalmsg */
+ if (unlikely(!g_instance.global_sysdbcache.recovery_finished) && m_global_systupcaches[cache_id] == NULL) {
+ return;
+ }
+
+ if (!m_global_systupcaches[cache_id]->Inited()) {
+ return;
+ }
+
+ if (reset) {
+ /* for all systuple */
+ m_global_systupcaches[cache_id]->ResetCatalogCache();
+ } else {
+ /* for systuples satisfy hash_value */
+ m_global_systupcaches[cache_id]->HashValueInvalidate(hash_value);
+ }
+}
+
+/*
+ * @Description:
+ * Fetch tuple stats for given relOid from GlobalSysTabCache object (current
+ * database)
+ *
+ * @param[IN] relOid: parsed query tree.
+ *
+ * @return: list of tup stats in "GlobalCatalogTupleStat"
+ */
+List *GlobalSysTabCache::GetCatalogTupleStats(Oid relOid)
+{
+ List *tuple_stat_list = NIL;
+
+ /* Scan each GlobalSysCache object's holding GlobalCTup's statinfo */
+ for (int i = 0; i < SysCacheSize; i++) {
+ /*
+ * Skip GSC object for shared tables, because shared-table's GSC by design is
+ * stored in a special GlobalSysTabCache(DB) and set NULL to its entry
+ */
+ if (m_global_systupcaches[i] == NULL) {
+ continue;
+ }
+
+ /* Skip those not initiliazed */
+ if (!m_global_systupcaches[i]->Inited()) {
+ continue;
+ }
+
+ Assert(cacheinfo[i].reloid == m_global_systupcaches[i]->GetCCRelOid());
+ /* skip undesired rel */
+ if (relOid != ALL_REL_OID && (Oid)relOid != cacheinfo[i].reloid) {
+ continue;
+ }
+
+ /* Fetch current GSC's info */
+ List *tmp = m_global_systupcaches[i]->GetGlobalCatCTupStat();
+ tuple_stat_list = lappend3(tuple_stat_list, tmp);
+
+ pfree_ext(tmp);
+ }
+
+ return tuple_stat_list;
+}
diff --git a/src/common/backend/utils/cache/knl_globalsystupcache.cpp b/src/common/backend/utils/cache/knl_globalsystupcache.cpp
new file mode 100644
index 000000000..094efbf29
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_globalsystupcache.cpp
@@ -0,0 +1,1798 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "utils/knl_globalsystupcache.h"
+#include "postgres.h"
+#include "knl/knl_variable.h"
+
+#include "access/genam.h"
+#include "access/hash.h"
+#include "access/heapam.h"
+#include "access/relscan.h"
+#include "access/sysattr.h"
+#include "access/transam.h"
+#include "access/tuptoaster.h"
+#include "access/valid.h"
+#include "catalog/gs_obsscaninfo.h"
+#include "catalog/gs_policy_label.h"
+#include "catalog/indexing.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_type.h"
+#include "catalog/pg_attribute.h"
+#include "catalog/pg_aggregate.h"
+#include "catalog/pg_amop.h"
+#include "catalog/pg_amproc.h"
+#include "catalog/pg_auth_members.h"
+#include "catalog/pg_authid.h"
+#include "catalog/pg_obsscaninfo.h"
+#include "catalog/pg_cast.h"
+#include "catalog/pg_collation.h"
+#include "catalog/pg_constraint.h"
+#include "catalog/pg_conversion.h"
+#include "catalog/pg_database.h"
+#include "catalog/pg_db_role_setting.h"
+#include "catalog/pg_default_acl.h"
+#include "catalog/pg_depend.h"
+#include "catalog/pg_description.h"
+#include "catalog/pg_directory.h"
+#include "catalog/pg_enum.h"
+#include "catalog/pg_foreign_data_wrapper.h"
+#include "catalog/pg_foreign_server.h"
+#include "catalog/pg_foreign_table.h"
+#include "catalog/pg_job.h"
+#include "catalog/pg_job_proc.h"
+#include "catalog/pg_language.h"
+#include "catalog/pg_namespace.h"
+#include "catalog/pg_object.h"
+#include "catalog/pg_opclass.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_opfamily.h"
+#include "catalog/pg_partition.h"
+#include "catalog/pg_partition_fn.h"
+#include "catalog/pg_hashbucket.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_proc_fn.h"
+#include "catalog/pg_range.h"
+#include "catalog/pg_rewrite.h"
+#include "catalog/pg_seclabel.h"
+#include "catalog/pg_shseclabel.h"
+#include "catalog/pg_shdescription.h"
+#include "catalog/pg_shdepend.h"
+#include "catalog/pg_statistic.h"
+#include "catalog/pg_statistic_ext.h"
+#include "catalog/pg_synonym.h"
+#include "catalog/pg_tablespace.h"
+#include "catalog/pg_ts_config.h"
+#include "catalog/pg_ts_config_map.h"
+#include "catalog/pg_ts_dict.h"
+#include "catalog/pg_ts_parser.h"
+#include "catalog/pg_ts_template.h"
+#include "catalog/pg_type.h"
+#include "catalog/pg_user_mapping.h"
+#include "catalog/pg_user_status.h"
+#include "catalog/pg_extension_data_source.h"
+#include "catalog/pg_streaming_stream.h"
+#include "catalog/pg_streaming_cont_query.h"
+#include "catalog/heap.h"
+#include "executor/executor.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "parser/parse_relation.h"
+#include "parser/parse_type.h"
+#include "pgstat.h"
+#ifdef ENABLE_MULTIPLE_NODES
+#include "catalog/pgxc_class.h"
+#include "catalog/pgxc_node.h"
+#include "catalog/pgxc_group.h"
+#include "catalog/pg_resource_pool.h"
+#include "catalog/pg_workload_group.h"
+#include "catalog/pg_app_workloadgroup_mapping.h"
+#endif
+#ifdef CatCache_STATS
+#include "storage/ipc.h" /* for on_proc_exit */
+#endif
+#include "storage/lmgr.h"
+#include "storage/sinvaladt.h"
+#include "utils/acl.h"
+#include "utils/atomic.h"
+#include "utils/datum.h"
+#include "utils/builtins.h"
+#include "utils/elog.h"
+#include "utils/extended_statistics.h"
+#include "utils/fmgroids.h"
+#include "utils/fmgrtab.h"
+#include "utils/hashutils.h"
+#include "utils/inval.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "utils/rel_gs.h"
+#include "utils/relcache.h"
+#include "utils/resowner.h"
+#include "utils/syscache.h"
+#include "utils/snapmgr.h"
+#include "utils/knl_relcache.h"
+#include "utils/knl_catcache.h"
+#include "utils/knl_globaltabdefcache.h"
+#include "utils/sec_rls_utils.h"
+
+void GlobalCatCTup::Release()
+{
+ /* Decrement the reference count of a GlobalCatCache tuple */
+ Assert(ct_magic == CT_MAGIC);
+ Assert(refcount > 0);
+ my_cache->ReleaseGlobalCatCTup(this);
+}
+
+void GlobalCatCList::Release()
+{
+ /* Safety checks to ensure we were handed a cache entry */
+ Assert(cl_magic == CL_MAGIC);
+ Assert(refcount > 0);
+ my_cache->ReleaseGlobalCatCList(this);
+}
+
+void GlobalSysTupCache::ReleaseGlobalCatCTup(GlobalCatCTup *ct)
+{
+ if (unlikely(!ct->canInsertGSC)) {
+ pfree(ct);
+ return;
+ }
+ (void)pg_atomic_fetch_sub_u64(&ct->refcount, 1);
+}
+
+void GlobalSysTupCache::ReleaseGlobalCatCList(GlobalCatCList *cl)
+{
+ if (unlikely(!cl->canInsertGSC)) {
+ FreeGlobalCatCList(cl);
+ return;
+ }
+ (void)pg_atomic_fetch_sub_u64(&cl->refcount, 1);
+}
+
+static uint64 GetClEstimateSize(GlobalCatCList *cl)
+{
+ uint64 cl_size = offsetof(GlobalCatCList, members) +
+ (cl->n_members + 1) * sizeof(GlobalCatCTup *) +
+ cl->nkeys * (NAMEDATALEN + CHUNK_ALGIN_PAD) + /* estimate space of keys */
+ CHUNK_ALGIN_PAD;
+ return cl_size;
+}
+
+static uint64 GetCtEstimateSize(GlobalCatCTup *ct)
+{
+ uint64 ct_size = sizeof(GlobalCatCTup) + MAXIMUM_ALIGNOF + ct->tuple.t_len + CHUNK_ALGIN_PAD;
+ return ct_size;
+}
+
+void GlobalSysTupCache::AddHeadToCCList(GlobalCatCList *cl)
+{
+ uint64 cl_size = GetClEstimateSize(cl);
+ /* record space of list */
+ m_dbEntry->MemoryEstimateAdd(cl_size);
+ pg_atomic_fetch_add_u64(m_tup_space, cl_size);
+ DLAddHead(&cc_lists, &cl->cache_elem);
+}
+void GlobalSysTupCache::RemoveElemFromCCList(GlobalCatCList *cl)
+{
+ uint64 cl_size = GetClEstimateSize(cl);
+ m_dbEntry->MemoryEstimateSub(cl_size);
+ pg_atomic_fetch_sub_u64(m_tup_space, cl_size);
+ DLRemove(&cl->cache_elem);
+}
+
+void GlobalSysTupCache::AddHeadToBucket(Index hash_index, GlobalCatCTup *ct)
+{
+ uint64 ct_size = GetCtEstimateSize(ct);
+ pg_atomic_fetch_add_u64(m_tup_space, ct_size);
+ /* record space of tup */
+ m_dbEntry->MemoryEstimateAdd(ct_size);
+ pg_atomic_fetch_add_u64(m_tup_count, 1);
+ DLAddHead(&cc_buckets[hash_index], &ct->cache_elem);
+}
+
+void GlobalSysTupCache::RemoveElemFromBucket(GlobalCatCTup *ct)
+{
+ uint64 ct_size = GetCtEstimateSize(ct);
+ pg_atomic_fetch_sub_u64(m_tup_space, ct_size);
+ /* free space of tup */
+ m_dbEntry->MemoryEstimateSub(ct_size);
+ pg_atomic_fetch_sub_u64(m_tup_count, 1);
+ DLRemove(&ct->cache_elem);
+}
+
+void GlobalSysTupCache::HandleDeadGlobalCatCTup(GlobalCatCTup *ct)
+{
+ /* this func run in wr lock, so dont call free directly */
+ RemoveElemFromBucket(ct);
+ ct->dead = true;
+ if (ct->refcount == 0) {
+ m_dead_cts.AddHead(&ct->cache_elem);
+ } else {
+ m_dead_cts.AddTail(&ct->cache_elem);
+ }
+}
+
+void GlobalSysTupCache::FreeDeadCts()
+{
+ while (m_dead_cts.GetLength() > 0) {
+ Dlelem *elt = m_dead_cts.RemoveHead();
+ if (elt == NULL) {
+ break;
+ }
+ GlobalCatCTup *ct = (GlobalCatCTup *)DLE_VAL(elt);
+ if (ct->refcount != 0) {
+ /* we move the active entry to tail of list and let next call free it */
+ m_dead_cts.AddTail(&ct->cache_elem);
+ break;
+ } else {
+ pfree(ct);
+ }
+ }
+}
+
+void GlobalSysTupCache::RemoveTailTupleElements(Index hash_index)
+{
+ /* only one thread can do swapout for the bucket */
+ ResourceOwnerEnlargeGlobalIsExclusive(LOCAL_SYSDB_RESOWNER);
+ if (!atomic_compare_exchange_u32(&m_is_tup_swappingouts[hash_index], 0, 1)) {
+ return;
+ }
+ ResourceOwnerRememberGlobalIsExclusive(LOCAL_SYSDB_RESOWNER, &m_is_tup_swappingouts[hash_index]);
+
+ bool listBelowThreshold = GetBucket(hash_index)->dll_len < MAX_GSC_LIST_LENGTH;
+
+ uint64 swapout_count_once = 0;
+ /* we are the only one to do swapout, so acquire wrlock is ok */
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_bucket_rw_locks[hash_index]);
+
+ uint64 max_swapout_count_once = GetSwapOutNum(listBelowThreshold, GetBucket(hash_index)->dll_len);
+ for (Dlelem *elt = DLGetTail(GetBucket(hash_index)); elt != NULL;) {
+ GlobalCatCTup *ct = (GlobalCatCTup *)DLE_VAL(elt);
+ elt = DLGetPred(elt);
+ if (ct->refcount != 0) {
+ /* we dont know how many ct are unused, maybe no one, so break to avoid meaningless work
+ * whatever, another thread does swappout again */
+ DLMoveToFront(&ct->cache_elem);
+ break;
+ }
+ HandleDeadGlobalCatCTup(ct);
+ swapout_count_once++;
+
+ /* swapout elements as many as possible */
+ if (swapout_count_once == max_swapout_count_once) {
+ break;
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_bucket_rw_locks[hash_index]);
+
+ Assert(m_is_tup_swappingouts[hash_index] == 1);
+ atomic_compare_exchange_u32(&m_is_tup_swappingouts[hash_index], 1, 0);
+ ResourceOwnerForgetGlobalIsExclusive(LOCAL_SYSDB_RESOWNER, &m_is_tup_swappingouts[hash_index]);
+}
+
+void GlobalSysTupCache::FreeGlobalCatCList(GlobalCatCList *cl)
+{
+ Assert(cl->refcount == 0 || !cl->canInsertGSC);
+ for (int i = 0; i < cl->n_members; i++) {
+ cl->members[i]->Release();
+ }
+ CatCacheFreeKeys(m_relinfo.cc_tupdesc, cl->nkeys, m_relinfo.cc_keyno, cl->keys);
+ pfree(cl);
+}
+
+void GlobalSysTupCache::HandleDeadGlobalCatCList(GlobalCatCList *cl)
+{
+ /* this func run in wr lock, so dont call free directly */
+ RemoveElemFromCCList(cl);
+ if (cl->refcount == 0) {
+ m_dead_cls.AddHead(&cl->cache_elem);
+ } else {
+ m_dead_cls.AddTail(&cl->cache_elem);
+ }
+}
+
+void GlobalSysTupCache::FreeDeadCls()
+{
+ while (m_dead_cls.GetLength() > 0) {
+ Dlelem *elt = m_dead_cls.RemoveHead();
+ if (elt == NULL) {
+ break;
+ }
+ GlobalCatCList *cl = (GlobalCatCList *)DLE_VAL(elt);
+ if (cl->refcount != 0) {
+ /* we move the active entry to tail of list and let next call free it */
+ m_dead_cls.AddTail(&cl->cache_elem);
+ break;
+ } else {
+ FreeGlobalCatCList(cl);
+ }
+ }
+ FreeDeadCts();
+}
+
+void GlobalSysTupCache::RemoveTailListElements()
+{
+ /* only one thread can do swapout for the bucket */
+ ResourceOwnerEnlargeGlobalIsExclusive(LOCAL_SYSDB_RESOWNER);
+ if (!atomic_compare_exchange_u32(&m_is_list_swappingout, 0, 1)) {
+ return;
+ }
+ ResourceOwnerRememberGlobalIsExclusive(LOCAL_SYSDB_RESOWNER, &m_is_list_swappingout);
+
+ /* cllist search is slow, so limit cc_lists's length */
+ bool listBelowThreshold = cc_lists.dll_len < MAX_GSC_LIST_LENGTH;
+
+ uint64 swapout_count = 0;
+ /* the code here is exclusive by set m_cclist_in_swapping 1, so acquire wrlock is ok */
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+ uint64 max_swapout_count_once = GetSwapOutNum(listBelowThreshold, cc_lists.dll_len);
+
+ for (Dlelem *elt = DLGetTail(&cc_lists); elt != NULL;) {
+ GlobalCatCList *cl = (GlobalCatCList *)DLE_VAL(elt);
+ elt = DLGetPred(elt);
+ if (cl->refcount != 0) {
+ DLMoveToFront(&cl->cache_elem);
+ /* we dont know how many cl are unused, maybe no one, so break to avoid meaningless work
+ * whatever, another thread does swappout again */
+ break;
+ }
+ HandleDeadGlobalCatCList(cl);
+ swapout_count++;
+
+ if (swapout_count > max_swapout_count_once) {
+ break;
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+
+ Assert(m_is_list_swappingout == 1);
+ atomic_compare_exchange_u32(&m_is_list_swappingout, 1, 0);
+ ResourceOwnerForgetGlobalIsExclusive(LOCAL_SYSDB_RESOWNER, &m_is_list_swappingout);
+}
+
+void GlobalSysTupCache::RemoveAllTailElements()
+{
+ if (!m_isInited) {
+ return;
+ }
+ RemoveTailListElements();
+#ifndef ENABLE_LITE_MODE
+ /* memory is under control, so stop swapout */
+ if (g_instance.global_sysdbcache.MemoryUnderControl()) {
+ return;
+ }
+#endif
+ for (int hash_index = 0; hash_index < cc_nbuckets; hash_index++) {
+ RemoveTailTupleElements(hash_index);
+#ifndef ENABLE_LITE_MODE
+ /* memory is under control, so stop swapout */
+ if (g_instance.global_sysdbcache.MemoryUnderControl()) {
+ break;
+ }
+#endif
+ }
+}
+
+GlobalSysTupCache::GlobalSysTupCache(Oid dbOid, int cache_id, bool isShared, GlobalSysDBCacheEntry *entry)
+{
+ m_isInited = false;
+
+ /* global systup share cxt group with global systab */
+ m_searches = &entry->m_dbstat->tup_searches;
+ m_hits = &entry->m_dbstat->tup_hits;
+ m_newloads = &entry->m_dbstat->tup_newloads;
+ m_dbEntry = entry;
+ m_dbOid = dbOid;
+ m_cache_id = cache_id;
+ m_bucket_rw_locks = NULL;
+ m_list_rw_lock = NULL;
+ m_concurrent_lock = NULL;
+ cc_id = -1;
+ cc_nbuckets = -1;
+ m_relinfo.cc_tupdesc = NULL;
+ m_relinfo.cc_relname = NULL;
+ m_relinfo.cc_tupdesc = NULL;
+ m_relinfo.cc_reloid = -1;
+ m_relinfo.cc_indexoid = -1;
+ m_relinfo.cc_nkeys = -1;
+ m_relinfo.cc_relisshared = isShared;
+ Assert((isShared && m_dbOid == InvalidOid) || (!isShared && m_dbOid != InvalidOid));
+
+ for (int i = 0; i < CATCACHE_MAXKEYS; i++) {
+ m_relinfo.cc_keyno[i] = -1;
+ errno_t rc = memset_s(&cc_skey[i], sizeof(ScanKeyData), 0, sizeof(ScanKeyData));
+ securec_check(rc, "", "");
+ m_relinfo.cc_hashfunc[i] = NULL;
+ m_relinfo.cc_fastequal[i] = NULL;
+ }
+ cc_buckets = NULL;
+ m_is_tup_swappingouts = NULL;
+ m_is_list_swappingout = 0;
+ enable_rls = false;
+}
+
+void GlobalSysTupCache::SetStatInfoPtr(volatile uint64 *tup_count, volatile uint64 *tup_space)
+{
+ m_tup_count = tup_count;
+ m_tup_space = tup_space;
+}
+
+/*cat tuple***********************************************************************************************************/
+/* SEARCH_TUPLE_SKIP used by searchtupleinternal */
+GlobalCatCTup *GlobalSysTupCache::FindSearchKeyTupleFromCache(InsertCatTupInfo *tup_info, int *location)
+{
+ uint32 hash_value = tup_info->hash_value;
+ Index hash_index = tup_info->hash_index;
+ Datum *arguments = tup_info->arguments;
+ int index = 0;
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ index++;
+ GlobalCatCTup *ct = (GlobalCatCTup *)DLE_VAL(elt);
+ if (ct->hash_value != hash_value) {
+ continue;
+ }
+ if (!CatalogCacheCompareTuple(m_relinfo.cc_fastequal, m_relinfo.cc_nkeys, ct->keys, arguments)) {
+ continue;
+ }
+ if (unlikely(u_sess->attr.attr_common.IsInplaceUpgrade) && ct->tuple.t_self.ip_posid == 0) {
+ Assert(ct->tuple.t_tableOid == InvalidOid);
+ continue;
+ }
+ pg_atomic_fetch_add_u64(&ct->refcount, 1);
+ *location = index;
+ return ct;
+ }
+ return NULL;
+}
+
+/* SCAN_TUPLE_SKIP used by searchtupleinternal */
+GlobalCatCTup *GlobalSysTupCache::FindScanKeyTupleFromCache(InsertCatTupInfo *tup_info)
+{
+ uint32 hash_value = tup_info->hash_value;
+ Index hash_index = tup_info->hash_index;
+ Datum *arguments = tup_info->arguments;
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ GlobalCatCTup *ct = (GlobalCatCTup *)DLE_VAL(elt);
+ if (ct->hash_value != hash_value) {
+ continue;
+ }
+ if (!CatalogCacheCompareTuple(m_relinfo.cc_fastequal, m_relinfo.cc_nkeys, ct->keys, arguments)) {
+ continue;
+ }
+ if (unlikely(u_sess->attr.attr_common.IsInplaceUpgrade) && ct->tuple.t_self.ip_posid == 0) {
+ Assert(ct->tuple.t_tableOid == InvalidOid);
+ continue;
+ }
+ pg_atomic_fetch_add_u64(&ct->refcount, 1);
+ return ct;
+ }
+ return NULL;
+}
+
+/* PROC_LIST_SKIP used by SearchBuiltinProcCacheList */
+GlobalCatCTup *GlobalSysTupCache::FindHashTupleFromCache(InsertCatTupInfo *tup_info)
+{
+ uint32 hash_value = tup_info->hash_value;
+ Index hash_index = tup_info->hash_index;
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ GlobalCatCTup *ct = (GlobalCatCTup *)DLE_VAL(elt);
+ if (ct->hash_value != hash_value) {
+ continue; /* quickly skip entry if wrong hash val */
+ }
+ pg_atomic_fetch_add_u64(&ct->refcount, 1);
+ return ct;
+ }
+ return NULL;
+}
+
+/* PGATTR_LIST_SKIP used by SearchPgAttributeCacheList */
+GlobalCatCTup *GlobalSysTupCache::FindPgAttrTupleFromCache(InsertCatTupInfo *tup_info)
+{
+ Index hash_index = tup_info->hash_index;
+ int16 attnum = tup_info->attnum;
+ CatalogRelationBuildParam *catalogDesc = tup_info->catalogDesc;
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ GlobalCatCTup *ct = (GlobalCatCTup *)DLE_VAL(elt);
+ bool attnumIsNull = false;
+ int curAttnum = DatumGetInt16(SysCacheGetAttr(cc_id, &ct->tuple, Anum_pg_attribute_attnum, &attnumIsNull));
+ /* quickly skip entry if wrong tuple */
+ if ((attnum < catalogDesc->natts && curAttnum != attnum) ||
+ (attnum >= catalogDesc->natts && curAttnum != -(attnum - catalogDesc->natts + 1))) {
+ continue;
+ }
+ pg_atomic_fetch_add_u64(&ct->refcount, 1);
+ return ct;
+ }
+ return NULL;
+}
+
+/* SCAN_LIST_SKIP used by searchlistinternal when scan */
+GlobalCatCTup *GlobalSysTupCache::FindSameTupleFromCache(InsertCatTupInfo *tup_info)
+{
+ uint32 hash_value = tup_info->hash_value;
+ Index hash_index = tup_info->hash_index;
+ HeapTuple ntp = tup_info->ntp;
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ GlobalCatCTup *ct = (GlobalCatCTup *)DLE_VAL(elt);
+ if (ct->hash_value != hash_value) {
+ continue; /* ignore dead entries */
+ }
+ if (IsProcCache(m_relinfo.cc_reloid) && IsSystemObjOid(HeapTupleGetOid(&(ct->tuple))) &&
+ likely(u_sess->attr.attr_common.IsInplaceUpgrade == false)) {
+ continue;
+ }
+ if (IsAttributeCache(m_relinfo.cc_reloid)) {
+ bool attIsNull = false;
+ Oid attrelid =
+ DatumGetObjectId(SysCacheGetAttr(cc_id, &(ct->tuple), Anum_pg_attribute_attrelid, &attIsNull));
+ if (IsSystemObjOid(attrelid) && IsValidCatalogParam(GetCatalogParam(attrelid))) {
+ continue;
+ }
+ }
+
+ if (!ItemPointerEqualsNoCheck(&(ct->tuple.t_self), &(ntp->t_self))) {
+ continue; /* not same tuple */
+ }
+ pg_atomic_fetch_add_u64(&ct->refcount, 1);
+ return ct;
+ }
+ return NULL;
+}
+
+/**
+ * insert a new tuple into globalcatcache, if there is already one, do nothing
+ */
+GlobalCatCTup *GlobalSysTupCache::InsertHeapTupleIntoGlobalCatCache(InsertCatTupInfo *tup_info)
+{
+ /* palloc before write lock */
+ /* Allocate memory for GlobalCatCTup and the cached tuple in one go */
+ MemoryContext oldcxt = MemoryContextSwitchTo(m_dbEntry->GetRandomMemCxt());
+ GlobalCatCTup *new_ct = (GlobalCatCTup *)palloc(sizeof(GlobalCatCTup) + MAXIMUM_ALIGNOF + tup_info->ntp->t_len);
+ MemoryContextSwitchTo(oldcxt);
+ new_ct->ct_magic = CT_MAGIC;
+ /* releases and free by my_cache when palloc fail */
+ new_ct->my_cache = this;
+ new_ct->dead = false;
+ new_ct->hash_value = tup_info->hash_value;
+ DLInitElem(&new_ct->cache_elem, (void *)new_ct);
+ CopyTupleIntoGlobalCatCTup(new_ct, tup_info->ntp);
+ /* not find, now we insert the tuple into cache and unlock lock */
+ new_ct->refcount = 1;
+ new_ct->canInsertGSC = true;
+
+ /* insert bucket, only w bucket_lock, we has r m_concurrent_lock already */
+ pthread_rwlock_t *bucket_lock = &m_bucket_rw_locks[tup_info->hash_index];
+ /* find again, in case insert op when we create tuple */
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ GlobalCatCTup *ct = FindTupleFromCache(tup_info);
+ if (unlikely(ct != NULL)) {
+ /* other thread has inserted one */
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ pfree_ext(new_ct);
+ return ct;
+ }
+
+ AddHeadToBucket(tup_info->hash_index, new_ct);
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ return new_ct;
+}
+
+static inline MemoryContext GetLSCMemcxt(int cache_id)
+{
+ /* use lsc's memcxt to palloc, and insert the element into lsc's hashtable */
+ return t_thrd.lsc_cxt.lsc->systabcache.GetLocalTupCacheMemoryCxt(cache_id);
+}
+/**
+ * insert committed tuple into globalcatcache, uncommitted tuple into localcatcache
+ */
+GlobalCatCTup *GlobalSysTupCache::InsertHeapTupleIntoLocalCatCache(InsertCatTupInfo *tup_info)
+{
+ /* Allocate memory for GlobalCatCTup and the cached tuple in one struct */
+ MemoryContext oldcxt =
+ MemoryContextSwitchTo(GetLSCMemcxt(m_cache_id));
+ GlobalCatCTup *new_ct = (GlobalCatCTup *)palloc(sizeof(GlobalCatCTup) + MAXIMUM_ALIGNOF + tup_info->ntp->t_len);
+ MemoryContextSwitchTo(oldcxt);
+ new_ct->ct_magic = CT_MAGIC;
+ /* releases and free by my_cache when palloc fail */
+ new_ct->my_cache = this;
+ new_ct->dead = false;
+ new_ct->hash_value = tup_info->hash_value;
+ DLInitElem(&new_ct->cache_elem, (void *)new_ct);
+ CopyTupleIntoGlobalCatCTup(new_ct, tup_info->ntp);
+ new_ct->refcount = 1;
+ new_ct->canInsertGSC = false;
+ return new_ct;
+}
+/**
+ * insert tuple into globalcatcache memory, others into localcatcache memory
+ */
+GlobalCatCTup *GlobalSysTupCache::InsertHeapTupleIntoCatCacheInSingle(InsertCatTupInfo *tup_info)
+{
+ HeapTuple ntp = tup_info->ntp;
+ if (HeapTupleHasExternal(ntp)) {
+ tup_info->ntp = toast_flatten_tuple(ntp, m_relinfo.cc_tupdesc);
+ Assert(tup_info->hash_value ==
+ CatalogCacheComputeTupleHashValue(cc_id, m_relinfo.cc_keyno, m_relinfo.cc_tupdesc, m_relinfo.cc_hashfunc,
+ m_relinfo.cc_reloid, m_relinfo.cc_nkeys, tup_info->ntp));
+ }
+ GlobalCatCTup *ct;
+ if (tup_info->canInsertGSC) {
+ /* the tuple must meet condition that xmin is committed and xmax == 0 */
+ ct = InsertHeapTupleIntoGlobalCatCache(tup_info);
+ } else {
+ /* xmin uncommitted or xmax != 0, we dont care whether xmax is committed, just store it in localcatcache */
+ ct = InsertHeapTupleIntoLocalCatCache(tup_info);
+ }
+ if (tup_info->ntp != ntp) {
+ heap_freetuple_ext(tup_info->ntp);
+ tup_info->ntp = ntp;
+ }
+ return ct;
+}
+
+/**
+ * insert tuple into globalcatcache memory, others into localcatcache memory
+ * should call only by searchsyscachelist
+ * we do this check because when accept inval msg, we clear cc_list, even they are valid
+ */
+GlobalCatCTup *GlobalSysTupCache::InsertHeapTupleIntoCatCacheInList(InsertCatTupInfo *tup_info)
+{
+ HeapTuple ntp = tup_info->ntp;
+ if (HeapTupleHasExternal(ntp)) {
+ tup_info->ntp = toast_flatten_tuple(ntp, m_relinfo.cc_tupdesc);
+ Assert(tup_info->hash_value ==
+ CatalogCacheComputeTupleHashValue(cc_id, m_relinfo.cc_keyno, m_relinfo.cc_tupdesc, m_relinfo.cc_hashfunc,
+ m_relinfo.cc_reloid, m_relinfo.cc_nkeys, tup_info->ntp));
+ }
+ GlobalCatCTup *ct = NULL;
+ if (tup_info->canInsertGSC) {
+ /* insert bucket, only rd bucket_lock, built in func never be changed */
+ pthread_rwlock_t *bucket_lock = &m_bucket_rw_locks[tup_info->hash_index];
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ ct = FindTupleFromCache(tup_info);
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ if (unlikely(ct == NULL)) {
+ /* the tuple must meet condition that xmin is committed and xmax == 0 */
+ ct = InsertHeapTupleIntoGlobalCatCache(tup_info);
+ }
+ } else {
+ /* the tuple must meet condition that xmin is committed and xmax == 0 */
+ ct = InsertHeapTupleIntoLocalCatCache(tup_info);
+ }
+
+ if (tup_info->ntp != ntp) {
+ heap_freetuple_ext(tup_info->ntp);
+ tup_info->ntp = ntp;
+ }
+ return ct;
+}
+
+GlobalCatCTup *GlobalSysTupCache::SearchMissFromProcAndAttribute(InsertCatTupInfo *tup_info)
+{
+ /* for now, tup_info->type is SCAN_TUPLE_SKIP. it's ok */
+ Datum *arguments = tup_info->arguments;
+ /* For search a function, we firstly try to search it in built-in function list */
+ if (IsProcCache(m_relinfo.cc_reloid) && likely(u_sess->attr.attr_common.IsInplaceUpgrade == false)) {
+ CACHE2_elog(DEBUG2, "SearchGlobalCatCacheMiss(%d): function not found in pg_proc", cc_id);
+ HeapTuple ntp = SearchBuiltinProcCacheMiss(cc_id, m_relinfo.cc_nkeys, arguments);
+ if (HeapTupleIsValid(ntp)) {
+ CACHE2_elog(DEBUG2, "SearchGlobalCatCacheMiss(%d): match a built-in function", cc_id);
+ tup_info->ntp = ntp;
+ /* hard code, never change */
+ Assert(ntp->t_tableOid == InvalidOid);
+ tup_info->canInsertGSC = true;
+ GlobalCatCTup *ct = InsertHeapTupleIntoCatCacheInSingle(tup_info);
+ heap_freetuple(ntp);
+ return ct;
+ }
+ }
+
+ /* Insert hardcoded system catalogs' attributes into pg_attribute's syscache. */
+ if (IsAttributeCache(m_relinfo.cc_reloid) && IsSystemObjOid(DatumGetObjectId(arguments[0]))) {
+ CACHE2_elog(DEBUG2, "SearchGlobalCatCacheMiss: cat tuple not in cat cache %d", cc_id);
+ HeapTuple ntp = SearchPgAttributeCacheMiss(cc_id, m_relinfo.cc_tupdesc, m_relinfo.cc_nkeys, arguments);
+ if (HeapTupleIsValid(ntp)) {
+ tup_info->ntp = ntp;
+ /* hard code, never change */
+ tup_info->canInsertGSC = true;
+ GlobalCatCTup *ct = InsertHeapTupleIntoCatCacheInSingle(tup_info);
+ heap_freetuple(ntp);
+ return ct;
+ }
+ }
+ return NULL;
+}
+
+void AcquireGSCTableReadLock(bool *has_concurrent_lock, pthread_rwlock_t *concurrent_lock)
+{
+ int cur_index = t_thrd.lsc_cxt.lsc->rdlock_info.count;
+ if (unlikely(cur_index == MAX_GSC_READLOCK_COUNT) ||
+ PthreadRWlockTryRdlock(LOCAL_SYSDB_RESOWNER, concurrent_lock) != 0) {
+ *has_concurrent_lock = false;
+ return;
+ }
+ *has_concurrent_lock = true;
+ t_thrd.lsc_cxt.lsc->rdlock_info.concurrent_lock[cur_index] = concurrent_lock;
+ t_thrd.lsc_cxt.lsc->rdlock_info.has_concurrent_lock[cur_index] = has_concurrent_lock;
+ t_thrd.lsc_cxt.lsc->rdlock_info.count++;
+}
+void ReleaseGSCTableReadLock(bool *has_concurrent_lock, pthread_rwlock_t *concurrent_lock)
+{
+ Assert(*has_concurrent_lock);
+ *has_concurrent_lock = false;
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, concurrent_lock);
+ Assert(t_thrd.lsc_cxt.lsc->rdlock_info.concurrent_lock[t_thrd.lsc_cxt.lsc->rdlock_info.count - 1] ==
+ concurrent_lock);
+ Assert(t_thrd.lsc_cxt.lsc->rdlock_info.has_concurrent_lock[t_thrd.lsc_cxt.lsc->rdlock_info.count - 1] ==
+ has_concurrent_lock);
+ t_thrd.lsc_cxt.lsc->rdlock_info.count--;
+}
+
+GlobalCatCTup *GlobalSysTupCache::SearchTupleFromFile(uint32 hash_value, Datum *arguments, bool is_exclusive)
+{
+ InsertCatTupInfo tup_info;
+ tup_info.find_type = SCAN_TUPLE_SKIP;
+ tup_info.arguments = arguments;
+ tup_info.hash_value = hash_value;
+ tup_info.hash_index = HASH_INDEX(hash_value, (uint32)cc_nbuckets);
+ /* for cache read, make sure no one can clear syscache before we insert the result */
+ tup_info.has_concurrent_lock = !is_exclusive;
+ tup_info.is_exclusive = is_exclusive;
+ Assert(is_exclusive);
+ GlobalCatCTup *ct = SearchTupleMiss(&tup_info);
+ if (ct != NULL) {
+ pg_atomic_fetch_add_u64(m_newloads, 1);
+ }
+ return ct;
+}
+
+GlobalCatCTup *GlobalSysTupCache::SearchTupleMiss(InsertCatTupInfo *tup_info)
+{
+ GlobalCatCTup *ct = SearchMissFromProcAndAttribute(tup_info);
+ if (ct != NULL) {
+ return ct;
+ }
+
+ Relation relation = heap_open(m_relinfo.cc_reloid, AccessShareLock);
+ ereport(DEBUG1, (errmsg("cache->cc_reloid - %d", m_relinfo.cc_reloid)));
+ /*
+ * Ok, need to make a lookup in the relation, copy the scankey and fill
+ * out any per-call fields.
+ */
+ ScanKeyData cur_skey[CATCACHE_MAXKEYS];
+ errno_t rc = memcpy_s(cur_skey, sizeof(ScanKeyData) * CATCACHE_MAXKEYS, cc_skey,
+ sizeof(ScanKeyData) * m_relinfo.cc_nkeys);
+ securec_check(rc, "", "");
+ Datum *arguments = tup_info->arguments;
+ cur_skey[0].sk_argument = arguments[0];
+ cur_skey[1].sk_argument = arguments[1];
+ cur_skey[2].sk_argument = arguments[2];
+ cur_skey[3].sk_argument = arguments[3];
+ SysScanDesc scandesc =
+ systable_beginscan(relation, m_relinfo.cc_indexoid, IndexScanOK(cc_id), NULL,
+ m_relinfo.cc_nkeys, cur_skey);
+
+ if (tup_info->has_concurrent_lock) {
+ AcquireGSCTableReadLock(&tup_info->has_concurrent_lock, m_concurrent_lock);
+ }
+ HeapTuple ntp;
+ while (HeapTupleIsValid(ntp = systable_getnext(scandesc))) {
+ tup_info->ntp = ntp;
+ if (!tup_info->has_concurrent_lock) {
+ tup_info->canInsertGSC = false;
+ } else {
+ tup_info->canInsertGSC = CanTupleInertGSC(ntp);
+ if (!tup_info->canInsertGSC) {
+ /* unlock concurrent immediately, any one can invalid cache now */
+ ReleaseGSCTableReadLock(&tup_info->has_concurrent_lock, m_concurrent_lock);
+ }
+ }
+ ct = InsertHeapTupleIntoCatCacheInSingle(tup_info);
+ break; /* assume only one match */
+ }
+ /* unlock finally */
+ if (tup_info->has_concurrent_lock) {
+ ReleaseGSCTableReadLock(&tup_info->has_concurrent_lock, m_concurrent_lock);
+ }
+ systable_endscan(scandesc);
+ heap_close(relation, AccessShareLock);
+
+ /*
+ * global catcache match disk , not need negative tuple
+ */
+ return ct;
+}
+/*
+ * SearchTupleInternal
+ *
+ * This call searches a system cache for a tuple, opening the relation
+ * if necessary (on the first access to a particular cache).
+ *
+ * The result is NULL if not found, or a pointer to a HeapTuple in
+ * the cache. The caller must not modify the tuple, and must call
+ * Release() when done with it.
+ *
+ * The search key values should be expressed as Datums of the key columns'
+ * datatype(s). (Pass zeroes for any unused parameters.) As a special
+ * exception, the passed-in key for a NAME column can be just a C string;
+ * the caller need not go to the trouble of converting it to a fully
+ * null-padded NAME.
+ */
+/*
+ * Work-horse for SearchGlobalCatCache/SearchGlobalCatCacheN.
+ */
+
+GlobalCatCTup *GlobalSysTupCache::SearchTupleInternal(uint32 hash_value, Datum *arguments)
+{
+ FreeDeadCts();
+ pg_atomic_fetch_add_u64(m_searches, 1);
+ /*
+ * scan the hash bucket until we find a match or exhaust our tuples
+ */
+ Index hash_index = HASH_INDEX(hash_value, (uint32)cc_nbuckets);
+ pthread_rwlock_t *bucket_lock = &m_bucket_rw_locks[hash_index];
+ InsertCatTupInfo tup_info;
+ tup_info.find_type = SEARCH_TUPLE_SKIP;
+ tup_info.arguments = arguments;
+ tup_info.hash_value = hash_value;
+ tup_info.hash_index = hash_index;
+ int location = INVALID_LOCATION;
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ GlobalCatCTup *ct = FindSearchKeyTupleFromCache(&tup_info, &location);
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+
+ if (ct != NULL) {
+ pg_atomic_fetch_add_u64(m_hits, 1);
+ TopnLruMoveToFront(&ct->cache_elem, GetBucket(hash_index), bucket_lock, location);
+ return ct;
+ }
+
+ /* not match */
+ tup_info.find_type = SCAN_TUPLE_SKIP;
+ bool canInsertGSC = !g_instance.global_sysdbcache.StopInsertGSC();
+ if (unlikely(GetBucket(hash_index)->dll_len >= MAX_GSC_LIST_LENGTH)) {
+ RemoveTailTupleElements(hash_index);
+ /* maybe no element can be swappedout */
+ canInsertGSC = canInsertGSC && GetBucket(hash_index)->dll_len < MAX_GSC_LIST_LENGTH;
+ }
+ tup_info.is_exclusive = !canInsertGSC;
+ tup_info.has_concurrent_lock = canInsertGSC;
+
+ ct = SearchTupleMiss(&tup_info);
+ if (ct != NULL) {
+ pg_atomic_fetch_add_u64(m_newloads, 1);
+ }
+ return ct;
+}
+
+GlobalCatCList *GlobalSysTupCache::FindListInternal(uint32 hash_value, int nkeys, Datum *arguments, int *location)
+{
+ int index = 0;
+ for (Dlelem *elt = DLGetHead(&cc_lists); elt; elt = DLGetSucc(elt)) {
+ if (index > MAX_GSC_LIST_LENGTH) {
+ /* cc_lists is too long, the tail elements should be swapout */
+ break;
+ }
+ index++;
+ GlobalCatCList *cl = (GlobalCatCList *)DLE_VAL(elt);
+ if (likely(cl->hash_value != hash_value)) {
+ continue; /* quickly skip entry if wrong hash val */
+ }
+ if (cl->nkeys != nkeys) {
+ continue;
+ }
+ if (!CatalogCacheCompareTuple(m_relinfo.cc_fastequal, nkeys, cl->keys, arguments)) {
+ continue;
+ }
+ /* Bump the list's refcount */
+ pg_atomic_fetch_add_u64(&cl->refcount, 1);
+ CACHE2_elog(DEBUG2, "SearchGlobalCatCacheList(%s): found list", m_relinfo.cc_relname);
+ *location = index;
+ return cl;
+ /* Global list never be negative */
+ }
+ return NULL;
+}
+/*
+ * SearchGlobalCatCacheList
+ *
+ * Generate a list of all tuples matching a partial key (that is,
+ * a key specifying just the first K of the cache's N key columns).
+ *
+ * The caller must not modify the list object or the pointed-to tuples,
+ * and must call Release() when done with the list.
+ */
+GlobalCatCList *GlobalSysTupCache::SearchListInternal(uint32 hash_value, int nkeys, Datum *arguments)
+{
+ FreeDeadCls();
+ Assert(nkeys > 0 && nkeys < m_relinfo.cc_nkeys);
+ int location = INVALID_LOCATION;
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+ GlobalCatCList *cl = FindListInternal(hash_value, nkeys, arguments, &location);
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+
+ if (cl != NULL) {
+ ResourceOwnerRememberGlobalCatCList(LOCAL_SYSDB_RESOWNER, cl);
+ TopnLruMoveToFront(&cl->cache_elem, &cc_lists, m_list_rw_lock, location);
+ return cl;
+ }
+
+ bool canInsertGSC = !g_instance.global_sysdbcache.StopInsertGSC();
+ /* if cc_lists is too long, swapout it */
+ if (cc_lists.dll_len >= MAX_GSC_LIST_LENGTH) {
+ RemoveTailListElements();
+ /* maybe no element can be swappedout */
+ canInsertGSC = canInsertGSC && cc_lists.dll_len < MAX_GSC_LIST_LENGTH;
+ }
+ cl = SearchListFromFile(hash_value, nkeys, arguments, !canInsertGSC);
+ return cl;
+}
+
+GlobalCatCList *GlobalSysTupCache::CreateCatCacheList(InsertCatListInfo *list_info)
+{
+ MemoryContext old;
+ if (list_info->canInsertGSC) {
+ old = MemoryContextSwitchTo(m_dbEntry->GetRandomMemCxt());
+ } else {
+ old = MemoryContextSwitchTo(GetLSCMemcxt(m_cache_id));
+ }
+ GlobalCatCList *new_cl = (GlobalCatCList *)palloc(offsetof(GlobalCatCList, members) +
+ (list_length(list_info->ctlist) + 1) * sizeof(GlobalCatCTup *));
+ ResourceOwnerRememberGlobalCatCList(LOCAL_SYSDB_RESOWNER, new_cl);
+ new_cl->refcount = 1;
+ new_cl->canInsertGSC = false;
+ new_cl->nkeys = list_info->nkeys;
+ /* releases and free by my_cache when palloc fail */
+ new_cl->my_cache = this;
+ new_cl->cl_magic = CL_MAGIC;
+ new_cl->hash_value = list_info->hash_value;
+ DLInitElem(&new_cl->cache_elem, new_cl);
+ new_cl->ordered = list_info->ordered;
+ new_cl->n_members = list_length(list_info->ctlist);
+ int index = 0;
+ ListCell *lc;
+ foreach (lc, list_info->ctlist) {
+ new_cl->members[index] = (GlobalCatCTup *)lfirst(lc);
+ index++;
+ }
+ /*
+ * Avoid double-free elemnts of list_info->ctlist by Resowner and Try-Catch(),
+ * to be safely we free info_list->ctlist here to avoid double-free happen, normally
+ * Resowner will do this
+ */
+ list_free_ext(list_info->ctlist);
+
+ Assert(index == new_cl->n_members);
+ errno_t rc = memset_s(new_cl->keys, list_info->nkeys * sizeof(Datum), 0, list_info->nkeys * sizeof(Datum));
+ securec_check(rc, "", "");
+
+ /* palloc maybe fail */
+ CatCacheCopyKeys(m_relinfo.cc_tupdesc, list_info->nkeys, m_relinfo.cc_keyno, list_info->arguments, new_cl->keys);
+ MemoryContextSwitchTo(old);
+ new_cl->canInsertGSC = list_info->canInsertGSC;
+ return new_cl;
+}
+
+GlobalCatCList *GlobalSysTupCache::InsertListIntoCatCacheList(InsertCatListInfo *list_info, GlobalCatCList *cl)
+{
+ if (!cl->canInsertGSC) {
+ return cl;
+ }
+
+ int location = INVALID_LOCATION;
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+ GlobalCatCList *exist_cl = FindListInternal(list_info->hash_value, list_info->nkeys, list_info->arguments,
+ &location);
+ if (exist_cl != NULL) {
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+ ResourceOwnerForgetGlobalCatCList(LOCAL_SYSDB_RESOWNER, cl);
+ ResourceOwnerRememberGlobalCatCList(LOCAL_SYSDB_RESOWNER, exist_cl);
+ /* we need mark clist's refcont to 0 then do real free up. */
+ cl->refcount = 0;
+ FreeGlobalCatCList(cl);
+ cl = exist_cl;
+ } else {
+ AddHeadToCCList(cl);
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+ }
+ return cl;
+}
+
+GlobalCatCList *GlobalSysTupCache::SearchListMiss(InsertCatListInfo *list_info)
+{
+ Relation relation;
+ ScanKeyData cur_skey[CATCACHE_MAXKEYS];
+ SysScanDesc scandesc;
+ errno_t rc;
+
+ /*
+ * Ok, need to make a lookup in the relation, copy the scankey and
+ * fill out any per-call fields.
+ */
+ rc = memcpy_s(cur_skey, sizeof(ScanKeyData) * CATCACHE_MAXKEYS, cc_skey,
+ sizeof(ScanKeyData) * m_relinfo.cc_nkeys);
+ securec_check(rc, "", "");
+ cur_skey[0].sk_argument = list_info->arguments[0];
+ cur_skey[1].sk_argument = list_info->arguments[1];
+ cur_skey[2].sk_argument = list_info->arguments[2];
+ cur_skey[3].sk_argument = list_info->arguments[3];
+
+ relation = heap_open(m_relinfo.cc_reloid, AccessShareLock);
+
+ scandesc = systable_beginscan(relation, m_relinfo.cc_indexoid, IndexScanOK(cc_id),
+ NULL, list_info->nkeys, cur_skey);
+ if (list_info->has_concurrent_lock) {
+ AcquireGSCTableReadLock(&list_info->has_concurrent_lock, m_concurrent_lock);
+ }
+
+ /* The list will be ordered iff we are doing an index scan */
+ list_info->ordered = (scandesc->irel != NULL);
+
+ HeapTuple ntp;
+ InsertCatTupInfo tup_info;
+ tup_info.find_type = SCAN_LIST_SKIP;
+ /* for list check, we cannot use arguments, instead we use t_self */
+ tup_info.arguments = NULL;
+ while (HeapTupleIsValid(ntp = systable_getnext(scandesc))) {
+ if (IsProcCache(m_relinfo.cc_reloid) && IsSystemObjOid(HeapTupleGetOid(ntp)) &&
+ likely(u_sess->attr.attr_common.IsInplaceUpgrade == false)) {
+ continue;
+ }
+ if (IsAttributeCache(m_relinfo.cc_reloid)) {
+ bool attIsNull = false;
+ Oid attrelid = DatumGetObjectId(SysCacheGetAttr(cc_id, ntp, Anum_pg_attribute_attrelid, &attIsNull));
+ if (IsSystemObjOid(attrelid) && IsValidCatalogParam(GetCatalogParam(attrelid))) {
+ continue;
+ }
+ }
+ /*
+ * See if there's an entry for this tuple already.
+ */
+ InitInsertCatTupInfo(&tup_info, ntp, list_info->arguments);
+ tup_info.canInsertGSC = list_info->has_concurrent_lock && CanTupleInertGSC(ntp);
+ GlobalCatCTup *ct = InsertHeapTupleIntoCatCacheInList(&tup_info);
+ list_info->canInsertGSC = list_info->canInsertGSC && ct->canInsertGSC;
+ /*
+ * Careful here: enlarge resource owner catref array, add entry to ctlist, then bump its refcount.
+ * This way leaves state correct if enlarge or lappend runs out of memory_context_list
+ * We use resource owner to track referenced cachetups for safety reasons. Because ctlist is now
+ * built from different sources, i.e. built-in catalogs and physical relation tuples. If failure in later
+ * sources is not caught, resource owner will clean up ref count for cachetups got from previous sources.
+ */
+ list_info->ctlist = lappend(list_info->ctlist, ct);
+ }
+ systable_endscan(scandesc);
+ heap_close(relation, AccessShareLock);
+ if (list_info->has_concurrent_lock && (!list_info->canInsertGSC || list_length(list_info->ctlist) == 0)) {
+ ReleaseGSCTableReadLock(&list_info->has_concurrent_lock, m_concurrent_lock);
+ list_info->canInsertGSC = false;
+ }
+ GlobalCatCList *cl = CreateCatCacheList(list_info);
+ return cl;
+}
+
+GlobalCatCList *GlobalSysTupCache::SearchListFromFile(uint32 hash_value, int nkeys, Datum *arguments,
+ bool is_exclusive)
+{
+ InsertCatListInfo list_info;
+ list_info.ordered = false;
+ list_info.ctlist = NIL;
+ list_info.nkeys = nkeys;
+ list_info.arguments = arguments;
+ list_info.hash_value = hash_value;
+ list_info.is_exclusive = is_exclusive;
+ list_info.has_concurrent_lock = !is_exclusive;
+ list_info.canInsertGSC = !is_exclusive;
+ /*
+ * List was not found in cache, so we have to build it by reading the
+ * relation. For each matching tuple found in the relation, use an
+ * existing cache entry if possible, else build a new one.
+ *
+ * We have to bump the member refcounts temporarily to ensure they won't
+ * get dropped from the cache while loading other members. We use a PG_TRY
+ * block to ensure we can undo those refcounts if we get an error before
+ * we finish constructing the CatCList.
+ */
+
+ /* Firstly, check the builtin functions. if there are functions
+ * which has the same name with the one we want to find, lappend it
+ * into the ctlist
+ */
+ if (IsProcCache(m_relinfo.cc_reloid) && CacheIsProcNameArgNsp(cc_id) &&
+ likely(u_sess->attr.attr_common.IsInplaceUpgrade == false)) {
+ SearchBuiltinProcCacheList(&list_info);
+ }
+
+ if (IsAttributeCache(m_relinfo.cc_reloid) && IsSystemObjOid(DatumGetObjectId(arguments[0]))) {
+ SearchPgAttributeCacheList(&list_info);
+ }
+ GlobalCatCList *cl = NULL;
+ PG_TRY();
+ {
+ cl = SearchListMiss(&list_info);
+ }
+ PG_CATCH();
+ {
+ ReleaseAllGSCRdConcurrentLock();
+ ReleaseTempList(list_info.ctlist);
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+
+ cl = InsertListIntoCatCacheList(&list_info, cl);
+ if (list_info.has_concurrent_lock) {
+ ReleaseGSCTableReadLock(&list_info.has_concurrent_lock, m_concurrent_lock);
+ }
+ return cl;
+}
+
+/*cat list***********************************************************************************************************/
+void GlobalSysTupCache::ReleaseTempList(const List *ctlist)
+{
+ ListCell *ctlist_item = NULL;
+ GlobalCatCTup *ct = NULL;
+ foreach (ctlist_item, ctlist) {
+ ct = (GlobalCatCTup *)lfirst(ctlist_item);
+ ct->Release();
+ }
+}
+
+void GlobalSysTupCache::InitInsertCatTupInfo(InsertCatTupInfo *tup_info, HeapTuple ntp, Datum *arguments)
+{
+ uint32 hash_value = CatalogCacheComputeTupleHashValue(cc_id, m_relinfo.cc_keyno, m_relinfo.cc_tupdesc,
+ m_relinfo.cc_hashfunc, m_relinfo.cc_reloid, m_relinfo.cc_nkeys, ntp);
+ Index hash_index = HASH_INDEX(hash_value, (uint32)(cc_nbuckets));
+ tup_info->arguments = arguments;
+ tup_info->hash_value = hash_value;
+ tup_info->hash_index = hash_index;
+ tup_info->ntp = ntp;
+}
+
+void GlobalSysTupCache::SearchPgAttributeCacheList(InsertCatListInfo *list_info)
+{
+ const FormData_pg_attribute *catlogAttrs = NULL;
+ Assert(list_info->nkeys == 1);
+ Oid relOid = ObjectIdGetDatum(list_info->arguments[0]);
+ CatalogRelationBuildParam catalogDesc = GetCatalogParam(relOid);
+ catlogAttrs = catalogDesc.attrs;
+ if (catalogDesc.oid == InvalidOid) {
+ return;
+ }
+ PG_TRY();
+ {
+ bool hasBucketAttr = false;
+ for (int16 attnum = 0; attnum < catalogDesc.natts + GetSysAttLength(hasBucketAttr); attnum++) {
+ Form_pg_attribute attr;
+ FormData_pg_attribute tempAttr;
+ if (attnum < catalogDesc.natts) {
+ tempAttr = catlogAttrs[attnum];
+ attr = &tempAttr;
+ } else {
+ int16 index = attnum - catalogDesc.natts;
+ if (!catalogDesc.hasoids && index == 1) {
+ continue;
+ }
+ /* The system table does not have the bucket column, so incoming false */
+ attr = SystemAttributeDefinition(-(index + 1), catalogDesc.hasoids, false, false);
+ attr->attrelid = relOid;
+ }
+ HeapTuple ntp = GetPgAttributeAttrTuple(m_relinfo.cc_tupdesc, attr);
+ InsertCatTupInfo tup_info;
+ tup_info.find_type = PGATTR_LIST_SKIP;
+ InitInsertCatTupInfo(&tup_info, ntp, list_info->arguments);
+ /* hard code, never change */
+ tup_info.is_exclusive = list_info->is_exclusive;
+ tup_info.canInsertGSC = true;
+ tup_info.attnum = attnum;
+ tup_info.catalogDesc = &catalogDesc;
+ GlobalCatCTup *ct = InsertHeapTupleIntoCatCacheInList(&tup_info);
+ heap_freetuple(ntp);
+ /*
+ * Careful here: enlarge resource owner catref array, add entry to ctlist, then bump its refcount.
+ * This way leaves state correct if enlarge or lappend runs out of memory_context_list
+ * We use resource owner to track referenced cachetups for safety reasons. Because ctlist is now
+ * built from different sources, i.e. built-in catalogs and physical relation tuples. If failure in later
+ * sources is not caught, resource owner will clean up ref count for cachetups got from previous sources.
+ */
+ list_info->ctlist = lappend(list_info->ctlist, ct);
+ }
+ }
+ PG_CATCH();
+ {
+ ReleaseAllGSCRdConcurrentLock();
+ ReleaseTempList(list_info->ctlist);
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+}
+
+void GlobalSysTupCache::SearchBuiltinProcCacheList(InsertCatListInfo *list_info)
+{
+ int i;
+ GlobalCatCTup *ct = NULL;
+ const FuncGroup *gfuncs = NULL;
+ Assert(list_info->nkeys == 1);
+ char *funcname = NameStr(*(DatumGetName(list_info->arguments[0])));
+ gfuncs = SearchBuiltinFuncByName(funcname);
+ if (gfuncs == NULL) {
+ CACHE3_elog(DEBUG2, "%s: the function \"%s\" does not in built-in list", __FUNCTION__, funcname);
+ return;
+ }
+ PG_TRY();
+ {
+ for (i = 0; i < gfuncs->fnums; i++) {
+ const Builtin_func *bfunc = &gfuncs->funcs[i];
+ HeapTuple ntp = CreateHeapTuple4BuiltinFunc(bfunc, NULL);
+ InsertCatTupInfo tup_info;
+ tup_info.find_type = PROC_LIST_SKIP;
+ InitInsertCatTupInfo(&tup_info, ntp, list_info->arguments);
+ /* hard code, never change */
+ tup_info.is_exclusive = list_info->is_exclusive;
+ tup_info.canInsertGSC = true;
+ ct = InsertHeapTupleIntoCatCacheInList(&tup_info);
+ heap_freetuple(ntp);
+ list_info->ctlist = lappend(list_info->ctlist, ct);
+ }
+ }
+ PG_CATCH();
+ {
+ ReleaseAllGSCRdConcurrentLock();
+ ReleaseTempList(list_info->ctlist);
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+}
+
+/*create init cat****************************************************************************************************/
+/*
+ * CatalogCacheCreateEntry
+ * Create a new GlobalCatCTup entry, copying the given HeapTuple and other
+ * supplied data into it. The new entry initially has refcount 0.
+ * this func makes sure the tuple has a shared memory context
+ * this func never fail
+ */
+void GlobalSysTupCache::CopyTupleIntoGlobalCatCTup(GlobalCatCTup *ct, HeapTuple dtp)
+{
+ Assert(!HeapTupleHasExternal(dtp));
+ ct->tuple = *dtp;
+ Assert(dtp->tupTableType == HEAP_TUPLE);
+ ct->tuple.tupTableType = HEAP_TUPLE;
+ ct->tuple.t_data = (HeapTupleHeader)MAXALIGN(((char *)ct) + sizeof(GlobalCatCTup));
+ /* copy tuple contents */
+ errno_t rc = memcpy_s((char *)ct->tuple.t_data, dtp->t_len, (const char *)dtp->t_data, dtp->t_len);
+ securec_check(rc, "", "");
+
+ /* extract keys - they'll point into the tuple if not by-value */
+ for (int i = 0; i < m_relinfo.cc_nkeys; i++) {
+ Datum atp;
+ bool isnull = false;
+ atp = heap_getattr(&ct->tuple, m_relinfo.cc_keyno[i], m_relinfo.cc_tupdesc, &isnull);
+#ifndef ENABLE_MULTIPLE_NODES
+ Assert(!isnull || ((m_relinfo.cc_reloid == ProcedureRelationId) && atp == 0));
+#else
+ Assert(!isnull);
+#endif
+ ct->keys[i] = atp;
+ }
+}
+
+void GlobalSysTupCache::InitHashTable()
+{
+ MemoryContext old = MemoryContextSwitchTo(m_dbEntry->GetRandomMemCxt());
+ /* this func allow palloc fail */
+ size_t sz = (cc_nbuckets + 1) * sizeof(Dllist) + PG_CACHE_LINE_SIZE;
+ if (cc_buckets == NULL) {
+ cc_buckets = (Dllist *)CACHELINEALIGN(palloc0(sz));
+ }
+ if (m_bucket_rw_locks == NULL) {
+ m_bucket_rw_locks = (pthread_rwlock_t *)palloc0((cc_nbuckets + 1) * sizeof(pthread_rwlock_t));
+ for (int i = 0; i <= cc_nbuckets; i++) {
+ PthreadRwLockInit(&m_bucket_rw_locks[i], NULL);
+ }
+ }
+ if (m_is_tup_swappingouts == NULL) {
+ m_is_tup_swappingouts = (volatile uint32 *)palloc0(sizeof(volatile uint32) * (cc_nbuckets + 1));
+ }
+ m_is_list_swappingout = 0;
+
+ (void)MemoryContextSwitchTo(old);
+}
+
+/* call on global memory context */
+void GlobalSysTupCache::InitCacheInfo(Oid reloid, Oid indexoid, int nkeys, const int *key, int nbuckets)
+{
+ int i;
+
+ /*
+ * nbuckets is the number of hash buckets to use in this GlobalCatCache.
+ * Currently we just use a hard-wired estimate of an appropriate size for
+ * each cache; maybe later make them dynamically resizable?
+ *
+ * nbuckets must be a power of two. We check this via Assert rather than
+ * a full runtime check because the values will be coming from constant
+ * tables.
+ *
+ * If you're confused by the power-of-two check, see comments in
+ * bitmapset.c for an explanation.
+ */
+ Assert(nbuckets > 0 && (nbuckets & -nbuckets) == nbuckets);
+ /*
+ * first switch to the cache context so our allocations do not vanish at
+ * the end of a transaction
+ */
+ cc_nbuckets = ResizeHashBucket(nbuckets, g_instance.global_sysdbcache.dynamic_hash_bucket_strategy);
+ /*
+ * Allocate a new cache structure, aligning to a cacheline boundary
+ *
+ * Note: we assume zeroing initializes the Dllist headers correctly
+ */
+ InitHashTable();
+ MemoryContext old = MemoryContextSwitchTo(m_dbEntry->GetRandomMemCxt());
+ DLInitList(&cc_lists);
+ /*
+ * initialize the cache's relation information for the relation
+ * corresponding to this cache, and initialize some of the new cache's
+ * other internal fields. But don't open the relation yet.
+ */
+ cc_id = m_cache_id;
+ m_relinfo.cc_relname = NULL;
+ m_relinfo.cc_reloid = reloid;
+ m_relinfo.cc_indexoid = indexoid;
+ m_relinfo.cc_tupdesc = (TupleDesc)NULL;
+ m_relinfo.cc_nkeys = nkeys;
+ for (i = 0; i < nkeys; ++i) {
+ m_relinfo.cc_keyno[i] = key[i];
+ }
+
+ if (m_list_rw_lock == NULL) {
+ m_list_rw_lock = (pthread_rwlock_t *)palloc0(sizeof(pthread_rwlock_t));
+ PthreadRwLockInit(m_list_rw_lock, NULL);
+ }
+ if (m_concurrent_lock == NULL) {
+ m_concurrent_lock = (pthread_rwlock_t *)palloc0(sizeof(pthread_rwlock_t));
+ PthreadRwLockInit(m_concurrent_lock, NULL);
+ }
+
+ (void)MemoryContextSwitchTo(old);
+}
+
+void GlobalSysTupCache::InitRelationInfo()
+{
+ Relation relation;
+ int i;
+
+ /*
+ * During inplace or online upgrade, the to-be-fabricated catalogs are still missing,
+ * for which we can not throw an ERROR.
+ */
+ LockRelationOid(m_relinfo.cc_reloid, AccessShareLock);
+
+ relation = RelationIdGetRelation(m_relinfo.cc_reloid);
+ if (!RelationIsValid(relation)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("could not open relation with OID %u", m_relinfo.cc_reloid)));
+ }
+
+ pgstat_initstats(relation);
+
+ /*
+ * switch to the cache context so our allocations do not vanish at the end
+ * of a transaction
+ */
+
+ MemoryContext old = MemoryContextSwitchTo(m_dbEntry->GetRandomMemCxt());
+
+ /*
+ * copy the relcache's tuple descriptor to permanent cache storage
+ */
+ if (m_relinfo.cc_tupdesc == NULL) {
+ m_relinfo.cc_tupdesc = CopyTupleDesc(RelationGetDescr(relation));
+ }
+
+ /*
+ * save the relation's name and relisshared flag, too (cc_relname is used
+ * only for debugging purposes)
+ */
+ if (m_relinfo.cc_relname == NULL) {
+ m_relinfo.cc_relname = pstrdup(RelationGetRelationName(relation));
+ }
+ Assert(m_relinfo.cc_relisshared == RelationGetForm(relation)->relisshared);
+
+ /*
+ * return to the caller's memory context and close the rel
+ */
+ MemoryContextSwitchTo(old);
+
+ enable_rls = RelationEnableRowSecurity(relation);
+
+ heap_close(relation, AccessShareLock);
+
+ /*
+ * initialize cache's key information
+ */
+ for (i = 0; i < m_relinfo.cc_nkeys; ++i) {
+ Oid keytype;
+ RegProcedure eqfunc;
+ if (m_relinfo.cc_keyno[i] > 0)
+ keytype = m_relinfo.cc_tupdesc->attrs[m_relinfo.cc_keyno[i] - 1]->atttypid;
+ else {
+ if (m_relinfo.cc_keyno[i] != ObjectIdAttributeNumber)
+ ereport(FATAL, (errmsg("only sys attr supported in caches is OID")));
+ keytype = OIDOID;
+ }
+ GetCCHashEqFuncs(keytype, &m_relinfo.cc_hashfunc[i], &eqfunc, &m_relinfo.cc_fastequal[i]);
+ /*
+ * Do equality-function lookup (we assume this won't need a catalog
+ * lookup for any supported type)
+ */
+ pfree_ext(cc_skey[i].sk_func.fnLibPath);
+ fmgr_info_cxt(eqfunc, &cc_skey[i].sk_func, m_dbEntry->GetRandomMemCxt());
+ /* Initialize sk_attno suitably for HeapKeyTest() and heap scans */
+ cc_skey[i].sk_attno = m_relinfo.cc_keyno[i];
+ /* Fill in sk_strategy as well --- always standard equality */
+ cc_skey[i].sk_strategy = BTEqualStrategyNumber;
+ cc_skey[i].sk_subtype = InvalidOid;
+ if (keytype == TEXTOID) {
+ cc_skey[i].sk_collation = DEFAULT_COLLATION_OID;
+ } else {
+ cc_skey[i].sk_collation = InvalidOid;
+ }
+ }
+}
+
+/*class func*******************************************************************************************************/
+void GlobalSysTupCache::Init()
+{
+ if (m_isInited) {
+ return;
+ }
+ /* this init called by systab, when a write lock is aquired
+ * init func followed by new, so m_isInited must be false
+ * lock first when call this func */
+ const cachedesc *cache_info = &cacheinfo[m_cache_id];
+ InitCacheInfo(cache_info->reloid, cache_info->indoid, cache_info->nkeys, cache_info->key, cache_info->nbuckets);
+ InitRelationInfo();
+ pg_memory_barrier();
+ m_isInited = true;
+}
+
+/*
+ * CatalogCacheIdInvalidate
+ *
+ * Invalidate entries in the specified cache, given a hash value.
+ *
+ * We delete cache entries that match the hash value.
+ * We don't care whether the invalidation is the result
+ * of a tuple insertion or a deletion.
+ *
+ * We used to try to match positive cache entries by TID, but that is
+ * unsafe after a VACUUM FULL on a system catalog: an inval event could
+ * be queued before VACUUM FULL, and then processed afterwards, when the
+ * target tuple that has to be invalidated has a different TID than it
+ * did when the event was created. So now we just compare hash values and
+ * accept the small risk of unnecessary invalidations due to false matches.
+ *
+ * This routine is only quasi-public: it should only be used by inval.c.
+ */
+/*
+ * HeapTupleInvalidate()
+ *
+ * pay attention:
+ * match disk one by one, so call this func when update , insert or delete every time
+ */
+void GlobalSysTupCache::HashValueInvalidate(uint32 hash_value)
+{
+ if (!m_isInited) {
+ return;
+ }
+ /*
+ * inspect caches to find the proper cache
+ * list of cache_header is never changed after init, so lock is not needed
+ * Invalidate *all *CatCLists in this cache; it's too hard to tell
+ * which searches might still be correct, so just zap 'em all.
+ */
+ /* avoid other session read from table and havn't insert into gsc */
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, m_concurrent_lock);
+
+ if (cc_lists.dll_len > 0) {
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+ for (Dlelem *elt = DLGetHead(&cc_lists); elt;) {
+ GlobalCatCList *cl = (GlobalCatCList *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ HandleDeadGlobalCatCList(cl);
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+ } else {
+ /* no one can insert because we have m_concurrent_lock exclusive lock
+ * no one can scan table now */
+ }
+
+ uint32 hash_index = HASH_INDEX(hash_value, cc_nbuckets);
+ if (GetBucket(hash_index)->dll_len > 0) {
+ pthread_rwlock_t *bucket_lock = &m_bucket_rw_locks[hash_index];
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt;) {
+ GlobalCatCTup *ct = (GlobalCatCTup *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ if (hash_value != ct->hash_value) {
+ continue;
+ }
+ HandleDeadGlobalCatCTup(ct);
+ /* maybe multi dead tuples, find them all */
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ } else {
+ /* no one can insert because we have m_concurrent_lock exclusive lock
+ * no one can scan table now */
+ }
+
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_concurrent_lock);
+}
+
+/*
+ * ResetGlobalCatCache
+ *
+ * Reset one catalog cache to empty.
+ *
+ * This is not very efficient if the target cache is nearly empty.
+ * However, it shouldn't need to be efficient; we don't invoke it often.
+ */
+template
+void GlobalSysTupCache::ResetCatalogCache()
+{
+ if (!m_isInited) {
+ return;
+ }
+
+ /* if not force, we are swappingout, m_concurrent_lock is not needed */
+ if (force) {
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, m_concurrent_lock);
+ }
+
+ if (cc_lists.dll_len > 0) {
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+ for (Dlelem *elt = DLGetHead(&cc_lists); elt;) {
+ GlobalCatCList *cl = (GlobalCatCList *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ if (force || cl->refcount == 0) {
+ HandleDeadGlobalCatCList(cl);
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_list_rw_lock);
+ }
+
+ /* Remove each tuple in this cache */
+ for (int i = 0; i < cc_nbuckets; i++) {
+ if (GetBucket(i)->dll_len == 0) {
+ continue;
+ }
+ pthread_rwlock_t *bucket_lock = &m_bucket_rw_locks[i];
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ for (Dlelem *elt = DLGetHead(&cc_buckets[i]); elt;) {
+ GlobalCatCTup *ct = (GlobalCatCTup *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ if (force || ct->refcount == 0) {
+ HandleDeadGlobalCatCTup(ct);
+ }
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ }
+
+ if (force) {
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, m_concurrent_lock);
+ }
+}
+template void GlobalSysTupCache::ResetCatalogCache();
+template void GlobalSysTupCache::ResetCatalogCache();
+
+List *GlobalSysTupCache::GetGlobalCatCTupStat()
+{
+ List *tuple_stat_list = NIL;
+ if (!m_isInited) {
+ return tuple_stat_list;
+ }
+
+ /* Remove each tuple in this cache */
+ for (int i = 0; i < cc_nbuckets; i++) {
+ if (GetBucket(i)->dll_len == 0) {
+ continue;
+ }
+ pthread_rwlock_t *bucket_lock = &m_bucket_rw_locks[i];
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ for (Dlelem *elt = DLGetHead(&cc_buckets[i]); elt;) {
+ GlobalCatCTup *ct = (GlobalCatCTup *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ GlobalCatalogTupleStat *tup_stat = (GlobalCatalogTupleStat*)palloc(sizeof(GlobalCatalogTupleStat));
+ tup_stat->db_oid = m_dbOid;
+ tup_stat->db_name_datum = CStringGetTextDatum(m_dbEntry->m_dbName);
+ tup_stat->rel_oid = m_relinfo.cc_reloid;
+ tup_stat->rel_name_datum = CStringGetTextDatum(m_relinfo.cc_relname);
+ tup_stat->cache_id = m_cache_id;
+ tup_stat->self = ct->tuple.t_self;
+ tup_stat->ctid = ct->tuple.t_data->t_ctid;
+ tup_stat->infomask = ct->tuple.t_data->t_infomask;
+ tup_stat->infomask2 = ct->tuple.t_data->t_infomask2;
+ tup_stat->hash_value = ct->hash_value;
+ tup_stat->refcount = ct->refcount;
+ tuple_stat_list = lappend(tuple_stat_list, tup_stat);
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ }
+ return tuple_stat_list;
+}
+
+#ifndef ENABLE_MULTIPLE_NODES
+GlobalCatCTup *GlobalSysTupCache::SearchTupleWithArgModes(uint32 hash_value, Datum *arguments, oidvector* argModes)
+{
+ FreeDeadCts();
+ pg_atomic_fetch_add_u64(m_searches, 1);
+ /*
+ * scan the hash bucket until we find a match or exhaust our tuples
+ */
+ Index hash_index = HASH_INDEX(hash_value, (uint32)cc_nbuckets);
+ pthread_rwlock_t *bucket_lock = &m_bucket_rw_locks[hash_index];
+ InsertCatTupInfo tup_info;
+ tup_info.find_type = SEARCH_TUPLE_SKIP;
+ tup_info.arguments = arguments;
+ tup_info.hash_value = hash_value;
+ tup_info.hash_index = hash_index;
+ int location = INVALID_LOCATION;
+
+ int index = 0;
+ GlobalCatCTup *ct = NULL;
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ index++;
+ ct = (GlobalCatCTup *)DLE_VAL(elt);
+ if (ct->hash_value != hash_value) {
+ ct = NULL;
+ continue;
+ }
+ if (!CatalogCacheCompareTuple(m_relinfo.cc_fastequal, m_relinfo.cc_nkeys, ct->keys, arguments)) {
+ ct = NULL;
+ continue;
+ }
+ if (unlikely(u_sess->attr.attr_common.IsInplaceUpgrade) && ct->tuple.t_self.ip_posid == 0) {
+ Assert(ct->tuple.t_tableOid == InvalidOid);
+ ct = NULL;
+ continue;
+ }
+ /*
+ * Make sure that the in-out-info(argmodes) should be the same.
+ */
+ if (!IsProArgModesEqualByTuple(&ct->tuple, m_relinfo.cc_tupdesc, argModes)) {
+ ct = NULL;
+ continue;
+ }
+ pg_atomic_fetch_add_u64(&ct->refcount, 1);
+ location = index;
+ break;
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, bucket_lock);
+
+ if (ct != NULL) {
+ pg_atomic_fetch_add_u64(m_hits, 1);
+ TopnLruMoveToFront(&ct->cache_elem, GetBucket(hash_index), bucket_lock, location);
+ return ct;
+ }
+
+ /* not match */
+ tup_info.find_type = SCAN_TUPLE_SKIP;
+ bool canInsertGSC = !g_instance.global_sysdbcache.StopInsertGSC();
+ /* if cc_lists is too long, swapout it */
+ if (cc_lists.dll_len >= MAX_GSC_LIST_LENGTH) {
+ RemoveTailListElements();
+ /* maybe no element can be swappedout */
+ canInsertGSC = canInsertGSC && cc_lists.dll_len < MAX_GSC_LIST_LENGTH;
+ }
+
+ tup_info.is_exclusive = !canInsertGSC;
+ tup_info.has_concurrent_lock = canInsertGSC;
+ ct = SearchTupleMissWithArgModes(&tup_info, argModes);
+ if (ct != NULL) {
+ pg_atomic_fetch_add_u64(m_newloads, 1);
+ }
+ return ct;
+}
+
+GlobalCatCTup *GlobalSysTupCache::SearchTupleFromFileWithArgModes(
+ uint32 hash_value, Datum *arguments, oidvector* argModes, bool is_exclusive)
+{
+ InsertCatTupInfo tup_info;
+ tup_info.find_type = SCAN_TUPLE_SKIP;
+ tup_info.arguments = arguments;
+ tup_info.hash_value = hash_value;
+ tup_info.hash_index = HASH_INDEX(hash_value, (uint32)cc_nbuckets);
+ /* not match */
+ tup_info.has_concurrent_lock = !is_exclusive;
+ tup_info.is_exclusive = is_exclusive;
+ Assert(is_exclusive);
+ GlobalCatCTup *ct = SearchTupleMissWithArgModes(&tup_info, argModes);
+ if (ct != NULL) {
+ pg_atomic_fetch_add_u64(m_newloads, 1);
+ }
+ return ct;
+}
+
+GlobalCatCTup *GlobalSysTupCache::SearchTupleMissWithArgModes(InsertCatTupInfo *tup_info, oidvector* argModes)
+{
+ GlobalCatCTup *ct = SearchMissFromProcAndAttribute(tup_info);
+ if (ct != NULL) {
+ return ct;
+ }
+ Relation relation = heap_open(m_relinfo.cc_reloid, AccessShareLock);
+ ereport(DEBUG1, (errmsg("cache->cc_reloid - %d", m_relinfo.cc_reloid)));
+ /*
+ * Ok, need to make a lookup in the relation, copy the scankey and fill
+ * out any per-call fields.
+ */
+ ScanKeyData cur_skey[CATCACHE_MAXKEYS];
+ errno_t rc = memcpy_s(cur_skey, sizeof(ScanKeyData) * CATCACHE_MAXKEYS, cc_skey,
+ sizeof(ScanKeyData) * m_relinfo.cc_nkeys);
+ securec_check(rc, "", "");
+ Datum *arguments = tup_info->arguments;
+ cur_skey[0].sk_argument = arguments[0];
+ cur_skey[1].sk_argument = arguments[1];
+ cur_skey[2].sk_argument = arguments[2];
+ cur_skey[3].sk_argument = arguments[3];
+ SysScanDesc scandesc =
+ systable_beginscan(relation, m_relinfo.cc_indexoid, IndexScanOK(cc_id), NULL,
+ m_relinfo.cc_nkeys, cur_skey);
+ /* for cache read, make sure no one can clear syscache before we insert the result */
+ tup_info->has_concurrent_lock = !tup_info->is_exclusive;
+
+ if (tup_info->has_concurrent_lock) {
+ AcquireGSCTableReadLock(&tup_info->has_concurrent_lock, m_concurrent_lock);
+ }
+ HeapTuple ntp;
+ while (HeapTupleIsValid(ntp = systable_getnext(scandesc))) {
+ /*
+ * The key2 (pg_proc_allargtypes) can be duplicate in table.
+ * We need to compare the proargmodes to make sure the function is correct.
+ */
+ if (!IsProArgModesEqualByTuple(ntp, m_relinfo.cc_tupdesc, argModes)) {
+ continue;
+ }
+
+ tup_info->ntp = ntp;
+ if (!tup_info->has_concurrent_lock) {
+ tup_info->canInsertGSC = false;
+ } else {
+ tup_info->canInsertGSC = CanTupleInertGSC(ntp);
+ if (!tup_info->canInsertGSC) {
+ /* unlock concurrent immediately, any one can invalid cache now */
+ ReleaseGSCTableReadLock(&tup_info->has_concurrent_lock, m_concurrent_lock);
+ }
+ }
+ ct = InsertHeapTupleIntoCatCacheInSingle(tup_info);
+ break; /* assume only one match */
+ }
+ /* unlock finally */
+ if (tup_info->has_concurrent_lock) {
+ ReleaseGSCTableReadLock(&tup_info->has_concurrent_lock, m_concurrent_lock);
+ }
+ systable_endscan(scandesc);
+ heap_close(relation, AccessShareLock);
+
+ /*
+ * global catcache match disk , not need negative tuple
+ */
+ return ct;
+}
+#endif
diff --git a/src/common/backend/utils/cache/knl_globaltabdefcache.cpp b/src/common/backend/utils/cache/knl_globaltabdefcache.cpp
new file mode 100644
index 000000000..20cddf93e
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_globaltabdefcache.cpp
@@ -0,0 +1,632 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "executor/executor.h"
+#include "utils/knl_globaltabdefcache.h"
+#include "commands/trigger.h"
+#include "rewrite/rewriteRlsPolicy.h"
+#include "utils/builtins.h"
+#include "knl/knl_session.h"
+#include "utils/palloc.h"
+#include "utils/memutils.h"
+#include "utils/knl_relcache.h"
+#include "utils/knl_catcache.h"
+#include "utils/partitionmap.h"
+#include "catalog/indexing.h"
+#include "catalog/pg_publication.h"
+
+static void RelationPointerToNULL(Relation rel)
+{
+ rel->rd_smgr = NULL;
+ rel->rd_rel = NULL;
+ rel->rd_att = NULL;
+ rel->rd_rules = NULL;
+ rel->rd_rulescxt = NULL;
+ rel->trigdesc = NULL;
+ rel->rd_rlsdesc = NULL;
+ rel->rd_indexlist = NIL;
+ rel->rd_indexattr = NULL;
+ rel->rd_keyattr = NULL;
+ rel->rd_idattr = NULL;
+ rel->rd_pkattr = NULL;
+ rel->rd_pubactions = NULL;
+ rel->rd_options = NULL;
+ rel->rd_index = NULL;
+ rel->rd_indextuple = NULL;
+ rel->rd_am = NULL;
+ rel->rd_indexcxt = NULL;
+ rel->rd_aminfo = NULL;
+ rel->rd_opfamily = NULL;
+ rel->rd_opcintype = NULL;
+ rel->rd_support = NULL;
+ rel->rd_supportinfo = NULL;
+ rel->rd_indoption = NULL;
+ rel->rd_indexprs = NULL;
+ rel->rd_indpred = NULL;
+ rel->rd_exclops = NULL;
+ rel->rd_exclprocs = NULL;
+ rel->rd_exclstrats = NULL;
+ rel->rd_amcache = NULL;
+ rel->rd_indcollation = NULL;
+ rel->rd_fdwroutine = NULL;
+ rel->rd_bucketkey = NULL;
+ rel->partMap = NULL;
+ rel->pgstat_info = NULL;
+ rel->rd_locator_info = NULL;
+ rel->sliceMap = NULL;
+ rel->parent = NULL;
+ /* double linked list node, partition and bucket relation would be stored in fakerels list of resource owner */
+ rel->node.prev = NULL;
+ rel->node.next = NULL;
+}
+
+static void *CopyPubActions(void *pubActions)
+{
+ if (pubActions == NULL) {
+ return NULL;
+ }
+ PublicationActions *res = (PublicationActions*)palloc(sizeof(PublicationActions));
+ errno_t rc = memcpy_s(res, sizeof(PublicationActions), pubActions, sizeof(PublicationActions));
+ securec_check(rc, "", "");
+ return res;
+}
+
+static Form_pg_class CopyRelationRdrel(Relation rel)
+{
+ Assert(rel->rd_rel != NULL);
+ /* Copy the relation tuple form
+ *
+ * We only allocate space for the fixed fields, ie, CLASS_TUPLE_SIZE. The
+ * variable-length fields (relacl, reloptions) are NOT stored in the
+ * relcache --- there'd be little point in it, since we don't copy the
+ * tuple's nulls bitmap and hence wouldn't know if the values are valid.
+ * Bottom line is that relacl *cannot* be retrieved from the relcache. Get
+ * it from the syscache if you need it. The same goes for the original
+ * form of reloptions (however, we do store the parsed form of reloptions
+ * in rd_options).
+ */
+ Form_pg_class rd_rel = (Form_pg_class)palloc(sizeof(FormData_pg_class));
+ errno_t rc = memcpy_s(rd_rel, sizeof(FormData_pg_class), rel->rd_rel, CLASS_TUPLE_SIZE);
+ securec_check(rc, "", "");
+ return rd_rel;
+}
+
+TupleDesc CopyTupleDesc(TupleDesc tupdesc)
+{
+ TupleDesc rd_att = CreateTupleDescCopyConstr(tupdesc);
+ if (tupdesc->constr == NULL) {
+ return rd_att;
+ }
+ /* TupleConstrCopy dont copy clusterKeys info, so we copy it manually */
+ TupleConstr *dst = rd_att->constr;
+ TupleConstr *src = tupdesc->constr;
+ Assert(src != NULL);
+ dst->clusterKeyNum = src->clusterKeyNum;
+ Assert(dst->clusterKeys == NULL);
+ if (dst->clusterKeyNum == 0) {
+ return rd_att;
+ }
+ size_t len = sizeof(AttrNumber) * dst->clusterKeyNum;
+ dst->clusterKeys = (AttrNumber *)palloc(len);
+ errno_t rc = memcpy_s(dst->clusterKeys, len, src->clusterKeys, len);
+ securec_check(rc, "", "");
+ return rd_att;
+}
+
+static RuleLock *CopyRelationRules(Relation rel, MemoryContext rules_cxt)
+{
+ if (rel->rd_rules == NULL) {
+ return NULL;
+ }
+ MemoryContext old = MemoryContextSwitchTo(rules_cxt);
+ RuleLock *rd_rules = (RuleLock *)palloc(sizeof(RuleLock));
+ rd_rules->numLocks = rel->rd_rules->numLocks;
+ RewriteRule **rules = (RewriteRule **)palloc(sizeof(RewriteRule *) * rel->rd_rules->numLocks);
+ rd_rules->rules = rules;
+ for (int i = 0; i < rel->rd_rules->numLocks; i++) {
+ rules[i] = (RewriteRule *)palloc(sizeof(RewriteRule));
+ *rules[i] = *rel->rd_rules->rules[i];
+ rules[i]->actions = (List *)copyObject(rel->rd_rules->rules[i]->actions);
+ rules[i]->qual = (Node *)copyObject(rel->rd_rules->rules[i]->qual);
+ }
+ MemoryContextSwitchTo(old);
+ return rd_rules;
+}
+
+static RlsPoliciesDesc *CopyRelationRls(Relation rel, MemoryContext rls_cxt)
+{
+ if (rel->rd_rlsdesc == NULL) {
+ return NULL;
+ }
+ MemoryContext old = MemoryContextSwitchTo(rls_cxt);
+ RlsPoliciesDesc *rd_rlsdesc = (RlsPoliciesDesc *)palloc(sizeof(RlsPoliciesDesc));
+ rd_rlsdesc->rlsCxt = rls_cxt;
+ rd_rlsdesc->rlsPolicies = NULL;
+ ListCell *lc;
+ foreach (lc, rel->rd_rlsdesc->rlsPolicies) {
+ RlsPolicy *dst_rls = (RlsPolicy *)palloc(sizeof(RlsPolicy));
+ RlsPolicy *src_rls = (RlsPolicy *)lfirst(lc);
+ *dst_rls = *src_rls;
+ dst_rls->policyName = pstrdup(src_rls->policyName);
+ dst_rls->roles = DatumGetArrayTypePCopy(src_rls->roles);
+ dst_rls->usingExpr = (Expr *)copyObject(src_rls->usingExpr);
+ rd_rlsdesc->rlsPolicies = lappend(rd_rlsdesc->rlsPolicies, dst_rls);
+ }
+ MemoryContextSwitchTo(old);
+ return rd_rlsdesc;
+}
+
+extern bytea *CopyOption(bytea *options)
+{
+ if (options == NULL) {
+ return NULL;
+ }
+ bytea *copy = (bytea *)palloc(VARSIZE(options));
+ errno_t rc = memcpy_s(copy, VARSIZE(options), options, VARSIZE(options));
+ /* this func called also by partcopy, which has no memcxt protect, so pfree when memcpy failed */
+ securec_check(rc, (char *)copy, "");
+ return copy;
+}
+
+static Form_pg_am CopyRelationAm(Relation rel)
+{
+ if (rel->rd_am == NULL) {
+ return NULL;
+ }
+ Form_pg_am rd_am = (Form_pg_am)palloc(sizeof(FormData_pg_am));
+ *rd_am = *rel->rd_am;
+ return rd_am;
+}
+
+static void CopyRelationIndexAccessInfo(Relation newrel, Relation rel, MemoryContext index_cxt)
+{
+ if (!RelationIsIndex(rel)) {
+ Assert(rel->rd_indnkeyatts == 0);
+ Assert(rel->rd_indexcxt == NULL);
+ return;
+ }
+
+ newrel->rd_indexcxt = index_cxt;
+ int indnkeyatts = IndexRelationGetNumberOfKeyAttributes(rel);
+ int nsupport = rel->rd_am->amsupport * RelationGetNumberOfAttributes(rel);
+ newrel->rd_aminfo = NULL;
+
+ newrel->rd_opfamily = (Oid*)MemoryContextAllocZero(index_cxt, indnkeyatts * sizeof(Oid));
+ newrel->rd_opcintype = (Oid*)MemoryContextAllocZero(index_cxt, indnkeyatts * sizeof(Oid));
+
+ if (rel->rd_am->amsupport > 0) {
+ newrel->rd_support = (RegProcedure*)MemoryContextAllocZero(index_cxt, nsupport * sizeof(RegProcedure));
+ newrel->rd_supportinfo = (FmgrInfo*)MemoryContextAllocZero(index_cxt, nsupport * sizeof(FmgrInfo));
+ } else {
+ newrel->rd_support = NULL;
+ newrel->rd_supportinfo = NULL;
+ }
+
+ newrel->rd_indcollation = (Oid*)MemoryContextAllocZero(index_cxt, indnkeyatts * sizeof(Oid));
+
+ newrel->rd_indoption = (int16*)MemoryContextAllocZero(index_cxt, indnkeyatts * sizeof(int16));
+
+ errno_t rc = memcpy_s(newrel->rd_opfamily, indnkeyatts * sizeof(Oid), rel->rd_opfamily, indnkeyatts * sizeof(Oid));
+ securec_check(rc, "", "");
+ rc = memcpy_s(newrel->rd_opcintype, indnkeyatts * sizeof(Oid), rel->rd_opcintype, indnkeyatts * sizeof(Oid));
+ securec_check(rc, "", "");
+ if (nsupport > 0) {
+ rc = memcpy_s(newrel->rd_support, nsupport * sizeof(RegProcedure),
+ rel->rd_support, nsupport * sizeof(RegProcedure));
+ securec_check(rc, "", "");
+ rc = memcpy_s(newrel->rd_supportinfo, nsupport * sizeof(FmgrInfo),
+ rel->rd_supportinfo, nsupport * sizeof(FmgrInfo));
+ securec_check(rc, "", "");
+ }
+ rc = memcpy_s(newrel->rd_indcollation, indnkeyatts * sizeof(Oid), rel->rd_indcollation, indnkeyatts * sizeof(Oid));
+ securec_check(rc, "", "");
+ rc = memcpy_s(newrel->rd_indoption, indnkeyatts * sizeof(int16), rel->rd_indoption, indnkeyatts * sizeof(int16));
+ securec_check(rc, "", "");
+ MemoryContext oldcxt = MemoryContextSwitchTo(index_cxt);
+ if (rel->rd_indexprs) {
+ newrel->rd_indexprs = (List *)copyObject(rel->rd_indexprs);
+ }
+ if (rel->rd_indpred) {
+ newrel->rd_indpred = (List *)copyObject(rel->rd_indpred);
+ }
+ (void)MemoryContextSwitchTo(oldcxt);
+ if (rel->rd_exclops == NULL) {
+ Assert(rel->rd_exclprocs == NULL);
+ Assert(rel->rd_exclstrats == NULL);
+ newrel->rd_exclops = NULL;
+ newrel->rd_exclprocs = NULL;
+ newrel->rd_exclstrats = NULL;
+ } else {
+ Assert(rel->rd_exclprocs != NULL);
+ Assert(rel->rd_exclstrats != NULL);
+ newrel->rd_exclops = (Oid*)MemoryContextAlloc(index_cxt, sizeof(Oid) * indnkeyatts);
+ newrel->rd_exclprocs = (Oid*)MemoryContextAlloc(index_cxt, sizeof(Oid) * indnkeyatts);
+ newrel->rd_exclstrats = (uint16*)MemoryContextAlloc(index_cxt, sizeof(uint16) * indnkeyatts);
+
+ rc = memcpy_s(newrel->rd_exclops, sizeof(Oid) * indnkeyatts, rel->rd_exclops, sizeof(Oid) * indnkeyatts);
+ securec_check(rc, "", "");
+ rc = memcpy_s(newrel->rd_exclprocs, sizeof(Oid) * indnkeyatts, rel->rd_exclprocs, sizeof(Oid) * indnkeyatts);
+ securec_check(rc, "", "");
+ rc = memcpy_s(newrel->rd_exclstrats, sizeof(uint16) * indnkeyatts,
+ rel->rd_exclstrats, sizeof(uint16) * indnkeyatts);
+ securec_check(rc, "", "");
+ }
+
+ /* not inited by relcache */
+ newrel->rd_amcache = NULL;
+}
+
+static RelationBucketKey *CopyRelationBucketKey(Relation rel)
+{
+ if (rel->rd_bucketkey == NULL) {
+ return NULL;
+ }
+ RelationBucketKey *rd_bucketkey = (RelationBucketKey *)palloc(sizeof(RelationBucketKey));
+ rd_bucketkey->bucketKey = int2vectorCopy(rel->rd_bucketkey->bucketKey);
+ int n_column = rel->rd_bucketkey->bucketKey->dim1;
+ int n_col_len = sizeof(Oid) * n_column;
+ rd_bucketkey->bucketKeyType = (Oid *)palloc(n_col_len);
+ errno_t rc = memcpy_s(rd_bucketkey->bucketKeyType, n_col_len, rel->rd_bucketkey->bucketKeyType, n_col_len);
+ securec_check(rc, "", "");
+ return rd_bucketkey;
+}
+
+static PartitionMap *CopyRangePartitionMap(RangePartitionMap *src_rpm)
+{
+ RangePartitionMap *dst_rpm = (RangePartitionMap *)palloc(sizeof(RangePartitionMap));
+
+ *dst_rpm = *src_rpm;
+
+ dst_rpm->partitionKey = int2vectorCopy(src_rpm->partitionKey);
+
+ size_t key_len = sizeof(Oid) * src_rpm->partitionKey->dim1;
+ dst_rpm->partitionKeyDataType = (Oid *)palloc(key_len);
+ errno_t rc = memcpy_s(dst_rpm->partitionKeyDataType, key_len, src_rpm->partitionKeyDataType, key_len);
+ securec_check(rc, "", "");
+
+ dst_rpm->rangeElements =
+ copyRangeElements(src_rpm->rangeElements, src_rpm->rangeElementsNum, src_rpm->partitionKey->dim1);
+
+ if (src_rpm->type.type == PART_TYPE_INTERVAL) {
+ Assert(src_rpm->partitionKey->dim1 == 1);
+ dst_rpm->intervalValue = (Interval *)palloc(sizeof(Interval));
+ *dst_rpm->intervalValue = *src_rpm->intervalValue;
+#define OidVectorSize(n) (offsetof(oidvector, values) + (n) * sizeof(Oid))
+ if (src_rpm->intervalTablespace != NULL) {
+ size_t interval_len = OidVectorSize(src_rpm->intervalTablespace->dim1);
+ dst_rpm->intervalTablespace = (oidvector *)palloc(interval_len);
+ rc = memcpy_s(dst_rpm->intervalTablespace, interval_len, src_rpm->intervalTablespace, interval_len);
+ securec_check(rc, "", "");
+ } else {
+ Assert(dst_rpm->intervalTablespace == NULL);
+ }
+ }
+ return (PartitionMap *)dst_rpm;
+}
+
+static PartitionMap *CopyPartitionMap(Relation rel)
+{
+ if (rel->partMap == NULL) {
+ return NULL;
+ }
+ switch (rel->partMap->type) {
+ case PART_TYPE_VALUE: {
+ ValuePartitionMap *dst_vpm = (ValuePartitionMap *)palloc0(sizeof(ValuePartitionMap));
+ ValuePartitionMap *src_vpm = (ValuePartitionMap *)rel->partMap;
+ dst_vpm->type = src_vpm->type;
+ dst_vpm->relid = src_vpm->relid;
+ dst_vpm->partList = list_copy(src_vpm->partList);
+ return (PartitionMap *)dst_vpm;
+ }
+ case PART_TYPE_RANGE:
+ case PART_TYPE_INTERVAL: {
+ return (PartitionMap *)CopyRangePartitionMap((RangePartitionMap *)rel->partMap);
+ }
+ case PART_TYPE_LIST: {
+ ListPartitionMap *dst_lpm = (ListPartitionMap *)palloc(sizeof(ListPartitionMap));
+ ListPartitionMap *src_lpm = (ListPartitionMap *)rel->partMap;
+ *dst_lpm = *src_lpm;
+ dst_lpm->partitionKey = int2vectorCopy(src_lpm->partitionKey);
+ size_t key_len = sizeof(Oid) * src_lpm->partitionKey->dim1;
+ dst_lpm->partitionKeyDataType = (Oid *)palloc(key_len);
+ errno_t rc = memcpy_s(dst_lpm->partitionKeyDataType, key_len, src_lpm->partitionKeyDataType, key_len);
+ securec_check(rc, "", "");
+ dst_lpm->listElements = CopyListElements(src_lpm->listElements, src_lpm->listElementsNum);
+ return (PartitionMap *)dst_lpm;
+ }
+ case PART_TYPE_HASH: {
+ HashPartitionMap *dst_hpm = (HashPartitionMap *)palloc(sizeof(HashPartitionMap));
+ HashPartitionMap *src_hpm = (HashPartitionMap *)rel->partMap;
+ *dst_hpm = *src_hpm;
+ dst_hpm->partitionKey = int2vectorCopy(src_hpm->partitionKey);
+ size_t key_len = sizeof(Oid) * src_hpm->partitionKey->dim1;
+ dst_hpm->partitionKeyDataType = (Oid *)palloc(key_len);
+ errno_t rc = memcpy_s(dst_hpm->partitionKeyDataType, key_len, src_hpm->partitionKeyDataType, key_len);
+ securec_check(rc, "", "");
+ dst_hpm->hashElements =
+ CopyHashElements(src_hpm->hashElements, src_hpm->hashElementsNum, src_hpm->partitionKey->dim1);
+ return (PartitionMap *)dst_hpm;
+ }
+ default:
+ ereport(ERROR,
+ (errcode(ERRCODE_PARTITION_ERROR),
+ errmsg("Fail to copy partitionmap for partitioned table \"%u\".", RelationGetRelid(rel)),
+ errdetail("Incorrect partition strategy \"%c\" for partitioned table.", rel->partMap->type)));
+ return NULL;
+ }
+ return NULL;
+}
+
+static RelationLocInfo *CopyRelationLocInfoWithOutBucketPtr(RelationLocInfo *srcInfo)
+{
+ /* locator info is used only for IS_PGXC_COORDINATOR */
+ if (srcInfo == NULL || !IS_PGXC_COORDINATOR) {
+ return NULL;
+ }
+ RelationLocInfo *dst_info = CopyRelationLocInfo(srcInfo);
+ dst_info->buckets_ptr = NULL;
+ return dst_info;
+}
+
+static PartitionMap *CopyRelationSliceMap(Relation rel)
+{
+ if (rel->sliceMap == NULL) {
+ return NULL;
+ }
+ return CopyRangePartitionMap((RangePartitionMap *)rel->sliceMap);
+}
+
+static void SpecialWorkForGlobalRel(Relation rel)
+{
+ /* see define in rel.h */
+ rel->rd_createSubid = InvalidSubTransactionId;
+ rel->rd_newRelfilenodeSubid = InvalidSubTransactionId;
+ Assert(rel->rd_isnailed ? rel->rd_refcnt == 1 : rel->rd_refcnt == 0);
+ /* see RelationInitLockInfo in lmgr.cpp */
+ Assert(rel->rd_lockInfo.lockRelId.bktId == InvalidOid);
+ /* global cache never open file */
+ Assert(rel->rd_smgr == NULL);
+ /* refcnt must be one if isnailed or zero */
+ Assert(rel->rd_isnailed ? rel->rd_refcnt == 1 : rel->rd_refcnt == 0);
+
+ Assert(!g_instance.global_sysdbcache.IsCritialForInitSysCache(rel->rd_id) ||
+ (rel->rd_isnailed && rel->rd_refcnt == 1));
+
+ /* 0 invalid 1 yes 2 transaction tmp */
+ Assert(rel->rd_indexvalid <= 1);
+ Assert((rel->rd_node.dbNode == InvalidOid && rel->rd_node.spcNode == GLOBALTABLESPACE_OID) ||
+ (rel->rd_node.dbNode != InvalidOid && rel->rd_node.spcNode != GLOBALTABLESPACE_OID));
+ Assert(rel->rd_node.spcNode != InvalidOid);
+ Assert(rel->rd_node.relNode != InvalidOid);
+ if (rel->rd_locator_info != NULL) {
+ Assert(IS_PGXC_COORDINATOR && rel->rd_id >= FirstNormalObjectId);
+ List *old_node_list = rel->rd_locator_info->nodeList;
+ ListCell *lc;
+ foreach (lc, old_node_list) {
+ lfirst_int(lc) = PGXCNodeGetNodeOid(lfirst_int(lc), PGXC_NODE_DATANODE);
+ }
+ }
+}
+
+Relation CopyRelationData(Relation newrel, Relation rel, MemoryContext rules_cxt, MemoryContext rls_cxt,
+ MemoryContext index_cxt)
+{
+ /* if you add variable to relation, please check if you need put it in gsc,
+ * if not, set it zero when copy, and reinit it when local get the copy result
+ * otherwise, do the copy work here
+ * if the variable changed, there is no lock and no rel inval msg,
+ * set it zero and reinit it when copy into local */
+ Assert(sizeof(RelationData) == 520);
+ /* all copied exclude pointer */
+ *newrel = *rel;
+ Assert(rel->rd_createSubid == InvalidSubTransactionId);
+ Assert(rel->rd_newRelfilenodeSubid == InvalidSubTransactionId);
+ /* init all pointers to NULL, so we can free memory correctly when meeting exception */
+ RelationPointerToNULL(newrel);
+
+ newrel->rd_rel = CopyRelationRdrel(rel);
+ newrel->rd_att = CopyTupleDesc(rel->rd_att);
+ Assert(rel->rd_att->tdrefcount == 1);
+ newrel->rd_att->tdrefcount = 1;
+ Assert(rel->rd_att->tdhasoid == rel->rd_rel->relhasoids);
+
+ newrel->rd_rulescxt = rules_cxt;
+ newrel->rd_rules = CopyRelationRules(rel, rules_cxt);
+ /* CopyTriggerDesc check null pointer */
+ newrel->trigdesc = CopyTriggerDesc(rel->trigdesc);
+ newrel->rd_rlsdesc = CopyRelationRls(rel, rls_cxt);
+
+ /* this is oid list, just copy list */
+ newrel->rd_indexlist = list_copy(rel->rd_indexlist);
+ /* bms_copy check null pointer */
+ newrel->rd_indexattr = bms_copy(rel->rd_indexattr);
+ newrel->rd_keyattr = bms_copy(rel->rd_keyattr);
+ newrel->rd_idattr = bms_copy(rel->rd_idattr);
+ newrel->rd_pkattr = bms_copy(rel->rd_pkattr);
+
+ newrel->rd_pubactions = CopyPubActions(rel->rd_pubactions);
+
+ newrel->rd_options = CopyOption(rel->rd_options);
+
+ newrel->rd_indextuple = heap_copytuple(rel->rd_indextuple);
+ if (newrel->rd_indextuple != NULL) {
+ newrel->rd_index = (Form_pg_index)GETSTRUCT(newrel->rd_indextuple);
+ } else {
+ newrel->rd_index = NULL;
+ }
+
+ newrel->rd_am = CopyRelationAm(rel);
+
+ CopyRelationIndexAccessInfo(newrel, rel, index_cxt);
+
+ /* not inited by relcache */
+ newrel->rd_fdwroutine = NULL;
+
+ newrel->rd_bucketkey = CopyRelationBucketKey(rel);
+
+ newrel->partMap = (PartitionMap *)CopyPartitionMap(rel);
+
+ newrel->pgstat_info = NULL;
+
+ newrel->rd_locator_info = CopyRelationLocInfoWithOutBucketPtr(rel->rd_locator_info);
+
+ Assert(rel->sliceMap == NULL || IsLocatorDistributedBySlice(rel->rd_locator_info->locatorType));
+ newrel->sliceMap = CopyRelationSliceMap(rel);
+
+ newrel->entry = NULL;
+ return newrel;
+}
+
+void GlobalTabDefCache::Insert(Relation rel, uint32 hash_value)
+{
+ Index hash_index = HASH_INDEX(hash_value, (uint32)m_nbuckets);
+ /* dllist is too long, swapout some */
+ if (m_bucket_list.GetBucket(hash_index)->dll_len >= MAX_GSC_LIST_LENGTH) {
+ GlobalBaseDefCache::RemoveTailElements(hash_index);
+ /* maybe no element can be swappedout */
+ return;
+ }
+ Assert((m_is_shared && g_instance.global_sysdbcache.HashSearchSharedRelation(rel->rd_id)) ||
+ ((!m_is_shared && !g_instance.global_sysdbcache.HashSearchSharedRelation(rel->rd_id))));
+
+ Assert(rel->rd_bucketkey != (RelationBucketKey *)&(rel->rd_bucketkey));
+
+ GlobalRelationEntry *entry = CreateEntry(rel);
+ PthreadRWlockWrlock(LOCAL_SYSDB_RESOWNER, &m_obj_locks[hash_index]);
+ bool found = GlobalBaseDefCache::EntryExist(rel->rd_id, hash_index);
+ if (found) {
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_obj_locks[hash_index]);
+ entry->Free(entry);
+ return;
+ }
+
+ GlobalBaseDefCache::AddHeadToBucket(hash_index, entry);
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, &m_obj_locks[hash_index]);
+ pg_atomic_fetch_add_u64(m_newloads, 1);
+}
+
+/* write lock need */
+GlobalRelationEntry *GlobalTabDefCache::CreateEntry(Relation rel)
+{
+ ResourceOwner owner = LOCAL_SYSDB_RESOWNER;
+ ResourceOwnerEnlargeGlobalBaseEntry(owner);
+ MemoryContext old = MemoryContextSwitchTo(m_db_entry->GetRandomMemCxt());
+ GlobalRelationEntry *entry = (GlobalRelationEntry *)palloc(sizeof(GlobalRelationEntry));
+ entry->type = GLOBAL_RELATION_ENTRY;
+ entry->rel_mem_manager = NULL;
+ entry->oid = rel->rd_id;
+ entry->refcount = 0;
+ DLInitElem(&entry->cache_elem, (void *)entry);
+ ResourceOwnerRememberGlobalBaseEntry(owner, (GlobalBaseEntry *)entry);
+ entry->rel_mem_manager =
+ AllocSetContextCreate(CurrentMemoryContext, RelationGetRelationName(rel), ALLOCSET_SMALL_MINSIZE,
+ ALLOCSET_SMALL_INITSIZE, ALLOCSET_SMALL_MAXSIZE, SHARED_CONTEXT);
+ (void)MemoryContextSwitchTo(entry->rel_mem_manager);
+ entry->rel = (Relation)palloc0(sizeof(RelationData));
+ CopyRelationData(entry->rel, rel, entry->rel_mem_manager, entry->rel_mem_manager, entry->rel_mem_manager);
+ SpecialWorkForGlobalRel(entry->rel);
+ ResourceOwnerForgetGlobalBaseEntry(owner, (GlobalBaseEntry *)entry);
+ MemoryContextSwitchTo(old);
+
+ return entry;
+}
+
+void GlobalTabDefCache::Init()
+{
+ MemoryContext old = MemoryContextSwitchTo(m_db_entry->GetRandomMemCxt());
+ GlobalBaseDefCache::Init(GLOBAL_INIT_RELCACHE_SIZE);
+ m_catalog_lock = (pthread_mutex_t *)palloc(sizeof(pthread_mutex_t));
+ pthread_mutex_init(m_catalog_lock, NULL);
+ MemoryContextSwitchTo(old);
+ m_is_inited = true;
+}
+
+TupleDesc GlobalTabDefCache::GetPgClassDescriptor()
+{
+ ResourceOwner owner = LOCAL_SYSDB_RESOWNER;
+ PthreadMutexLock(owner, m_catalog_lock, true);
+ if (m_pgclassdesc != NULL) {
+ PthreadMutexUnlock(owner, m_catalog_lock, true);
+ return m_pgclassdesc;
+ }
+ MemoryContext old = MemoryContextSwitchTo(m_db_entry->GetRandomMemCxt());
+ TupleDesc tmp = BuildHardcodedDescriptor(Natts_pg_class, Desc_pg_class, true);
+ PthreadMutexUnlock(owner, m_catalog_lock, true);
+ m_pgclassdesc = tmp;
+ MemoryContextSwitchTo(old);
+ return m_pgclassdesc;
+}
+
+TupleDesc GlobalTabDefCache::GetPgIndexDescriptor()
+{
+ ResourceOwner owner = LOCAL_SYSDB_RESOWNER;
+ PthreadMutexLock(owner, m_catalog_lock, true);
+ if (m_pgindexdesc != NULL) {
+ PthreadMutexUnlock(owner, m_catalog_lock, true);
+ return m_pgindexdesc;
+ }
+ MemoryContext old = MemoryContextSwitchTo(m_db_entry->GetRandomMemCxt());
+ TupleDesc tmp = BuildHardcodedDescriptor(Natts_pg_index, Desc_pg_index, false);
+ PthreadMutexUnlock(owner, m_catalog_lock, true);
+ m_pgindexdesc = tmp;
+ MemoryContextSwitchTo(old);
+ return m_pgindexdesc;
+}
+
+GlobalTabDefCache::GlobalTabDefCache(Oid db_id, bool is_shared, struct GlobalSysDBCacheEntry *entry)
+ : GlobalBaseDefCache(db_id, is_shared, entry, RELKIND_RELATION)
+{
+ m_pgclassdesc = NULL;
+ m_pgindexdesc = NULL;
+ m_catalog_lock = NULL;
+ m_is_inited = false;
+}
+
+List *GlobalTabDefCache::GetTableStats(Oid rel_oid)
+{
+ List *table_stat_list = NIL;
+ if (!m_is_inited) {
+ return table_stat_list;
+ }
+
+ /* Remove each tuple in this cache */
+ for (int hash_index = 0; hash_index < m_nbuckets; hash_index++) {
+ if (m_bucket_list.GetBucket(hash_index)->dll_len == 0) {
+ continue;
+ }
+ pthread_rwlock_t *obj_lock = &m_obj_locks[hash_index];
+ PthreadRWlockRdlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ for (Dlelem *elt = DLGetHead(m_bucket_list.GetBucket(hash_index)); elt;) {
+ GlobalRelationEntry *entry = (GlobalRelationEntry *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ if (rel_oid != ALL_REL_OID && entry->rel->rd_id != rel_oid) {
+ continue;
+ }
+ GlobalCatalogTableStat *table_stat = (GlobalCatalogTableStat*)palloc(sizeof(GlobalCatalogTableStat));
+ table_stat->db_id = m_db_oid;
+ table_stat->db_name = CStringGetTextDatum(m_db_entry->m_dbName);
+ table_stat->rel_id = entry->rel->rd_id;
+ table_stat->rd_rel = CopyRelationRdrel(entry->rel);
+ table_stat->rd_att = CopyTupleDesc(entry->rel->rd_att);
+ table_stat_list = lappend(table_stat_list, table_stat);
+ }
+ PthreadRWlockUnlock(LOCAL_SYSDB_RESOWNER, obj_lock);
+ }
+ return table_stat_list;
+}
+
+template void GlobalTabDefCache::ResetRelCaches();
+template void GlobalTabDefCache::ResetRelCaches();
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/knl_localbasedefcache.cpp b/src/common/backend/utils/cache/knl_localbasedefcache.cpp
new file mode 100644
index 000000000..9d1635d4d
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_localbasedefcache.cpp
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "utils/knl_localbasedefcache.h"
+#include "knl/knl_instance.h"
+#include "utils/knl_relcache.h"
+#include "utils/knl_catcache.h"
+#include "utils/knl_partcache.h"
+#include "utils/relmapper.h"
+#include "postmaster/autovacuum.h"
+#include "pgxc/bucketmap.h"
+
+LocalBaseEntry *LocalBaseDefCache::SearchEntryFromLocal(Oid oid, Index hash_index)
+{
+ for (Dlelem *elt = DLGetHead(m_bucket_list.GetBucket(hash_index)); elt != NULL; elt = DLGetSucc(elt)) {
+ LocalBaseEntry *entry = (LocalBaseEntry *)DLE_VAL(elt);
+ if (unlikely(entry->oid != oid)) {
+ continue;
+ }
+ DLMoveToFront(&entry->cache_elem);
+ return entry;
+ }
+ return NULL;
+}
+
+void LocalBaseDefCache::CreateDefBucket(size_t size)
+{
+ invalid_entries.Init();
+ m_nbuckets = ResizeHashBucket(size, g_instance.global_sysdbcache.dynamic_hash_bucket_strategy);
+ m_bucket_list.Init(m_nbuckets);
+}
+
+LocalBaseEntry *LocalBaseDefCache::CreateEntry(Index hash_index, size_t size)
+{
+ MemoryContext old = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
+ LocalBaseEntry *entry = (LocalBaseEntry *)palloc(size);
+ MemoryContextSwitchTo(old);
+ DLInitElem(&entry->cache_elem, (void *)entry);
+ m_bucket_list.AddHeadToBucket(hash_index, &entry->cache_elem);
+ return entry;
+}
+template
+void LocalBaseDefCache::RemoveTailDefElements()
+{
+ Index tail_index = m_bucket_list.GetTailBucketIndex();
+ if (unlikely(tail_index == INVALID_INDEX)) {
+ return;
+ }
+
+ int swapout_count_once = 0;
+ int max_swapout_count_once = m_bucket_list.GetBucket(tail_index)->dll_len >> 1;
+ for (Dlelem *elt = DLGetTail(m_bucket_list.GetBucket(tail_index)); elt != NULL;) {
+ Dlelem *tmp = elt;
+ elt = DLGetPred(elt);
+ if (is_relation) {
+ LocalRelationEntry *entry = (LocalRelationEntry *)DLE_VAL(tmp);
+ /* dont remove rel created by current transaction or temp table */
+ if (RelationHasReferenceCountZero(entry->rel) && entry->rel->rd_createSubid == InvalidSubTransactionId &&
+ entry->rel->rd_newRelfilenodeSubid == InvalidSubTransactionId) {
+ Assert(!entry->rel->rd_isnailed);
+ Assert(entry->rel->entry == entry);
+ /* clear call remove relation */
+ RelationClearRelation(entry->rel, false);
+ swapout_count_once++;
+ } else {
+ DLMoveToFront(&entry->cache_elem);
+ /* lsc do lru strategy, so the front of this entry are all refered probably, just break */
+ break;
+ }
+ } else {
+ LocalPartitionEntry *entry = (LocalPartitionEntry *)DLE_VAL(tmp);
+ /* dont remove part created by current transaction or temp table */
+ if (PartitionHasReferenceCountZero(entry->part) &&
+ entry->part->pd_newRelfilenodeSubid == InvalidSubTransactionId &&
+ entry->part->pd_createSubid == InvalidSubTransactionId) {
+ Assert(entry->part->entry == entry);
+ /* clear call remove partation */
+ PartitionClearPartition(entry->part, false);
+ swapout_count_once++;
+ } else {
+ DLMoveToFront(&entry->cache_elem);
+ /* lsc do lru strategy, so the front of this entry are all refered probably, just break */
+ break;
+ }
+ }
+
+ /* keep elements as many as possible */
+ if (swapout_count_once == max_swapout_count_once) {
+ break;
+ }
+ }
+
+ if (!DLIsNIL(m_bucket_list.GetBucket(tail_index))) {
+ m_bucket_list.MoveBucketToHead(tail_index);
+ }
+}
+
+template void LocalBaseDefCache::RemoveTailDefElements();
+template void LocalBaseDefCache::RemoveTailDefElements();
diff --git a/src/common/backend/utils/cache/knl_localpartdefcache.cpp b/src/common/backend/utils/cache/knl_localpartdefcache.cpp
new file mode 100644
index 000000000..a54bd21a3
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_localpartdefcache.cpp
@@ -0,0 +1,459 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "access/xact.h"
+#include "knl/knl_instance.h"
+#include "storage/smgr/smgr.h"
+#include "utils/knl_catcache.h"
+#include "utils/knl_localtabdefcache.h"
+#include "utils/knl_partcache.h"
+#include "utils/memutils.h"
+#include "utils/rel_gs.h"
+#include "utils/resowner.h"
+#include "utils/snapmgr.h"
+
+static bool IsPartitionStoreInglobal(Partition part);
+LocalPartDefCache::LocalPartDefCache()
+{
+ ResetInitFlag();
+}
+
+Partition LocalPartDefCache::SearchPartitionFromLocal(Oid part_oid)
+{
+ if (unlikely(!m_is_inited)) {
+ return NULL;
+ }
+ uint32 hash_value = oid_hash((void *)&(part_oid), sizeof(Oid));
+ Index hash_index = HASH_INDEX(hash_value, (uint32)m_nbuckets);
+ LocalPartitionEntry *entry = (LocalPartitionEntry *)LocalBaseDefCache::SearchEntryFromLocal(part_oid, hash_index);
+ if (unlikely(entry == NULL)) {
+ return NULL;
+ }
+ return entry->part;
+}
+
+static inline void SpecialWorkForLocalPart(Partition part)
+{
+ if (part->pd_part->parentid != InvalidOid || part->pd_part->relfilenode != InvalidOid) {
+ PartitionInitPhysicalAddr(part);
+ }
+}
+
+void LocalPartDefCache::CopyLocalPartition(Partition dest, Partition src)
+{
+ CopyPartitionData(dest, src);
+ SpecialWorkForLocalPart(dest);
+}
+
+template
+Partition LocalPartDefCache::SearchPartitionFromGlobalCopy(Oid part_oid)
+{
+ if (unlikely(!m_is_inited)) {
+ return NULL;
+ }
+ if (invalid_entries.ExistDefValue(part_oid)) {
+ return NULL;
+ }
+ if (HistoricSnapshotActive()) {
+ return NULL;
+ }
+
+ if (!g_instance.global_sysdbcache.hot_standby) {
+ return NULL;
+ }
+ if (unlikely(!g_instance.global_sysdbcache.recovery_finished)) {
+ return NULL;
+ }
+ uint32 hash_value = oid_hash((void *)&(part_oid), sizeof(Oid));
+ ResourceOwnerEnlargeGlobalBaseEntry(LOCAL_SYSDB_RESOWNER);
+ GlobalPartitionEntry *global = (GlobalPartitionEntry *)m_global_partdefcache->SearchReadOnly(part_oid, hash_value);
+ if (global == NULL) {
+ return NULL;
+ }
+ ResourceOwnerRememberGlobalBaseEntry(LOCAL_SYSDB_RESOWNER, global);
+
+ MemoryContext old = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
+ Partition copy = (Partition)palloc(sizeof(PartitionData));
+ CopyLocalPartition(copy, global->part);
+ MemoryContextSwitchTo(old);
+
+ ResourceOwnerForgetGlobalBaseEntry(LOCAL_SYSDB_RESOWNER, global);
+ global->Release();
+ if (insert_into_local) {
+ Index hash_index = HASH_INDEX(hash_value, (uint32)m_nbuckets);
+ RemovePartitionByOid(part_oid, hash_index);
+ CreateLocalPartEntry(copy, hash_index);
+ }
+ return copy;
+}
+
+template Partition LocalPartDefCache::SearchPartitionFromGlobalCopy(Oid part_id);
+template Partition LocalPartDefCache::SearchPartitionFromGlobalCopy(Oid part_id);
+
+Partition LocalPartDefCache::SearchPartition(Oid part_oid)
+{
+ if (unlikely(!m_is_inited)) {
+ return NULL;
+ }
+ Partition local = SearchPartitionFromLocal(part_oid);
+ if (likely(local != NULL || IsBootstrapProcessingMode())) {
+ return local;
+ }
+ return SearchPartitionFromGlobalCopy(part_oid);
+}
+
+void LocalPartDefCache::RemovePartition(Partition part)
+{
+ m_bucket_list.RemoveElemFromBucket(&part->entry->cache_elem);
+ pfree_ext(part->entry);
+}
+
+void LocalPartDefCache::CreateLocalPartEntry(Partition part, Index hash_index)
+{
+ if (t_thrd.lsc_cxt.lsc->LocalSysDBCacheNeedSwapOut()) {
+ LocalBaseDefCache::RemoveTailDefElements();
+ }
+ LocalPartitionEntry *entry =
+ (LocalPartitionEntry *)LocalBaseDefCache::CreateEntry(hash_index, sizeof(LocalPartitionEntry));
+ entry->part = part;
+ entry->oid = part->pd_id;
+ entry->obj_is_nailed = false;
+ part->entry = entry;
+}
+
+void LocalPartDefCache::InsertPartitionIntoLocal(Partition part)
+{
+ uint32 hash_value = oid_hash((void *)&(part->pd_id), sizeof(Oid));
+ Index hash_index = HASH_INDEX(hash_value, (uint32)m_nbuckets);
+ CreateLocalPartEntry(part, hash_index);
+}
+
+static bool IsPartOidStoreInGlobal(Oid part_oid)
+{
+ if (unlikely(IsBootstrapProcessingMode())) {
+ return false;
+ }
+ if (unlikely(t_thrd.lsc_cxt.lsc->GetThreadDefExclusive())) {
+ return false;
+ }
+
+ if (unlikely(t_thrd.lsc_cxt.lsc->partdefcache.invalid_entries.ExistDefValue(part_oid))) {
+ return false;
+ }
+
+ if (unlikely(u_sess->attr.attr_common.IsInplaceUpgrade)) {
+ return false;
+ }
+
+ if (HistoricSnapshotActive()) {
+ return false;
+ }
+
+ if (!g_instance.global_sysdbcache.hot_standby) {
+ return false;
+ }
+ if (unlikely(!g_instance.global_sysdbcache.recovery_finished)) {
+ return false;
+ }
+ if (g_instance.global_sysdbcache.StopInsertGSC()) {
+ return false;
+ }
+ return true;
+}
+
+static bool IsPartitionStoreInglobal(Partition part)
+{
+ Assert(part->pd_createSubid == InvalidSubTransactionId);
+ Assert(part->pd_newRelfilenodeSubid == InvalidSubTransactionId);
+ Assert(part->pd_isvalid);
+
+ return true;
+}
+
+void LocalPartDefCache::InsertPartitionIntoGlobal(Partition part, uint32 hash_value)
+{
+ if (!IsPartitionStoreInglobal(part)) {
+ return;
+ }
+ /* when insert, we must make sure m_global_shared_tabdefcache is inited at least */
+ Assert(m_global_partdefcache != NULL);
+ m_global_partdefcache->Insert(part, hash_value);
+}
+
+Partition LocalPartDefCache::RemovePartitionByOid(Oid part_oid, Index hash_index)
+{
+ LocalPartitionEntry *entry = (LocalPartitionEntry *)LocalBaseDefCache::SearchEntryFromLocal(part_oid, hash_index);
+ if (entry == NULL) {
+ return NULL;
+ }
+ Partition old_part = entry->part;
+ RemovePartition(entry->part);
+ return old_part;
+}
+
+void LocalPartDefCache::Init()
+{
+ if (m_is_inited) {
+ return;
+ }
+ m_global_partdefcache = t_thrd.lsc_cxt.lsc->GetGlobalPartDefCache();
+ m_db_id = t_thrd.lsc_cxt.lsc->my_database_id;
+ part_cache_need_eoxact_work = false;
+ m_is_inited = true;
+}
+
+void LocalPartDefCache::InvalidateGlobalPartition(Oid db_id, Oid part_oid, bool is_commit)
+{
+ if (!is_commit) {
+ invalid_entries.InsertInvalidDefValue(part_oid);
+ return;
+ }
+ Assert(db_id != InvalidOid);
+ Assert(CheckMyDatabaseMatch());
+ if (m_global_partdefcache == NULL) {
+ Assert(!m_is_inited);
+ GlobalSysDBCacheEntry *entry = g_instance.global_sysdbcache.FindTempGSCEntry(db_id);
+ if (entry == NULL) {
+ return;
+ }
+ entry->m_partdefCache->Invalidate(db_id, part_oid);
+ g_instance.global_sysdbcache.ReleaseTempGSCEntry(entry);
+ } else {
+ Assert(db_id == t_thrd.lsc_cxt.lsc->my_database_id);
+ m_global_partdefcache->Invalidate(db_id, part_oid);
+ }
+}
+
+void LocalPartDefCache::InvalidateAll(void)
+{
+ if (unlikely(!m_is_inited)) {
+ return;
+ }
+ List *rebuildList = NIL;
+ Dlelem *bucket_elt;
+ forloopactivebucketlist(bucket_elt, m_bucket_list.GetActiveBucketList()) {
+ Dlelem *elt;
+ forloopbucket(elt, bucket_elt) {
+ LocalPartitionEntry *entry = (LocalPartitionEntry *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ Partition part = entry->part;
+ Assert(part->entry == entry);
+
+ /* Must close all smgr references to avoid leaving dangling ptrs */
+ PartitionCloseSmgr(part);
+
+ /* Ignore new relations, since they are never cross-backend targets */
+ if (part->pd_createSubid != InvalidSubTransactionId)
+ continue;
+
+ if (PartitionHasReferenceCountZero(part)) {
+ /* Delete this entry immediately */
+ PartitionClearPartition(part, false);
+ } else {
+ rebuildList = lappend(rebuildList, part);
+ }
+ }
+ }
+
+ /*
+ * Now zap any remaining smgr cache entries. This must happen before we
+ * start to rebuild entries, since that may involve catalog fetches which
+ * will re-open catalog files.
+ */
+ smgrcloseall();
+
+ ListCell *l = NULL;
+ /* Phase 2: rebuild the items found to need rebuild in phase 1 */
+ foreach (l, rebuildList) {
+ Partition part = (Partition)lfirst(l);
+ PartitionClearPartition(part, true);
+ }
+ list_free_ext(rebuildList);
+}
+
+void LocalPartDefCache::AtEOXact_PartitionCache(bool isCommit)
+{
+ invalid_entries.ResetInitFlag();
+ /*
+ * To speed up transaction exit, we want to avoid scanning the partitioncache
+ * unless there is actually something for this routine to do. Other than
+ * the debug-only Assert checks, most transactions don't create any work
+ * for us to do here, so we keep a static flag that gets set if there is
+ * anything to do. (Currently, this means either a partition is created in
+ * the current xact, or one is given a new relfilenode, or an index list
+ * is forced.) For simplicity, the flag remains set till end of top-level
+ * transaction, even though we could clear it at subtransaction end in
+ * some cases.
+ */
+ if (!part_cache_need_eoxact_work
+#ifdef USE_ASSERT_CHECKING
+ && !assert_enabled
+#endif
+ ) {
+ return;
+ }
+
+ Dlelem *bucket_elt;
+ forloopactivebucketlist(bucket_elt, m_bucket_list.GetActiveBucketList()) {
+ Dlelem *elt;
+ forloopbucket(elt, bucket_elt) {
+ LocalPartitionEntry *entry = (LocalPartitionEntry *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ Partition part = entry->part;
+
+ /*
+ * The relcache entry's ref count should be back to its normal
+ * not-in-a-transaction state: 0 unless it's nailed in cache.
+ *
+ * In bootstrap mode, this is NOT true, so don't check it --- the
+ * bootstrap code expects relations to stay open across start/commit
+ * transaction calls. (That seems bogus, but it's not worth fixing.)
+ */
+#ifdef USE_ASSERT_CHECKING
+ if (!IsBootstrapProcessingMode()) {
+ const int expected_refcnt = 0;
+ Assert(part->pd_refcnt == expected_refcnt);
+ }
+#endif
+
+ /*
+ * Is it a partition created in the current transaction?
+ *
+ * During commit, reset the flag to zero, since we are now out of the
+ * creating transaction. During abort, simply delete the relcache
+ * entry --- it isn't interesting any longer. (NOTE: if we have
+ * forgotten the new-ness of a new relation due to a forced cache
+ * flush, the entry will get deleted anyway by shared-cache-inval
+ * processing of the aborted pg_class insertion.)
+ */
+ if (part->pd_createSubid != InvalidSubTransactionId) {
+ if (isCommit) {
+ part->pd_createSubid = InvalidSubTransactionId;
+ } else {
+ PartitionClearPartition(part, false);
+ continue;
+ }
+ }
+
+ /*
+ * Likewise, reset the hint about the relfilenode being new.
+ */
+ part->pd_newRelfilenodeSubid = InvalidSubTransactionId;
+ }
+ }
+
+ /* Once done with the transaction, we can reset need_eoxact_work */
+ part_cache_need_eoxact_work = false;
+}
+
+void LocalPartDefCache::AtEOSubXact_PartitionCache(bool isCommit, SubTransactionId mySubid,
+ SubTransactionId parentSubid)
+{
+ /*
+ * Skip the relcache scan if nothing to do --- see notes for
+ * AtEOXact_PartitionCache.
+ */
+ if (!part_cache_need_eoxact_work)
+ return;
+
+ Dlelem *bucket_elt;
+ forloopactivebucketlist(bucket_elt, m_bucket_list.GetActiveBucketList()) {
+ Dlelem *elt;
+ forloopbucket(elt, bucket_elt) {
+ LocalPartitionEntry *entry = (LocalPartitionEntry *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ Partition part = entry->part;
+
+ /*
+ * Is it a partition created in the current subtransaction?
+ *
+ * During subcommit, mark it as belonging to the parent, instead.
+ * During subabort, simply delete the partition entry.
+ */
+ if (part->pd_createSubid == mySubid) {
+ if (isCommit)
+ part->pd_createSubid = parentSubid;
+ else {
+ PartitionClearPartition(part, false);
+ continue;
+ }
+ }
+
+ /*
+ * Likewise, update or drop any new-relfilenode-in-subtransaction
+ * hint.
+ */
+ if (part->pd_newRelfilenodeSubid == mySubid) {
+ if (isCommit)
+ part->pd_newRelfilenodeSubid = parentSubid;
+ else
+ part->pd_newRelfilenodeSubid = InvalidSubTransactionId;
+ }
+ }
+ }
+}
+
+Partition LocalPartDefCache::PartitionIdGetPartition(Oid part_oid, StorageType storage_type)
+{
+ Partition pd;
+ /*
+ * first try to find reldesc in the cache
+ */
+ pd = SearchPartition(part_oid);
+ if (PartitionIsValid(pd)) {
+ PartitionIncrementReferenceCount(pd);
+ /* revalidate cache entry if necessary */
+ if (!pd->pd_isvalid) {
+ /*
+ * Indexes only have a limited number of possible schema changes,
+ * and we don't want to use the full-blown procedure because it's
+ * a headache for indexes that reload itself depends on.
+ */
+ if (pd->pd_part->parttype == PART_OBJ_TYPE_INDEX_PARTITION) {
+ PartitionReloadIndexInfo(pd);
+ } else {
+ PartitionClearPartition(pd, true);
+ }
+ }
+ return pd;
+ }
+
+ /*
+ * no partdesc in the cache, so have PartitionBuildDesc() build one and add
+ * it.
+ */
+ bool is_oid_store_in_global = IsPartOidStoreInGlobal(part_oid);
+ bool has_concurrent_lock = is_oid_store_in_global;
+ uint32 hash_value = oid_hash((void *)&(part_oid), sizeof(Oid));
+ pthread_rwlock_t *oid_lock = NULL;
+ if (has_concurrent_lock) {
+ oid_lock = m_global_partdefcache->GetHashValueLock(hash_value);
+ AcquireGSCTableReadLock(&has_concurrent_lock, oid_lock);
+ }
+ pd = PartitionBuildDesc(part_oid, storage_type, true);
+ if (PartitionIsValid(pd) && is_oid_store_in_global && has_concurrent_lock) {
+ InsertPartitionIntoGlobal(pd, hash_value);
+ }
+ if (has_concurrent_lock) {
+ ReleaseGSCTableReadLock(&has_concurrent_lock, oid_lock);
+ }
+
+ if (PartitionIsValid(pd)) {
+ PartitionIncrementReferenceCount(pd);
+ }
+
+ return pd;
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/knl_localsysdbcache.cpp b/src/common/backend/utils/cache/knl_localsysdbcache.cpp
new file mode 100644
index 000000000..aa58fdc8a
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_localsysdbcache.cpp
@@ -0,0 +1,1072 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "utils/knl_localsysdbcache.h"
+#include "utils/knl_globalsysdbcache.h"
+#include "utils/resowner.h"
+#include "knl/knl_instance.h"
+#include "executor/executor.h"
+#include "utils/postinit.h"
+#include "storage/sinvaladt.h"
+#include "utils/hashutils.h"
+#include "utils/knl_relcache.h"
+#include "utils/acl.h"
+#include "utils/spccache.h"
+#include "commands/dbcommands.h"
+#include "tsearch/ts_cache.h"
+#include "optimizer/predtest.h"
+#include "utils/attoptcache.h"
+#include "parser/parse_oper.h"
+#include "utils/typcache.h"
+#include "utils/relfilenodemap.h"
+#include "postmaster/bgworker.h"
+#include "storage/lmgr.h"
+#ifdef USE_ASSERT_CHECKING
+class LSCCloseCheck {
+public:
+ LSCCloseCheck()
+ {
+ m_lsc_closed = true;
+ }
+ ~LSCCloseCheck()
+ {
+ Assert(!EnableGlobalSysCache() || m_lsc_closed || g_instance.distribute_test_param_instance->elevel == PANIC);
+ }
+ void setCloseFlag(bool value)
+ {
+ m_lsc_closed = value;
+ }
+private:
+ bool m_lsc_closed;
+};
+thread_local LSCCloseCheck lsc_close_check = LSCCloseCheck();
+#endif
+
+void ReLoadLSCWhenWaitMission()
+{
+ if (!EnableLocalSysCache()) {
+ return;
+ }
+ LocalSysDBCache *lsc = t_thrd.lsc_cxt.lsc;
+ if (unlikely(lsc == NULL)) {
+ return;
+ }
+ if (lsc->GetMyGlobalDBEntry() != NULL && lsc->GetMyGlobalDBEntry()->m_isDead) {
+ t_thrd.proc_cxt.PostInit->InitLoadLocalSysCache(u_sess->proc_cxt.MyDatabaseId,
+ u_sess->proc_cxt.MyProcPort->database_name);
+ }
+ g_instance.global_sysdbcache.GSCMemThresholdCheck();
+}
+
+void RememberRelSonMemCxtSpace(Relation rel)
+{
+ if (rel->rd_rulescxt != NULL) {
+ t_thrd.lsc_cxt.lsc->rel_index_rule_space += ((AllocSet)rel->rd_rulescxt)->totalSpace;
+ }
+ if (rel->rd_indexcxt != NULL) {
+ t_thrd.lsc_cxt.lsc->rel_index_rule_space += ((AllocSet)rel->rd_indexcxt)->totalSpace;
+ }
+}
+void ForgetRelSonMemCxtSpace(Relation rel)
+{
+ if (rel->rd_rulescxt != NULL) {
+ t_thrd.lsc_cxt.lsc->rel_index_rule_space -= ((AllocSet)rel->rd_rulescxt)->totalSpace;
+ }
+ if (rel->rd_indexcxt != NULL) {
+ t_thrd.lsc_cxt.lsc->rel_index_rule_space -= ((AllocSet)rel->rd_indexcxt)->totalSpace;
+ }
+ if (t_thrd.lsc_cxt.lsc->rel_index_rule_space < 0) {
+ t_thrd.lsc_cxt.lsc->rel_index_rule_space = 0;
+ }
+}
+
+/* call all access dbid after initsession */
+bool CheckMyDatabaseMatch()
+{
+ if (EnableLocalSysCache()) {
+ return u_sess->proc_cxt.MyDatabaseId == InvalidOid ||
+ u_sess->proc_cxt.MyDatabaseId == t_thrd.lsc_cxt.lsc->my_database_id;
+ } else {
+ return true;
+ }
+}
+char *GetMyDatabasePath()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->my_database_path;
+ } else {
+ return u_sess->proc_cxt.DatabasePath;
+ }
+}
+Oid GetMyDatabaseId()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->my_database_id;
+ } else {
+ return u_sess->proc_cxt.MyDatabaseId;
+ }
+}
+Oid GetMyDatabaseTableSpace()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->my_database_tablespace;
+ } else {
+ return u_sess->proc_cxt.MyDatabaseTableSpace;
+ }
+}
+
+bool IsGotPoolReload()
+{
+ if (EnableLocalSysCache()) {
+ return u_sess->sig_cxt.got_pool_reload || t_thrd.lsc_cxt.lsc->got_pool_reload;
+ } else {
+ return u_sess->sig_cxt.got_pool_reload;
+ }
+}
+void ResetGotPoolReload(bool value)
+{
+ if (EnableLocalSysCache()) {
+ u_sess->sig_cxt.got_pool_reload = value;
+ t_thrd.lsc_cxt.lsc->got_pool_reload = value;
+ } else {
+ u_sess->sig_cxt.got_pool_reload = value;
+ }
+}
+
+bool DeepthInAcceptInvalidationMessageNotZero()
+{
+ if (EnableLocalSysCache()) {
+ return u_sess->inval_cxt.DeepthInAcceptInvalidationMessage > 0 ||
+ t_thrd.lsc_cxt.lsc->inval_cxt.DeepthInAcceptInvalidationMessage > 0;
+ } else {
+ return u_sess->inval_cxt.DeepthInAcceptInvalidationMessage > 0;
+ }
+}
+void ResetDeepthInAcceptInvalidationMessage(int value)
+{
+ if (EnableLocalSysCache()) {
+ u_sess->inval_cxt.DeepthInAcceptInvalidationMessage = value;
+ t_thrd.lsc_cxt.lsc->inval_cxt.DeepthInAcceptInvalidationMessage = value;
+ } else {
+ u_sess->inval_cxt.DeepthInAcceptInvalidationMessage = value;
+ }
+}
+
+static bool SwitchToSessionSysCache()
+{
+ if (
+#ifdef ENABLE_MULTIPLE_NODES
+ /* ts code dont use gsc */
+ t_thrd.role != TS_COMPACTION &&
+ t_thrd.role != TS_COMPACTION_CONSUMER &&
+ t_thrd.role != TS_COMPACTION_AUXILIAY
+#else
+ true
+#endif
+ ) {
+ return false;
+ }
+ return true;
+}
+
+/* after call close, you should never use syscache before rebuild it */
+void CloseLocalSysDBCache()
+{
+ if (!EnableLocalSysCache()) {
+ closeAllVfds();
+ }
+ if (t_thrd.lsc_cxt.lsc == NULL) {
+ return;
+ }
+ t_thrd.lsc_cxt.lsc->CloseLocalSysDBCache();
+}
+
+static inline HeapTuple GetTupleFromLscCatList(CatCList *cl, int index)
+{
+ Assert(EnableLocalSysCache());
+ return &(((GlobalCatCTup **)cl->systups)[index]->tuple);
+}
+
+static inline HeapTuple GetTupleFromSessCatList(CatCList *cl, int index)
+{
+ Assert(!EnableLocalSysCache());
+ return &(cl->systups[index]->tuple);
+}
+
+void CreateLocalSysDBCache()
+{
+ /* every thread should call this func once */
+ if (!EnableGlobalSysCache()) {
+ t_thrd.lsc_cxt.enable_lsc = false;
+ t_thrd.lsc_cxt.FetchTupleFromCatCList = GetTupleFromSessCatList;
+ return;
+ }
+
+ Assert(t_thrd.lsc_cxt.lsc == NULL);
+ t_thrd.lsc_cxt.lsc = New(THREAD_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_DEFAULT))LocalSysDBCache();
+ /* use this object to invalid gsc, only work with timeseries worker */
+ t_thrd.lsc_cxt.lsc->CreateDBObject();
+ t_thrd.lsc_cxt.FetchTupleFromCatCList = GetTupleFromLscCatList;
+ t_thrd.lsc_cxt.lsc->recovery_finished = g_instance.global_sysdbcache.recovery_finished;
+ t_thrd.lsc_cxt.enable_lsc = !SwitchToSessionSysCache();
+ if (!t_thrd.lsc_cxt.enable_lsc) {
+ t_thrd.lsc_cxt.FetchTupleFromCatCList = GetTupleFromSessCatList;
+ t_thrd.lsc_cxt.lsc->is_closed = true;
+#ifdef USE_ASSERT_CHECKING
+ lsc_close_check.setCloseFlag(true);
+#endif
+ } else {
+#ifdef USE_ASSERT_CHECKING
+ lsc_close_check.setCloseFlag(false);
+#endif
+ }
+}
+static void ReleaseBadPtrList(bool isCommit);
+static void ThreadNodeGroupCallback(Datum arg, int cacheid, uint32 hashvalue)
+{
+ RelationCacheInvalidateBuckets();
+}
+
+bool EnableGlobalSysCache()
+{
+ return g_instance.attr.attr_common.enable_global_syscache;
+}
+
+MemoryContext LocalSharedCacheMemCxt()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->lsc_share_memcxt;
+ } else {
+ return u_sess->cache_mem_cxt;
+ }
+}
+
+MemoryContext LocalMyDBCacheMemCxt()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->lsc_mydb_memcxt;
+ } else {
+ return u_sess->cache_mem_cxt;
+ }
+}
+
+extern MemoryContext LocalGBucketMapMemCxt()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->lsc_mydb_memcxt;
+ } else {
+ return SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_EXECUTOR);
+ }
+}
+
+MemoryContext LocalSmgrStorageMemoryCxt()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->lsc_mydb_memcxt;
+ } else {
+ return SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_STORAGE);
+ }
+}
+
+struct HTAB *GetTypeCacheHash()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->TypeCacheHash;
+ } else {
+ return u_sess->tycache_cxt.TypeCacheHash;
+ }
+}
+
+knl_u_inval_context *GetInvalCxt()
+{
+ if (EnableLocalSysCache()) {
+ return &t_thrd.lsc_cxt.lsc->inval_cxt;
+ } else {
+ return &u_sess->inval_cxt;
+ }
+}
+
+void UnRegisterSysCacheCallBack(knl_u_inval_context *inval_cxt, int cacheid, SyscacheCallbackFunction func)
+{
+ for (int i = 0; i < inval_cxt->syscache_callback_count; i++) {
+ if (inval_cxt->syscache_callback_list[i].id != cacheid ||
+ inval_cxt->syscache_callback_list[i].function != func) {
+ continue;
+ }
+ for (; i < inval_cxt->syscache_callback_count - 1; i++) {
+ inval_cxt->syscache_callback_list[i].id = inval_cxt->syscache_callback_list[i + 1].id;
+ inval_cxt->syscache_callback_list[i].function = inval_cxt->syscache_callback_list[i + 1].function;
+ inval_cxt->syscache_callback_list[i].arg = inval_cxt->syscache_callback_list[i + 1].arg;
+ }
+ --inval_cxt->syscache_callback_count;
+ break;
+ }
+}
+
+void UnRegisterRelCacheCallBack(knl_u_inval_context *inval_cxt, RelcacheCallbackFunction func)
+{
+ for (int i = 0; i < inval_cxt->relcache_callback_count; i++) {
+ if (inval_cxt->relcache_callback_list[i].function != func) {
+ continue;
+ }
+ for (; i < inval_cxt->relcache_callback_count - 1; i++) {
+ inval_cxt->relcache_callback_list[i].function = inval_cxt->relcache_callback_list[i + 1].function;
+ inval_cxt->relcache_callback_list[i].arg = inval_cxt->relcache_callback_list[i + 1].arg;
+ }
+ --inval_cxt->relcache_callback_count;
+ break;
+ }
+}
+
+void UnRegisterPartCacheCallBack(knl_u_inval_context *inval_cxt, PartcacheCallbackFunction func)
+{
+ for (int i = 0; i < inval_cxt->partcache_callback_count; i++) {
+ if (inval_cxt->partcache_callback_list[i].function != func) {
+ continue;
+ }
+ for (; i < inval_cxt->partcache_callback_count - 1; i++) {
+ inval_cxt->partcache_callback_list[i].function = inval_cxt->partcache_callback_list[i + 1].function;
+ inval_cxt->partcache_callback_list[i].arg = inval_cxt->partcache_callback_list[i + 1].arg;
+ }
+ --inval_cxt->partcache_callback_count;
+ break;
+ }
+}
+
+static void ClearMyDBOfRelMapCxt(knl_u_relmap_context *relmap_cxt)
+{
+ relmap_cxt->local_map->magic = 0;
+ relmap_cxt->local_map->num_mappings = 0;
+ relmap_cxt->active_shared_updates->num_mappings = 0;
+ relmap_cxt->active_local_updates->num_mappings = 0;
+ relmap_cxt->pending_shared_updates->num_mappings = 0;
+ relmap_cxt->pending_local_updates->num_mappings = 0;
+
+ /* since clear when switchdb, just set their memcxt lsc_mydb_cxt */
+ relmap_cxt->RelfilenodeMapHash = NULL;
+ relmap_cxt->UHeapRelfilenodeMapHash = NULL;
+}
+
+struct HTAB *GetTableSpaceCacheHash()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->TableSpaceCacheHash;
+ } else {
+ return u_sess->cache_cxt.TableSpaceCacheHash;
+ }
+}
+
+struct HTAB *GetSMgrRelationHash()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->SMgrRelationHash;
+ } else {
+ return u_sess->storage_cxt.SMgrRelationHash;
+ }
+}
+
+struct vfd *GetVfdCache()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->VfdCache;
+ } else {
+ return u_sess->storage_cxt.VfdCache;
+ }
+}
+
+struct vfd **GetVfdCachePtr()
+{
+ if (EnableLocalSysCache()) {
+ return &t_thrd.lsc_cxt.lsc->VfdCache;
+ } else {
+ return &u_sess->storage_cxt.VfdCache;
+ }
+}
+
+void SetVfdCache(vfd *value)
+{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->VfdCache = value;
+ } else {
+ u_sess->storage_cxt.VfdCache = value;
+ }
+}
+
+void SetSizeVfdCache(Size value)
+{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->SizeVfdCache = value;
+ } else {
+ u_sess->storage_cxt.SizeVfdCache = value;
+ }
+}
+
+Size GetSizeVfdCache()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->SizeVfdCache;
+ } else {
+ return u_sess->storage_cxt.SizeVfdCache;
+ }
+}
+
+Size *GetSizeVfdCachePtr()
+{
+ if (EnableLocalSysCache()) {
+ return &t_thrd.lsc_cxt.lsc->SizeVfdCache;
+ } else {
+ return &u_sess->storage_cxt.SizeVfdCache;
+ }
+}
+
+
+int GetVfdNfile()
+{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->nfile;
+ } else {
+ return u_sess->storage_cxt.nfile;
+ }
+}
+void AddVfdNfile(int n)
+{
+ Assert(n == 1 || n == -1);
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->nfile += n;
+ } else {
+ u_sess->storage_cxt.nfile += n;
+ }
+}
+
+dlist_head *getUnownedReln()
+{
+ if (EnableLocalSysCache()) {
+ return &t_thrd.lsc_cxt.lsc->unowned_reln;
+ } else {
+ return &u_sess->storage_cxt.unowned_reln;
+ }
+}
+
+knl_u_relmap_context *GetRelMapCxt()
+{
+ if (EnableLocalSysCache()) {
+ return &t_thrd.lsc_cxt.lsc->relmap_cxt;
+ } else {
+ return &u_sess->relmap_cxt;
+ }
+}
+
+void LocalSysDBCache::LocalSysDBCacheReleaseGlobalReSource(bool is_commit)
+{
+ ResourceOwnerReleaseRWLock(local_sysdb_resowner, is_commit);
+ ResourceOwnerReleaseGlobalCatCList(local_sysdb_resowner, is_commit);
+ ResourceOwnerReleaseGlobalCatCTup(local_sysdb_resowner, is_commit);
+ ResourceOwnerReleaseGlobalBaseEntry(local_sysdb_resowner, is_commit);
+ ResourceOwnerReleaseGlobalDBEntry(local_sysdb_resowner, is_commit);
+ ResourceOwnerReleaseGlobalIsExclusive(local_sysdb_resowner, is_commit);
+}
+
+void LocalSysDBCache::LocalSysDBCacheReleaseCritialReSource(bool include_shared)
+{
+ closeAllVfds();
+ LocalSysDBCacheReleaseGlobalReSource(false);
+ ReleaseBadPtrList(false);
+
+ systabcache.ReleaseGlobalRefcount(include_shared);
+ if (m_global_db != NULL) {
+ m_global_db->Release();
+ m_global_db = NULL;
+ }
+
+ rdlock_info.count = 0;
+
+ tabdefcache.ResetInitFlag();
+ partdefcache.ResetInitFlag();
+ systabcache.ResetInitFlag(include_shared);
+
+ /* not zero when ereport error on searching */
+ SetThreadDefExclusive(IS_THREAD_POOL_STREAM || IsBgWorkerProcess());
+}
+
+/* switch db, alter db */
+bool LocalSysDBCache::LocalSysDBCacheNeedClearMyDB(Oid db_id, const char *db_name)
+{
+ if (likely(db_name != NULL && db_id == InvalidOid)) {
+ if (strcmp(my_database_name, db_name) != 0) {
+ return true;
+ }
+ } else if (unlikely(db_name == NULL && db_id != InvalidOid)) {
+ if (my_database_id != db_id) {
+ return true;
+ }
+ } else if (unlikely(db_name != NULL && db_id != InvalidOid)) {
+ if (strcmp(my_database_name, db_name) != 0 || my_database_id != db_id) {
+ return true;
+ }
+ } else {
+ return true;
+ Assert(t_thrd.role == AUTOVACUUM_LAUNCHER || t_thrd.role == UNDO_LAUNCHER || t_thrd.role == CATCHUP ||
+ (IsBootstrapProcessingMode() &&
+ t_thrd.role == MASTER_THREAD &&
+ strcmp(t_thrd.proc_cxt.MyProgName, "BootStrap") == 0
+ ));
+ }
+
+ /* cache hit, when initsession, we lock db to avoid alter db */
+ Oid old_db_id = t_thrd.proc->databaseId;
+ if (u_sess->proc_cxt.MyDatabaseId == InvalidOid && IS_THREAD_POOL_WORKER) {
+ LockSharedObject(DatabaseRelationId, my_database_id, 0, RowExclusiveLock);
+ t_thrd.proc->databaseId = my_database_id;
+ UnlockSharedObject(DatabaseRelationId, my_database_id, 0, RowExclusiveLock);
+ }
+ Assert(m_global_db != NULL);
+ if (m_global_db->m_isDead) {
+ t_thrd.proc->databaseId = old_db_id;
+ return true;
+ }
+ return false;
+}
+
+/* clear cache of mydb memcxt */
+void LocalSysDBCache::LocalSysDBCacheClearMyDB(Oid db_id, const char *db_name)
+{
+ LocalSysDBCacheReleaseCritialReSource(false);
+
+ TypeCacheHash = NULL;
+ SMgrRelationHash = NULL;
+ VfdCache = NULL;
+ SizeVfdCache = 0;
+ Assert(nfile == 0);
+ nfile = 0;
+
+ my_database_id = InvalidOid;
+ my_database_tablespace = InvalidOid;
+ my_database_name[0] = '\0';
+ dlist_init(&unowned_reln);
+ pfree_ext(my_database_path);
+ ClearMyDBOfRelMapCxt(&relmap_cxt);
+ UnRegisterRelCacheCallBack(&inval_cxt, TypeCacheRelCallback);
+ UnRegisterRelCacheCallBack(&inval_cxt, RelfilenodeMapInvalidateCallback);
+ UnRegisterRelCacheCallBack(&inval_cxt, UHeapRelfilenodeMapInvalidateCallback);
+ MemoryContextResetAndDeleteChildren(lsc_mydb_memcxt);
+
+ is_inited = false;
+ other_space = ((AllocSet)lsc_top_memcxt)->totalSpace + ((AllocSet)lsc_share_memcxt)->totalSpace;
+ rel_index_rule_space = 0;
+}
+
+void LocalSysDBCache::LocalSysDBCacheReSet()
+{
+ LocalSysDBCacheReleaseCritialReSource(true);
+
+ /* reset flag */
+ abort_count = 0;
+ my_database_id = InvalidOid;
+ my_database_tablespace = InvalidOid;
+ my_database_name[0] = '\0';
+ my_database_path = NULL;
+ SMgrRelationHash = NULL;
+ TableSpaceCacheHash = NULL;
+ TypeCacheHash = NULL;
+ VfdCache = NULL;
+ SizeVfdCache = 0;
+ Assert(nfile == 0);
+ nfile = 0;
+ dlist_init(&unowned_reln);
+ bad_ptr_obj.ResetInitFlag();
+
+ /* unregist callback who cache is on lsc */
+ UnRegisterRelCacheCallBack(&inval_cxt, TypeCacheRelCallback);
+ UnRegisterRelCacheCallBack(&inval_cxt, RelfilenodeMapInvalidateCallback);
+ UnRegisterSysCacheCallBack(&inval_cxt, TABLESPACEOID, InvalidateTableSpaceCacheCallback);
+
+ MemoryContextResetAndDeleteChildren(lsc_mydb_memcxt);
+ MemoryContextResetAndDeleteChildren(lsc_share_memcxt);
+
+ MemoryContext old = MemoryContextSwitchTo(lsc_share_memcxt);
+ knl_u_relmap_init(&relmap_cxt);
+ MemoryContextSwitchTo(old);
+
+ other_space = ((AllocSet)lsc_top_memcxt)->totalSpace + ((AllocSet)lsc_share_memcxt)->totalSpace;
+ rel_index_rule_space = 0;
+ is_inited = false;
+ is_closed = false;
+ is_lsc_catbucket_created = false;
+}
+
+static bool LSCMemroyOverflow(uint64 total_space)
+{
+ const uint32 kb_bit_double = 10;
+ if (unlikely(total_space < ((uint64)g_instance.attr.attr_memory.local_syscache_threshold << kb_bit_double))) {
+ return false;
+ }
+ return true;
+}
+
+bool LocalSysDBCache::LocalSysDBCacheNeedReBuild()
+{
+ /* we have recovered from startup, redo may dont tell us inval msgs, so discard all lsc */
+ if (unlikely(!recovery_finished && g_instance.global_sysdbcache.recovery_finished)) {
+ return true;
+ } else if (!g_instance.global_sysdbcache.hot_standby) {
+ /* for standby, if not hot, the cache may be invalid */
+ return true;
+ }
+
+ /* it seems only fmgr_info_cxt has no resowner to avoid mem leak.
+ * we assum 1kb memory leaked once */
+ if (unlikely(abort_count > (uint64)g_instance.attr.attr_memory.local_syscache_threshold)) {
+ return true;
+ }
+
+ uint64 total_space = other_space + AllocSetContextUsedSpace((AllocSet)lsc_mydb_memcxt) +
+ AllocSetContextUsedSpace((AllocSet)u_sess->cache_mem_cxt) + rel_index_rule_space;
+ return LSCMemroyOverflow(total_space);
+}
+
+/* rebuild cache on memcxt of mydb or share, call it only before initsyscache */
+void LocalSysDBCache::LocalSysDBCacheReBuild()
+{
+ /* invalid session cache */
+ int i;
+ knl_u_inval_context *inval_cxt = &u_sess->inval_cxt;
+ for (i = 0; i < inval_cxt->syscache_callback_count; i++) {
+ struct SYSCACHECALLBACK* ccitem = inval_cxt->syscache_callback_list + i;
+ (*ccitem->function)(ccitem->arg, ccitem->id, 0);
+ }
+
+ for (i = 0; i < inval_cxt->relcache_callback_count; i++) {
+ struct RELCACHECALLBACK* ccitem = inval_cxt->relcache_callback_list + i;
+ (*ccitem->function)(ccitem->arg, InvalidOid);
+ }
+
+ for (i = 0; i < inval_cxt->partcache_callback_count; i++) {
+ struct PARTCACHECALLBACK* ccitem = inval_cxt->partcache_callback_list + i;
+ (*ccitem->function)(ccitem->arg, InvalidOid);
+ }
+
+ LocalSysDBCacheReSet();
+ CreateCatBucket();
+}
+
+bool LocalSysDBCache::LocalSysDBCacheNeedSwapOut()
+{
+ uint64 total_space = other_space + rel_index_rule_space + ((AllocSet)lsc_mydb_memcxt)->totalSpace;
+ return LSCMemroyOverflow(total_space);
+}
+
+void LocalSysDBCache::CloseLocalSysDBCache()
+{
+ if (is_closed) {
+ return;
+ }
+ LocalSysDBCacheReleaseCritialReSource(true);
+ is_inited = false;
+ is_closed = true;
+#ifdef USE_ASSERT_CHECKING
+ lsc_close_check.setCloseFlag(true);
+#endif
+}
+
+/* every cache knowes whether it is inited */
+void LocalSysDBCache::ClearSysCacheIfNecessary(Oid db_id, const char *db_name)
+{
+ CreateCatBucket();
+ if (unlikely(!is_inited)) {
+ return;
+ }
+ other_space = ((AllocSet)lsc_top_memcxt)->totalSpace + ((AllocSet)lsc_share_memcxt)->totalSpace;
+ /* rebuild if memory gt double of threshold */
+ if (unlikely(LocalSysDBCacheNeedReBuild())) {
+ recovery_finished = g_instance.global_sysdbcache.recovery_finished;
+ LocalSysDBCacheReBuild();
+ return;
+ }
+
+ if (LocalSysDBCacheNeedClearMyDB(db_id, db_name)) {
+ LocalSysDBCacheClearMyDB(db_id, db_name);
+ return;
+ }
+
+ /* only thread who switch sess need clean smgr block info */
+ /* actually, ts task_producter need do this too, but those code need restructure. ts is discarded */
+ if (IS_THREAD_POOL_WORKER) {
+ smgrcleanblocknumall();
+ }
+ g_instance.global_sysdbcache.Refresh(m_global_db);
+}
+
+void LocalSysDBCache::CreateDBObject()
+{
+ Assert(lsc_top_memcxt == NULL);
+ lsc_top_memcxt = AllocSetContextCreate(
+ THREAD_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_DEFAULT), "LocalSysCacheTopMemoryContext", ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE, ALLOCSET_DEFAULT_MAXSIZE, STANDARD_CONTEXT);
+ lsc_share_memcxt =
+ AllocSetContextCreate(lsc_top_memcxt, "LocalSysCacheShareMemoryContext", ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE, ALLOCSET_DEFAULT_MAXSIZE, STANDARD_CONTEXT);
+
+ lsc_mydb_memcxt =
+ AllocSetContextCreate(lsc_top_memcxt, "LocalSysCacheMyDBMemoryContext", ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE, ALLOCSET_DEFAULT_MAXSIZE, STANDARD_CONTEXT);
+ MemoryContext old = MemoryContextSwitchTo(lsc_top_memcxt);
+ systabcache.CreateObject();
+ tabdefcache.CreateDefBucket();
+ partdefcache.CreateDefBucket();
+ knl_u_inval_init(&inval_cxt);
+ dlist_init(&unowned_reln);
+ MemoryContextSwitchTo(old);
+ if (IS_PGXC_COORDINATOR) {
+ CacheRegisterThreadSyscacheCallback(PGXCGROUPOID, ThreadNodeGroupCallback, (Datum)0);
+ }
+ /* init t_thrd resource owner */
+ local_sysdb_resowner =
+ ResourceOwnerCreate(NULL, "InitLocalSysCache", lsc_top_memcxt);
+
+ old = MemoryContextSwitchTo(lsc_share_memcxt);
+ knl_u_relmap_init(&relmap_cxt);
+ MemoryContextSwitchTo(old);
+ m_shared_global_db = g_instance.global_sysdbcache.GetSharedGSCEntry();
+ other_space = ((AllocSet)lsc_top_memcxt)->totalSpace + ((AllocSet)lsc_share_memcxt)->totalSpace;
+ rel_index_rule_space = 0;
+ is_lsc_catbucket_created = false;
+}
+
+void LocalSysDBCache::CreateCatBucket()
+{
+ if (likely(is_lsc_catbucket_created)) {
+ return;
+ }
+ MemoryContext old = MemoryContextSwitchTo(lsc_share_memcxt);
+ systabcache.CreateCatBuckets();
+ MemoryContextSwitchTo(old);
+ other_space = ((AllocSet)lsc_top_memcxt)->totalSpace + ((AllocSet)lsc_share_memcxt)->totalSpace;
+ rel_index_rule_space = 0;
+ is_lsc_catbucket_created = true;
+}
+
+void LocalSysDBCache::SetDatabaseName(const char *db_name)
+{
+ if (db_name != NULL && db_name[0] != '\0') {
+ size_t len = strlen(db_name);
+ Assert(len > 0 && len < NAMEDATALEN);
+ errno_t rc = memcpy_s(my_database_name, len + 1, db_name, len + 1);
+ securec_check(rc, "\0", "\0");
+ return;
+ }
+
+ if (my_database_name[0] == '\0') {
+ t_thrd.proc_cxt.PostInit->GetDatabaseName(my_database_name);
+ }
+
+ if (my_database_name[0] == '\0') {
+ char *tmp = get_database_name(my_database_id);
+ size_t len = strlen(tmp);
+ errno_t rc = memcpy_s(my_database_name, len + 1, tmp, len + 1);
+ securec_check(rc, "\0", "\0");
+ pfree_ext(tmp);
+ }
+}
+
+void LocalSysDBCache::InitThreadDatabase(Oid db_id, const char *db_name, Oid db_tabspc)
+{
+ Assert(db_id != InvalidOid);
+ if (my_database_id == db_id) {
+ Assert(my_database_name[0] != '\0');
+ Assert(my_database_tablespace == db_tabspc);
+ Assert(db_name == NULL || strcmp(my_database_name, db_name) == 0);
+ return;
+ } else if (my_database_id != InvalidOid) {
+ /* we has lock db and set thrd.proc.dbid, this should never happened */
+ Assert(false);
+ ereport(FATAL, (errno, errmsg("lsc has some error, please try again!")));
+ }
+ Assert(db_id == u_sess->proc_cxt.MyDatabaseId);
+ Assert(my_database_id == InvalidOid);
+ Assert(my_database_tablespace == InvalidOid);
+ Assert(my_database_name[0] == '\0');
+ my_database_id = db_id;
+ my_database_tablespace = db_tabspc;
+ if (db_id == TemplateDbOid) {
+ my_database_name[0] = '\0';
+ return;
+ }
+ SetDatabaseName(db_name);
+}
+
+void LocalSysDBCache::InitSessionDatabase(Oid db_id, const char *db_name, Oid db_tabspc)
+{
+ if (m_global_db != NULL && m_global_db->m_isDead) {
+ ereport(FATAL, (errno, errmsg("It is too later to fix syscache, please try again!")));
+ return;
+ }
+ Assert(db_id != InvalidOid);
+ if (!is_inited) {
+ my_database_id = db_id;
+ if (db_name != NULL && !IsBootstrapProcessingMode()) {
+ SetDatabaseName(db_name);
+ }
+ my_database_tablespace = db_tabspc;
+ } else {
+ Assert(my_database_id == db_id);
+ Assert(my_database_tablespace == db_tabspc);
+ Assert(strcmp(my_database_name, db_name) == 0);
+ }
+}
+
+void LocalSysDBCache::InitDatabasePath(const char *db_path)
+{
+ Assert(db_path != NULL);
+ Assert(strcmp(u_sess->proc_cxt.DatabasePath, db_path) == 0);
+ if (my_database_path == NULL) {
+ my_database_path = MemoryContextStrdup(lsc_share_memcxt, db_path);
+ } else if (strcmp(my_database_path, db_path) != 0) {
+ pfree_ext(my_database_path);
+ my_database_path = MemoryContextStrdup(lsc_share_memcxt, db_path);
+ }
+}
+
+void LocalSysDBCache::Init()
+{
+ Assert(!is_inited);
+ Assert(m_global_db == NULL);
+ Assert(my_database_id != InvalidOid);
+ Assert(my_database_id == u_sess->proc_cxt.MyDatabaseId);
+ m_global_db = g_instance.global_sysdbcache.GetGSCEntry(my_database_id, my_database_name);
+ is_inited = true;
+}
+
+void LocalSysDBCache::InitRelMapPhase2()
+{
+ Assert(m_shared_global_db != NULL);
+ m_shared_global_db->m_relmapCache->InitPhase2();
+ if (!IS_MAGIC_EXIST(relmap_cxt.shared_map->magic)) {
+ m_shared_global_db->m_relmapCache->CopyInto(relmap_cxt.shared_map);
+ }
+}
+
+void LocalSysDBCache::InitRelMapPhase3()
+{
+ Assert(m_global_db != NULL);
+ m_global_db->m_relmapCache->InitPhase2();
+ if (!IS_MAGIC_EXIST(relmap_cxt.local_map->magic)) {
+ m_global_db->m_relmapCache->CopyInto(relmap_cxt.local_map);
+ }
+}
+
+void LocalSysDBCache::LoadRelMapFromGlobal(bool shared)
+{
+ GlobalSysDBCacheEntry *global_db = shared ? m_shared_global_db : m_global_db;
+ RelMapFile *rel_map = shared ? relmap_cxt.shared_map : relmap_cxt.local_map;
+ Assert(global_db != NULL);
+ global_db->m_relmapCache->CopyInto(rel_map);
+}
+
+void LocalSysDBCache::InvalidateGlobalRelMap(bool shared, Oid db_id, RelMapFile *rel_map)
+{
+ if (shared) {
+ Assert(m_shared_global_db != NULL);
+ GlobalSysDBCacheEntry *global_db = m_shared_global_db;
+ global_db->m_relmapCache->UpdateBy(rel_map);
+ } else if (!is_inited) {
+ Assert(m_global_db == NULL && !is_inited);
+ GlobalSysDBCacheEntry *entry = g_instance.global_sysdbcache.FindTempGSCEntry(db_id);
+ if (entry == NULL) {
+ return;
+ }
+ entry->m_relmapCache->UpdateBy(rel_map);
+ g_instance.global_sysdbcache.ReleaseTempGSCEntry(entry);
+ } else {
+ Assert(my_database_id == db_id);
+ m_global_db->m_relmapCache->UpdateBy(rel_map);
+ }
+}
+
+void LocalSysDBCache::SetThreadDefExclusive(bool is_exclusive)
+{
+ m_is_def_exclusive = is_exclusive;
+}
+
+LocalSysDBCache::LocalSysDBCache()
+{
+ lsc_top_memcxt = NULL;
+ lsc_share_memcxt = NULL;
+ lsc_mydb_memcxt = NULL;
+ m_global_db = NULL;
+ my_database_id = InvalidOid;
+ my_database_name[0] = '\0';
+ my_database_path = NULL;
+ my_database_tablespace = InvalidOid;
+ TableSpaceCacheHash = NULL;
+ TypeCacheHash = NULL;
+ SMgrRelationHash = NULL;
+ VfdCache = NULL;
+ SizeVfdCache = 0;
+ nfile = 0;
+ local_sysdb_resowner = NULL;
+
+ abort_count = 0;
+
+ rdlock_info.count = 0;
+ got_pool_reload = false;
+ m_shared_global_db = NULL;
+
+ is_lsc_catbucket_created = false;
+ is_closed = false;
+ is_inited = false;
+#ifdef USE_ASSERT_CHECKING
+ lsc_close_check.setCloseFlag(false);
+#endif
+}
+
+void AtEOXact_SysDBCache(bool is_commit)
+{
+ if (!EnableLocalSysCache()) {
+ return;
+ }
+ Assert(t_thrd.lsc_cxt.lsc != NULL);
+ ResourceOwnerReleaseLocalCatCList(t_thrd.lsc_cxt.lsc->local_sysdb_resowner, is_commit);
+ ResourceOwnerReleaseLocalCatCTup(t_thrd.lsc_cxt.lsc->local_sysdb_resowner, is_commit);
+ ResourceOwnerReleaseRelationRef(t_thrd.lsc_cxt.lsc->local_sysdb_resowner, is_commit);
+ ResourceOwnerReleasePartitionRef(t_thrd.lsc_cxt.lsc->local_sysdb_resowner, is_commit);
+
+ t_thrd.lsc_cxt.lsc->LocalSysDBCacheReleaseGlobalReSource(is_commit);
+
+ ReleaseBadPtrList(is_commit);
+ if (!is_commit) {
+ t_thrd.lsc_cxt.lsc->abort_count++;
+ }
+ /* resowner make sure the lock released */
+ t_thrd.lsc_cxt.lsc->rdlock_info.count = 0;
+
+ t_thrd.lsc_cxt.lsc->SetThreadDefExclusive(IS_THREAD_POOL_STREAM || IsBgWorkerProcess());
+}
+
+void ReBuildLSC()
+{
+ if (!EnableLocalSysCache()) {
+ return;
+ }
+ if (t_thrd.lsc_cxt.lsc == NULL || t_thrd.lsc_cxt.lsc->is_closed) {
+ return;
+ }
+ t_thrd.lsc_cxt.lsc->LocalSysDBCacheReBuild();
+}
+
+void AppendBadPtr(void *elem)
+{
+ BadPtrObj *obj = &t_thrd.lsc_cxt.lsc->bad_ptr_obj;
+ /* enlarge size of dad ptr list if necessary */
+ int newmax = 0;
+ if (obj->nbadptr >= obj->maxbadptr) {
+ if (obj->bad_ptr_lists == NULL) {
+ newmax = 16;
+ obj->bad_ptr_lists = (void **)MemoryContextAlloc(t_thrd.lsc_cxt.lsc->lsc_share_memcxt,
+ newmax * sizeof(void *));
+ obj->maxbadptr = newmax;
+ } else {
+ newmax = obj->maxbadptr * 2;
+ obj->bad_ptr_lists = (void **)repalloc(obj->bad_ptr_lists, newmax * sizeof(void *));
+ obj->maxbadptr = newmax;
+ }
+ }
+
+ /* remember bad ptr */
+ Assert(obj->nbadptr < obj->maxbadptr);
+ obj->bad_ptr_lists[obj->nbadptr] = elem;
+ obj->nbadptr++;
+}
+
+void RemoveBadPtr(void *elem)
+{
+ BadPtrObj *obj = &t_thrd.lsc_cxt.lsc->bad_ptr_obj;
+ void **bad_lists = obj->bad_ptr_lists;
+ int nc = obj->nbadptr - 1;
+ for (int i = nc; i >= 0; i--) {
+ if (bad_lists[i] == elem) {
+ while (i < nc) {
+ bad_lists[i] = bad_lists[i + 1];
+ i++;
+ }
+ obj->nbadptr = nc;
+ return;
+ }
+ }
+}
+
+static void ReleaseBadPtrList(bool isCommit)
+{
+ BadPtrObj *obj = &t_thrd.lsc_cxt.lsc->bad_ptr_obj;
+ while (obj->nbadptr > 0) {
+ if (isCommit) {
+ /* DFX: print some debug info here */
+ }
+ pfree_ext(obj->bad_ptr_lists[obj->nbadptr - 1]); /* 只释放了指针 */
+ obj->nbadptr--;
+ }
+}
+
+void StreamTxnContextSaveInvalidMsg(void *stc)
+{
+ if (!EnableLocalSysCache()) {
+ STCSaveElem(((StreamTxnContext *)stc)->lsc_dbcache, NULL);
+ return;
+ }
+ STCSaveElem(((StreamTxnContext *)stc)->lsc_dbcache, t_thrd.lsc_cxt.lsc);
+ /* we don't know what bgworker do,
+ * just stop insert rel/part into gsc,
+ * tuple has its flag to decide hot to do insert*/
+ t_thrd.lsc_cxt.lsc->SetThreadDefExclusive(true);
+}
+void StreamTxnContextRestoreInvalidMsg(void *stc)
+{
+ if (!EnableLocalSysCache()) {
+ return;
+ }
+ LocalSysDBCache *lsc_dbcache = ((StreamTxnContext *)stc)->lsc_dbcache;
+ InvalidBaseEntry *src_part = &lsc_dbcache->partdefcache.invalid_entries;
+ InvalidBaseEntry *dst_part = &t_thrd.lsc_cxt.lsc->partdefcache.invalid_entries;
+ for (int i = 0; i < src_part->count; i++) {
+ dst_part->InsertInvalidDefValue(src_part->invalid_values[i]);
+ }
+
+ InvalidBaseEntry *src_rel = &lsc_dbcache->tabdefcache.invalid_entries;
+ InvalidBaseEntry *dst_rel = &t_thrd.lsc_cxt.lsc->tabdefcache.invalid_entries;
+ for (int i = 0; i < src_rel->count; i++) {
+ dst_rel->InsertInvalidDefValue(src_rel->invalid_values[i]);
+ }
+
+ for (int i = 0; i < SysCacheSize; i++) {
+ InvalidBaseEntry *src_tup = &lsc_dbcache->systabcache.local_systupcaches[i]->invalid_entries;
+ InvalidBaseEntry *dst_tup = &t_thrd.lsc_cxt.lsc->systabcache.local_systupcaches[i]->invalid_entries;
+ for (int i = 0; i < src_tup->count; i++) {
+ dst_tup->InsertInvalidDefValue(src_tup->invalid_values[i]);
+ dst_tup->is_reset |= src_tup->is_reset;
+ }
+ }
+}
+
+void ReleaseAllGSCRdConcurrentLock()
+{
+ if (!EnableLocalSysCache() || t_thrd.lsc_cxt.lsc->rdlock_info.count == 0) {
+ return;
+ }
+ while (t_thrd.lsc_cxt.lsc->rdlock_info.count > 0) {
+ int cur_index = t_thrd.lsc_cxt.lsc->rdlock_info.count - 1;
+ ReleaseGSCTableReadLock(t_thrd.lsc_cxt.lsc->rdlock_info.has_concurrent_lock[cur_index],
+ t_thrd.lsc_cxt.lsc->rdlock_info.concurrent_lock[cur_index]);
+ }
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/knl_localsystabcache.cpp b/src/common/backend/utils/cache/knl_localsystabcache.cpp
new file mode 100644
index 000000000..087de410d
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_localsystabcache.cpp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "utils/knl_globalsysdbcache.h"
+#include "utils/knl_localsystabcache.h"
+#include "utils/knl_localsystupcache.h"
+#include "utils/memutils.h"
+#include "utils/resowner.h"
+#include "storage/ipc.h"
+#include "utils/catcache.h"
+
+void LocalSysTabCache::CreateObject()
+{
+ local_systupcaches = (LocalSysTupCache **)palloc0(sizeof(LocalSysTupCache *) * SysCacheSize);
+ for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
+ local_systupcaches[cache_id] = New(CurrentMemoryContext) LocalSysTupCache(cache_id);
+ }
+}
+
+void LocalSysTabCache::CreateCatBuckets()
+{
+ for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
+ local_systupcaches[cache_id]->CreateCatBucket();
+ }
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/knl_localsystupcache.cpp b/src/common/backend/utils/cache/knl_localsystupcache.cpp
new file mode 100644
index 000000000..ddf196099
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_localsystupcache.cpp
@@ -0,0 +1,830 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+#include "knl/knl_variable.h"
+
+#include "access/genam.h"
+#include "access/hash.h"
+#include "access/heapam.h"
+#include "access/relscan.h"
+#include "access/sysattr.h"
+#include "access/transam.h"
+#include "access/tuptoaster.h"
+#include "access/valid.h"
+#include "catalog/pg_operator.h"
+#include "catalog/pg_proc.h"
+#include "catalog/pg_proc_fn.h"
+#include "catalog/pg_type.h"
+#include "catalog/pg_attribute.h"
+#include "catalog/heap.h"
+#include "funcapi.h"
+#include "miscadmin.h"
+#include "parser/parse_relation.h"
+#include "parser/parse_type.h"
+#include "pgstat.h"
+#ifdef CatCache_STATS
+#include "storage/ipc.h" /* for on_proc_exit */
+#endif
+#include "storage/lmgr.h"
+#include "utils/acl.h"
+#include "utils/datum.h"
+#include "utils/builtins.h"
+#include "utils/elog.h"
+#include "utils/extended_statistics.h"
+#include "utils/fmgroids.h"
+#include "utils/fmgrtab.h"
+#include "utils/hashutils.h"
+#include "utils/inval.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "utils/rel_gs.h"
+#include "utils/relcache.h"
+#include "utils/resowner.h"
+#include "utils/syscache.h"
+#include "miscadmin.h"
+#include "utils/knl_catcache.h"
+#include "utils/knl_localsystupcache.h"
+#include "utils/knl_globalsystabcache.h"
+
+void LocalSysTupCache::ResetInitFlag()
+{
+ DLInitList(&m_dead_cts);
+ DLInitList(&m_dead_cls);
+ DLInitList(&cc_lists);
+ invalid_entries.ResetInitFlag();
+ /* DLInitList(Bucket); is already called by releaseglobalrefcount */
+ m_global_systupcache = NULL;
+ m_relinfo.cc_relname = NULL;
+ m_relinfo.cc_tupdesc = NULL;
+ for (int i = 0; i < CATCACHE_MAXKEYS; i++) {
+ m_relinfo.cc_hashfunc[i] = NULL;
+ m_relinfo.cc_fastequal[i] = NULL;
+ }
+ m_db_id = InvalidOid;
+ cc_searches = 0;
+ cc_hits = 0;
+ cc_neg_hits = 0;
+ cc_newloads = 0;
+ cc_invals = 0;
+ cc_lsearches = 0;
+ cc_lhits = 0;
+ m_is_inited = false;
+ m_is_inited_phase2 = false;
+ m_rls_user = InvalidOid;
+}
+
+void LocalSysTupCache::HandleDeadLocalCatCTup(LocalCatCTup *ct)
+{
+ DLRemove(&ct->cache_elem);
+ if (ct->refcount == 0) {
+ FreeLocalCatCTup(ct);
+ } else {
+ DLAddTail(&m_dead_cts, &ct->cache_elem);
+ }
+}
+
+void LocalSysTupCache::FreeLocalCatCTup(LocalCatCTup *ct)
+{
+ Assert(ct->refcount == 0);
+ if (ct->global_ct == NULL) {
+ CatCacheFreeKeys(m_relinfo.cc_tupdesc, m_relinfo.cc_nkeys, m_relinfo.cc_keyno, ct->keys);
+ pfree_ext(ct);
+ return;
+ }
+ ct->global_ct->Release();
+ pfree_ext(ct);
+}
+
+void LocalSysTupCache::FreeDeadCts()
+{
+ while (unlikely(m_dead_cts.dll_len > 0)) {
+ Dlelem *elt = DLRemHead(&m_dead_cts);
+ LocalCatCTup *ct = (LocalCatCTup *)DLE_VAL(elt);
+ if (unlikely(ct->refcount != 0)) {
+ /* we move the active entry to tail of list and let next call free it */
+ DLAddTail(&m_dead_cts, &ct->cache_elem);
+ break;
+ } else {
+ FreeLocalCatCTup(ct);
+ }
+ }
+}
+
+void LocalSysTupCache::HandleDeadLocalCatCList(LocalCatCList *cl)
+{
+ DLRemove(&cl->cache_elem);
+ if (cl->refcount == 0) {
+ FreeLocalCatCList(cl);
+ } else {
+ DLAddTail(&m_dead_cls, &cl->cache_elem);
+ }
+}
+
+void LocalSysTupCache::FreeLocalCatCList(LocalCatCList *cl)
+{
+ Assert(cl->refcount == 0);
+ cl->global_cl->Release();
+ pfree_ext(cl);
+}
+
+void LocalSysTupCache::FreeDeadCls()
+{
+ while (unlikely(m_dead_cls.dll_len > 0)) {
+ Dlelem *elt = DLRemHead(&m_dead_cls);
+ LocalCatCList *cl = (LocalCatCList *)DLE_VAL(elt);
+ if (unlikely(cl->refcount != 0)) {
+ /* we move the active entry to tail of list and let next call free it */
+ DLAddTail(&m_dead_cls, &cl->cache_elem);
+ break;
+ } else {
+ FreeLocalCatCList(cl);
+ }
+ }
+}
+
+
+/* call when switch db, reset memcxt after it func */
+void LocalSysTupCache::ReleaseGlobalRefcount()
+{
+ /* not inited, nothing to do */
+ if (unlikely(!m_is_inited_phase2)) {
+ return;
+ }
+ /* release cl */
+ for (Dlelem *elt = DLGetHead(&cc_lists); elt; elt = DLGetSucc(elt)) {
+ LocalCatCList *cl = (LocalCatCList *)DLE_VAL(elt);
+ cl->global_cl->Release();
+ }
+ DLInitList(&cc_lists);
+ while (m_dead_cls.dll_len > 0) {
+ Dlelem *elt = DLRemHead(&m_dead_cls);
+ LocalCatCList *cl = (LocalCatCList *)DLE_VAL(elt);
+ cl->global_cl->Release();
+ }
+
+ /* release ct */
+ for (int hash_index = 0; hash_index < cc_nbuckets; hash_index++) {
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt;) {
+ LocalCatCTup *ct = (LocalCatCTup *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ Assert(ct->global_ct == NULL || ct->global_ct->refcount > 0);
+ /* we dont release exclusive tuple, because it is a local tuple */
+ if (ct->global_ct != NULL && ct->global_ct->canInsertGSC) {
+ ct->global_ct->Release();
+ }
+ }
+ DLInitList(GetBucket(hash_index));
+ }
+ /* we dont reset mydb tuple buckets, instead we use bucket_db array to record them */
+ while (m_dead_cts.dll_len > 0) {
+ Dlelem *elt = DLRemHead(&m_dead_cts);
+ LocalCatCTup *ct = (LocalCatCTup *)DLE_VAL(elt);
+ if (ct->global_ct != NULL) {
+ ct->global_ct->Release();
+ }
+ }
+}
+
+void LocalSysTupCache::ResetCatalogCache()
+{
+ /* not inited, nothing to do */
+ if (unlikely(!m_is_inited_phase2)) {
+ return;
+ }
+ for (Dlelem *elt = DLGetHead(&cc_lists); elt;) {
+ LocalCatCList *cl = (LocalCatCList *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ HandleDeadLocalCatCList(cl);
+ }
+ /* Remove each tuple in this cache, now all cl are released. */
+ for (int hash_index = 0; hash_index < cc_nbuckets; hash_index++) {
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt;) {
+ LocalCatCTup *ct = (LocalCatCTup *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ Assert(ct->global_ct == NULL || ct->global_ct->refcount > 0);
+ HandleDeadLocalCatCTup(ct);
+ }
+ }
+}
+
+void LocalSysTupCache::HashValueInvalidateLocal(uint32 hash_value)
+{
+ /* not inited, nothing to do */
+ if (unlikely(!m_is_inited_phase2)) {
+ return;
+ }
+ /*
+ * inspect caches to find the proper cache
+ * list of cache_header is never changed after init, so lock is not needed
+ * Invalidate *all *CatCLists in this cache; it's too hard to tell
+ * which searches might still be correct, so just zap 'em all.
+ */
+ for (Dlelem *elt = DLGetHead(&cc_lists); elt;) {
+ LocalCatCList *cl = (LocalCatCList *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ HandleDeadLocalCatCList(cl);
+ }
+ uint32 hash_index = HASH_INDEX(hash_value, cc_nbuckets);
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt;) {
+ LocalCatCTup *ct = (LocalCatCTup *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ if (hash_value == ct->hash_value) {
+ HandleDeadLocalCatCTup(ct);
+ }
+ }
+}
+
+template
+void LocalSysTupCache::FlushGlobalByInvalidMsg(Oid db_id, uint32 hash_value)
+{
+ if (db_id == InvalidOid) {
+ Assert(!m_is_inited_phase2 || m_relinfo.cc_relisshared);
+ GlobalSysTabCache *global_systab = t_thrd.lsc_cxt.lsc->GetSharedSysTabCache();
+ global_systab->InvalidTuples(m_cache_id, hash_value, reset);
+ return;
+ }
+ if (m_is_inited) {
+ InitPhase2();
+ Assert(db_id == m_db_id);
+ }
+ if (!m_is_inited_phase2) {
+ Assert(!m_is_inited);
+ /* redoxact meand !m_is_inited_phase2 */
+ GlobalSysDBCacheEntry *entry = g_instance.global_sysdbcache.FindTempGSCEntry(db_id);
+ if (entry == NULL) {
+ return;
+ }
+ entry->m_systabCache->InvalidTuples(m_cache_id, hash_value, reset);
+ g_instance.global_sysdbcache.ReleaseTempGSCEntry(entry);
+ } else {
+ Assert(db_id == m_db_id);
+ if (reset) {
+ m_global_systupcache->ResetCatalogCache();
+ } else {
+ m_global_systupcache->HashValueInvalidate(hash_value);
+ }
+ }
+}
+
+template void LocalSysTupCache::FlushGlobalByInvalidMsg(Oid db_id, uint32 hash_value);
+template void LocalSysTupCache::FlushGlobalByInvalidMsg(Oid db_id, uint32 hash_value);
+
+
+void LocalSysTupCache::PrepareToInvalidateCacheTuple(HeapTuple tuple, HeapTuple newtuple,
+ void (*function)(int, uint32, Oid))
+{
+ if (m_relinfo.cc_indexoid == ProcedureNameAllArgsNspIndexId
+ && t_thrd.proc->workingVersionNum < 92470) {
+ return;
+ }
+ InitPhase2();
+ Assert(m_global_systupcache != NULL);
+ Assert(CheckMyDatabaseMatch());
+ uint32 hash_value = CatalogCacheComputeTupleHashValue(cc_id, m_relinfo.cc_keyno, m_relinfo.cc_tupdesc,
+ m_relinfo.cc_hashfunc, m_relinfo.cc_reloid, m_relinfo.cc_nkeys, tuple);
+ Oid dbid = m_relinfo.cc_relisshared ? (Oid)0 : t_thrd.lsc_cxt.lsc->my_database_id;
+ /* for every session si msg */
+ (*function)(cc_id, hash_value, dbid);
+ if (newtuple) {
+ uint32 new_hash_value = CatalogCacheComputeTupleHashValue(cc_id, m_relinfo.cc_keyno, m_relinfo.cc_tupdesc,
+ m_relinfo.cc_hashfunc, m_relinfo.cc_reloid, m_relinfo.cc_nkeys, newtuple);
+ if (new_hash_value != hash_value) {
+ (*function)(cc_id, new_hash_value, dbid);
+ }
+ }
+}
+
+LocalSysTupCache::LocalSysTupCache(int cache_id)
+{
+ m_cache_id = cache_id;
+ cc_buckets = NULL;
+ m_local_mem_cxt = NULL;
+ ResetInitFlag();
+ const cachedesc *cur_cache_info = &cacheinfo[m_cache_id];
+ cc_nbuckets = ResizeHashBucket(cur_cache_info->nbuckets, g_instance.global_sysdbcache.dynamic_hash_bucket_strategy);
+ cc_id = m_cache_id;
+ m_relinfo.cc_reloid = cur_cache_info->reloid;
+ m_relinfo.cc_indexoid = cur_cache_info->indoid;
+ m_relinfo.cc_nkeys = cur_cache_info->nkeys;
+ for (int i = 0; i < m_relinfo.cc_nkeys; ++i) {
+ m_relinfo.cc_keyno[i] = cur_cache_info->key[i];
+ }
+ m_relinfo.cc_relisshared = g_instance.global_sysdbcache.HashSearchSharedRelation(m_relinfo.cc_reloid);
+}
+
+void LocalSysTupCache::CreateCatBucket()
+{
+ invalid_entries.Init();
+ Assert(cc_nbuckets > 0 && (cc_nbuckets & -cc_nbuckets) == cc_nbuckets);
+ size_t sz = (cc_nbuckets) * (sizeof(Dllist));
+ cc_buckets = (Dllist *)palloc0(sz);
+ if (m_relinfo.cc_relisshared) {
+ m_local_mem_cxt = t_thrd.lsc_cxt.lsc->lsc_share_memcxt;
+ } else {
+ m_local_mem_cxt = t_thrd.lsc_cxt.lsc->lsc_mydb_memcxt;
+ }
+}
+
+void LocalSysTupCache::FlushRlsUserImpl()
+{
+ Oid cur_user = GetCurrentUserId();
+ if (likely(m_rls_user == GetCurrentUserId()) || cur_user == InvalidOid) {
+ return;
+ }
+ /* we must flush the local cache, which dont belong to current user */
+ ResetCatalogCache();
+ m_rls_user = GetCurrentUserId();
+}
+
+
+void LocalSysTupCache::InitPhase2Impl()
+{
+ Assert(m_is_inited);
+ Assert(!m_is_inited_phase2);
+ Assert(m_db_id == InvalidOid);
+ Assert(m_global_systupcache == NULL);
+ /* for now we even dont know which db to connect */
+ if (m_relinfo.cc_relisshared) {
+ m_db_id = InvalidOid;
+ GlobalSysTabCache *global_shared_systab = t_thrd.lsc_cxt.lsc->GetSharedSysTabCache();
+ m_global_systupcache = global_shared_systab->CacheIdGetGlobalSysTupCache(m_cache_id);
+ } else {
+ Assert(CheckMyDatabaseMatch());
+ GlobalSysTabCache *global_systabcache = t_thrd.lsc_cxt.lsc->GetGlobalSysTabCache();
+ m_db_id = t_thrd.lsc_cxt.lsc->my_database_id;
+ m_global_systupcache = global_systabcache->CacheIdGetGlobalSysTupCache(m_cache_id);
+ }
+ Assert(m_global_systupcache != NULL);
+ m_relinfo.cc_relname = m_global_systupcache->GetCCRelName();
+ for (int i = 0; i < CATCACHE_MAXKEYS; i++) {
+ m_relinfo.cc_hashfunc[i] = m_global_systupcache->GetCCHashFunc()[i];
+ m_relinfo.cc_fastequal[i] = m_global_systupcache->GetCCFastEqual()[i];
+ }
+ m_relinfo.cc_tupdesc = m_global_systupcache->GetCCTupleDesc();
+ m_is_inited_phase2 = true;
+}
+
+void LocalSysTupCache::RemoveTailTupleElements(Index hash_index)
+{
+ bool listBelowThreshold = GetBucket(hash_index)->dll_len < MAX_LSC_LIST_LENGTH;
+ if (listBelowThreshold && !t_thrd.lsc_cxt.lsc->LocalSysDBCacheNeedSwapOut()) {
+ return;
+ }
+ Dllist *list = GetBucket(hash_index);
+ for (Dlelem *elt = DLGetTail(list); elt != NULL;) {
+ LocalCatCTup *ct = (LocalCatCTup *)DLE_VAL(elt);
+ elt = DLGetPred(elt);
+ if (ct->refcount != 0) {
+ DLMoveToFront(&ct->cache_elem);
+ /* lsc do lru strategy, so the front of this cl are all refered probably, just break */
+ break;
+ }
+ HandleDeadLocalCatCTup(ct);
+ }
+}
+
+void LocalSysTupCache::RemoveTailListElements()
+{
+ bool listBelowThreshold = cc_lists.dll_len < MAX_LSC_LIST_LENGTH;
+ if (listBelowThreshold && !t_thrd.lsc_cxt.lsc->LocalSysDBCacheNeedSwapOut()) {
+ return;
+ }
+ int swapout_count = 0;
+ int max_swapout_count_once = cc_lists.dll_len >> 1;
+ for (Dlelem *elt = DLGetTail(&cc_lists); elt != NULL;) {
+ LocalCatCList *cl = (LocalCatCList *)DLE_VAL(elt);
+ elt = DLGetPred(elt);
+ if (cl->refcount != 0) {
+ DLMoveToFront(&cl->cache_elem);
+ /* lsc do lru strategy, so the front of this cl are all refered probably, just break */
+ break;
+ }
+ HandleDeadLocalCatCList(cl);
+ swapout_count++;
+ /* lsc is limitted by local_syscache_threshold, so dont be aggressive to swapout */
+ if (listBelowThreshold || swapout_count > max_swapout_count_once) {
+ break;
+ }
+ }
+}
+
+LocalCatCTup *LocalSysTupCache::SearchTupleFromGlobal(Datum *arguments, uint32 hash_value, Index hash_index, int level)
+{
+ LocalCatCTup *ct = NULL;
+ ResourceOwnerEnlargeGlobalCatCTup(LOCAL_SYSDB_RESOWNER);
+ GlobalCatCTup *global_ct;
+ /* gsc only cache snapshotnow
+ * for rls, we cann't know how to store the rls info, so dont cache it */
+ bool bypass_gsc = HistoricSnapshotActive() ||
+ m_global_systupcache->enable_rls ||
+ !g_instance.global_sysdbcache.hot_standby ||
+ unlikely(!g_instance.global_sysdbcache.recovery_finished);
+ if (invalid_entries.ExistTuple(hash_value) || bypass_gsc) {
+ global_ct = m_global_systupcache->SearchTupleFromFile(hash_value, arguments, true);
+ } else {
+ global_ct = m_global_systupcache->SearchTuple(hash_value, arguments);
+ }
+
+ /* In bootstrap mode, we don't build negative entries, because the cache
+ * invalidation mechanism isn't alive and can't clear them if the tuple
+ * gets created later. (Bootstrap doesn't do UPDATEs, so it doesn't need
+ * cache inval for that.)
+ */
+ if (global_ct == NULL) {
+ if (IsBootstrapProcessingMode()) {
+ return NULL;
+ }
+ ct = CreateLocalCatCTup(NULL, arguments, hash_value, hash_index);
+ } else {
+ Assert(global_ct->refcount > 0);
+ ResourceOwnerRememberGlobalCatCTup(LOCAL_SYSDB_RESOWNER, global_ct);
+ ct = CreateLocalCatCTup(global_ct, arguments, hash_value, hash_index);
+ ResourceOwnerForgetGlobalCatCTup(LOCAL_SYSDB_RESOWNER, global_ct);
+ }
+ return ct;
+}
+
+/*
+ * Work-horse for SearchTuple/SearchTupleN.
+ */
+LocalCatCTup *LocalSysTupCache::SearchTupleInternal(int nkeys, Datum v1, Datum v2, Datum v3, Datum v4, int level)
+{
+ Assert(m_relinfo.cc_nkeys == nkeys);
+ SearchCatCacheCheck();
+ FreeDeadCts();
+ FreeDeadCls();
+ cc_searches++;
+ /* Initialize local parameter array */
+ Datum arguments[CATCACHE_MAXKEYS];
+ arguments[0] = v1;
+ arguments[1] = v2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+ /*
+ * find the hash bucket in which to look for the tuple
+ */
+ uint32 hash_value = CatalogCacheComputeHashValue(m_relinfo.cc_hashfunc, nkeys, arguments);
+ Index hash_index = HASH_INDEX(hash_value, (uint32)cc_nbuckets);
+ /*
+ * scan the hash bucket until we find a match or exhaust our tuples
+ * remove dead tuple by the way
+ */
+ bool found = false;
+ LocalCatCTup *ct = NULL;
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt;) {
+ ct = (LocalCatCTup *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ if (unlikely(ct->hash_value != hash_value)) {
+ continue; /* quickly skip entry if wrong hash val */
+ }
+ if (unlikely(!CatalogCacheCompareTuple(m_relinfo.cc_fastequal, nkeys, ct->keys, arguments))) {
+ continue;
+ }
+ /*
+ * We found a match in the cache. Move it to the front of the list
+ * for its hashbucket, in order to speed subsequent searches. (The
+ * most frequently accessed elements in any hashbucket will tend to be
+ * near the front of the hashbucket's list.)
+ */
+ DLMoveToFront(&ct->cache_elem);
+ found = true;
+ break;
+ }
+
+ /* if not found, search from global cache */
+ if (unlikely(!found)) {
+ ct = SearchTupleFromGlobal(arguments, hash_value, hash_index, level);
+ if (ct == NULL) {
+ return NULL;
+ }
+ }
+
+ /*
+ * If it's a positive entry, bump its refcount and return it. If it's
+ * negative, we can report failure to the caller.
+ */
+ if (likely(ct->global_ct != NULL)) {
+ CACHE3_elog(DEBUG2, "SearchLocalCatCache(%s): found in bucket %d", m_relinfo.cc_relname, hash_index);
+ ResourceOwnerEnlargeLocalCatCTup(LOCAL_SYSDB_RESOWNER);
+ ct->refcount++;
+ cc_hits++;
+ ResourceOwnerRememberLocalCatCTup(LOCAL_SYSDB_RESOWNER, ct);
+ } else {
+ CACHE3_elog(DEBUG2, "SearchLocalCatCache(%s): found neg entry in bucket %d", m_relinfo.cc_relname, hash_index);
+ cc_neg_hits++;
+ ct = NULL;
+ }
+
+ RemoveTailTupleElements(hash_index);
+ return ct;
+}
+
+/*
+ * Create a new CatCTup entry, point to global_ct, The new entry initially has refcount 0.
+ */
+LocalCatCTup *LocalSysTupCache::CreateLocalCatCTup(GlobalCatCTup *global_ct, Datum *arguments, uint32 hash_value,
+ Index hash_index)
+{
+ MemoryContext oldcxt = MemoryContextSwitchTo(m_local_mem_cxt);
+ LocalCatCTup *ct = (LocalCatCTup *)palloc(sizeof(LocalCatCTup));
+
+ /*
+ * Finish initializing the CatCTup header, and add it to the cache's
+ * linked list and counts.
+ */
+ ct->ct_magic = CT_MAGIC;
+ DLInitElem(&ct->cache_elem, (void *)ct);
+ ct->refcount = 0;
+ ct->hash_value = hash_value;
+ ct->global_ct = global_ct;
+ /* palloc maybe fail, but that means global_ct is null, so nothing need to do */
+ if (global_ct != NULL) {
+ errno_t rc = memcpy_s(ct->keys, sizeof(Datum) * CATCACHE_MAXKEYS,
+ global_ct->keys, sizeof(Datum) * CATCACHE_MAXKEYS);
+ securec_check(rc, "", "");
+ } else {
+ errno_t rc = memset_s(ct->keys, m_relinfo.cc_nkeys * sizeof(Datum), 0, m_relinfo.cc_nkeys * sizeof(Datum));
+ securec_check(rc, "\0", "\0");
+ CatCacheCopyKeys(m_relinfo.cc_tupdesc, m_relinfo.cc_nkeys, m_relinfo.cc_keyno, arguments, ct->keys);
+ }
+ MemoryContextSwitchTo(oldcxt);
+ DLAddHead(&cc_buckets[hash_index], &ct->cache_elem);
+ return ct;
+}
+
+LocalCatCList *LocalSysTupCache::SearchListFromGlobal(int nkeys, Datum *arguments, uint32 hash_value, int level)
+{
+ ResourceOwnerEnlargeGlobalCatCList(LOCAL_SYSDB_RESOWNER);
+ /*
+ * List was not found in cache, so we have to build it by reading the
+ * relation. For each matching tuple found in the relation, use an
+ * existing cache entry if possible, else build a new one.
+ *
+ * We have to bump the member refcounts temporarily to ensure they won't
+ * get dropped from the cache while loading other members. We use a PG_TRY
+ * block to ensure we can undo those refcounts if we get an error before
+ * we finish constructing the CatCList.
+ */
+ bool bypass_gsc = HistoricSnapshotActive() ||
+ m_global_systupcache->enable_rls ||
+ !g_instance.global_sysdbcache.hot_standby ||
+ unlikely(!g_instance.global_sysdbcache.recovery_finished);
+ GlobalCatCList *global_cl;
+ if (invalid_entries.ExistList() || bypass_gsc) {
+ global_cl = m_global_systupcache->SearchListFromFile(hash_value, nkeys, arguments, true);
+ } else {
+ global_cl = m_global_systupcache->SearchList(hash_value, nkeys, arguments);
+ }
+ Assert(global_cl != NULL);
+
+ MemoryContext oldcxt = MemoryContextSwitchTo(m_local_mem_cxt);
+ LocalCatCList *new_cl = (LocalCatCList *)palloc0(sizeof(LocalCatCList));
+ MemoryContextSwitchTo(oldcxt);
+ new_cl->cl_magic = CL_MAGIC;
+ new_cl->hash_value = hash_value;
+ DLInitElem(&new_cl->cache_elem, new_cl);
+ errno_t rc = memcpy_s(new_cl->keys, nkeys * sizeof(Datum), global_cl->keys, nkeys * sizeof(Datum));
+ securec_check(rc, "", "");
+ new_cl->refcount = 1; /* for the moment */
+ new_cl->ordered = global_cl->ordered;
+ new_cl->nkeys = nkeys;
+ new_cl->n_members = global_cl->n_members;
+ new_cl->global_cl = global_cl;
+ new_cl->systups = (CatCTup **)global_cl->members;
+ ResourceOwnerForgetGlobalCatCList(LOCAL_SYSDB_RESOWNER, global_cl);
+ DLAddHead(&cc_lists, &new_cl->cache_elem);
+ CACHE3_elog(DEBUG2, "SearchLocalCatCacheList(%s): made list of %d members",
+ m_relinfo.cc_relname, new_cl->n_members);
+ return new_cl;
+}
+
+/*
+ * SearchListInternal
+ *
+ * Generate a list of all tuples matching a partial key (that is,
+ * a key specifying just the first K of the cache's N key columns).
+ *
+ * The caller must not modify the list object or the pointed-to tuples,
+ * and must call ReleaseLocalCatCList() when done with the list.
+ */
+LocalCatCList *LocalSysTupCache::SearchListInternal(int nkeys, Datum v1, Datum v2, Datum v3, Datum v4, int level)
+{
+ SearchCatCacheCheck();
+ Assert(nkeys > 0 && nkeys < m_relinfo.cc_nkeys);
+ cc_lsearches++;
+
+ /* Initialize local parameter array */
+ Datum arguments[CATCACHE_MAXKEYS];
+ arguments[0] = v1;
+ arguments[1] = v2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+ /*
+ * compute a hash value of the given keys for faster search. We don't
+ * presently divide the CatCList items into buckets, but this still lets
+ * us skip non-matching items quickly most of the time.
+ */
+ uint32 hash_value = CatalogCacheComputeHashValue(m_relinfo.cc_hashfunc, nkeys, arguments);
+
+ ResourceOwnerEnlargeLocalCatCList(LOCAL_SYSDB_RESOWNER);
+ /*
+ * scan the items until we find a match or exhaust our list
+ * remove dead list by the way
+ */
+ bool found = false;
+ LocalCatCList *cl = NULL;
+ for (Dlelem *elt = DLGetHead(&cc_lists); elt; elt = DLGetSucc(elt)) {
+ cl = (LocalCatCList *)DLE_VAL(elt);
+ if (likely(cl->hash_value != hash_value)) {
+ continue; /* quickly skip entry if wrong hash val */
+ }
+ if (unlikely(cl->nkeys != nkeys)) {
+ continue;
+ }
+ if (unlikely(!CatalogCacheCompareTuple(m_relinfo.cc_fastequal, nkeys, cl->keys, arguments))) {
+ continue;
+ }
+ DLMoveToFront(&cl->cache_elem);
+ /* Bump the list's refcount */
+ cl->refcount++;
+ CACHE2_elog(DEBUG2, "SearchLocalCatCacheList(%s): found list", m_relinfo.cc_relname);
+ cc_lhits++;
+ found = true;
+ break;
+ }
+
+ if (unlikely(!found)) {
+ cl = SearchListFromGlobal(nkeys, arguments, hash_value, level);
+ }
+ ResourceOwnerRememberLocalCatCList(LOCAL_SYSDB_RESOWNER, cl);
+
+ RemoveTailListElements();
+ return cl;
+}
+
+uint32 LocalSysTupCache::GetCatCacheHashValue(Datum v1, Datum v2, Datum v3, Datum v4)
+{
+ InitPhase2();
+ Datum arguments[CATCACHE_MAXKEYS];
+ arguments[0] = v1;
+ arguments[1] = v2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+ return CatalogCacheComputeHashValue(m_relinfo.cc_hashfunc, m_relinfo.cc_nkeys, arguments);
+}
+
+#ifndef ENABLE_MULTIPLE_NODES
+LocalCatCTup *LocalSysTupCache::SearchTupleFromGlobalForProcAllArgs(
+ Datum *arguments, uint32 hash_value, Index hash_index, oidvector* argModes)
+{
+ LocalCatCTup *ct = NULL;
+ ResourceOwnerEnlargeGlobalCatCTup(LOCAL_SYSDB_RESOWNER);
+ GlobalCatCTup *global_ct;
+ /* gsc only cache snapshotnow
+ * for rls, we cann't know how to store the rls info, so dont cache it */
+ bool bypass_gsc = HistoricSnapshotActive() ||
+ m_global_systupcache->enable_rls ||
+ !g_instance.global_sysdbcache.hot_standby ||
+ unlikely(!g_instance.global_sysdbcache.recovery_finished);
+ if (invalid_entries.ExistTuple(hash_value) || bypass_gsc) {
+ global_ct = m_global_systupcache->SearchTupleFromFileWithArgModes(hash_value, arguments, argModes, true);
+ } else {
+ global_ct = m_global_systupcache->SearchTupleWithArgModes(hash_value, arguments, argModes);
+ }
+
+ /*
+ * In this specific function for procallargs, we no longer build
+ * negative entry any more, because when we create a overload pg-style
+ * function with the same number intype parameters and different outtype
+ * parameters (a in int) vs (a in int, b out int), syscache will find no
+ * suitable cache tuple and make a new negative cache entry, but error will
+ * raise in such case, and no one will free the negative cache entry!
+ * In fact, the case metioned above should find a suitable tuple to return
+ * the caller, but for the reason we adapt a suit of Specific Function
+ * to support ProcedureCreate, syscache couldn't find the tuple. Someone
+ * may find new methods to solve the problem and refactor this!
+ */
+ if (global_ct == NULL) {
+ return NULL;
+ }
+
+ Assert(global_ct == NULL || global_ct->refcount > 0);
+ ResourceOwnerRememberGlobalCatCTup(LOCAL_SYSDB_RESOWNER, global_ct);
+ ct = CreateLocalCatCTup(global_ct, arguments, hash_value, hash_index);
+ ResourceOwnerForgetGlobalCatCTup(LOCAL_SYSDB_RESOWNER, global_ct);
+ return ct;
+}
+
+/*
+ * Specific SearchLocalCatCTuple Function to support ProcedureCreate!
+ */
+LocalCatCTup *LocalSysTupCache::SearchLocalCatCTupleForProcAllArgs(
+ Datum v1, Datum v2, Datum v3, Datum v4, Datum proArgModes)
+{
+ InitPhase2();
+
+ SearchCatCacheCheck();
+ FreeDeadCts();
+ FreeDeadCls();
+ cc_searches++;
+
+ Datum arguments[CATCACHE_MAXKEYS];
+ /*
+ * Logic here is the same in Sys/CatCache Search
+ */
+ oidvector* allArgTypes = (oidvector*)DatumGetPointer(v2);
+
+ Assert(allArgTypes != NULL);
+
+ oidvector* argModes = ConvertArgModesToMd5Vector(proArgModes);
+ oidvector* v2WithArgModes = MergeOidVector(allArgTypes, argModes);
+ Datum newKey2 = PointerGetDatum(v2WithArgModes);
+
+ /* Initialize local parameter array */
+ arguments[0] = v1;
+ arguments[1] = newKey2;
+ arguments[2] = v3;
+ arguments[3] = v4;
+ /*
+ * find the hash bucket in which to look for the tuple
+ */
+ uint32 hash_value = CatalogCacheComputeHashValue(m_relinfo.cc_hashfunc, m_relinfo.cc_nkeys, arguments);
+ Index hash_index = HASH_INDEX(hash_value, (uint32)cc_nbuckets);
+
+ /* reset parameter array */
+ pfree_ext(v2WithArgModes);
+ arguments[1] = v2;
+
+ /*
+ * scan the hash bucket until we find a match or exhaust our tuples
+ * remove dead tuple by the way
+ */
+ bool found = false;
+ LocalCatCTup *ct = NULL;
+ for (Dlelem *elt = DLGetHead(GetBucket(hash_index)); elt;) {
+ ct = (LocalCatCTup *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ if (unlikely(ct->hash_value != hash_value)) {
+ continue; /* quickly skip entry if wrong hash val */
+ }
+ if (unlikely(!CatalogCacheCompareTuple(m_relinfo.cc_fastequal, m_relinfo.cc_nkeys, ct->keys, arguments))) {
+ continue;
+ }
+
+ /*
+ * The comparison of hashvalue and keys is not enough.
+ */
+ if (!IsProArgModesEqualByTuple(&ct->global_ct->tuple, m_relinfo.cc_tupdesc, argModes)) {
+ continue;
+ }
+ /*
+ * We found a match in the cache. Move it to the front of the list
+ * for its hashbucket, in order to speed subsequent searches. (The
+ * most frequently accessed elements in any hashbucket will tend to be
+ * near the front of the hashbucket's list.)
+ */
+ DLMoveToFront(&ct->cache_elem);
+ found = true;
+ break;
+ }
+
+ /* if not found, search from global cache */
+ if (unlikely(!found)) {
+ ct = SearchTupleFromGlobalForProcAllArgs(arguments, hash_value, hash_index, argModes);
+ if (ct == NULL) {
+ pfree_ext(argModes);
+ return NULL;
+ }
+ }
+ /*
+ * If it's a positive entry, bump its refcount and return it. If it's
+ * negative, we can report failure to the caller.
+ */
+ if (likely(ct->global_ct != NULL)) {
+ CACHE3_elog(DEBUG2, "SearchLocalCatCache(%s): found in bucket %d", m_relinfo.cc_relname, hash_index);
+ ct->refcount++;
+ cc_hits++;
+ ResourceOwnerRememberLocalCatCTup(LOCAL_SYSDB_RESOWNER, ct);
+ }
+
+ RemoveTailTupleElements(hash_index);
+
+ pfree_ext(argModes);
+ return ct;
+}
+#endif
diff --git a/src/common/backend/utils/cache/knl_localtabdefcache.cpp b/src/common/backend/utils/cache/knl_localtabdefcache.cpp
new file mode 100644
index 000000000..46d3f77e0
--- /dev/null
+++ b/src/common/backend/utils/cache/knl_localtabdefcache.cpp
@@ -0,0 +1,1139 @@
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * ---------------------------------------------------------------------------------------
+ */
+
+
+#include "catalog/indexing.h"
+#include "catalog/pg_amproc.h"
+#include "catalog/pg_opclass.h"
+#include "catalog/pg_rewrite.h"
+#include "catalog/pg_trigger.h"
+#include "catalog/storage_gtt.h"
+#include "catalog/heap.h"
+#include "commands/matview.h"
+#include "commands/sec_rls_cmds.h"
+#include "postmaster/autovacuum.h"
+#include "pgxc/bucketmap.h"
+#include "utils/knl_catcache.h"
+#include "knl/knl_instance.h"
+#include "utils/knl_localtabdefcache.h"
+#include "utils/knl_relcache.h"
+#include "utils/memutils.h"
+#include "utils/relmapper.h"
+#include "utils/sec_rls_utils.h"
+
+
+bool has_locator_info(GlobalBaseEntry *entry)
+{
+ return ((GlobalRelationEntry *)entry)->rel->rd_locator_info != NULL;
+}
+
+static bool IsRelationStoreInglobal(Relation rel);
+
+LocalTabDefCache::LocalTabDefCache()
+{
+ ResetInitFlag();
+}
+
+static void SetGttInfo(Relation rel)
+{
+ if (rel->rd_rel->relpersistence == RELPERSISTENCE_GLOBAL_TEMP && rel->rd_backend != BackendIdForTempRelations) {
+ RelationCloseSmgr(rel);
+ rel->rd_backend = BackendIdForTempRelations;
+ BlockNumber relpages = 0;
+ double reltuples = 0;
+ BlockNumber relallvisible = 0;
+ get_gtt_relstats(RelationGetRelid(rel), &relpages, &reltuples, &relallvisible, NULL);
+ rel->rd_rel->relpages = (float8)relpages;
+ rel->rd_rel->reltuples = (float8)reltuples;
+ rel->rd_rel->relallvisible = (int4)relallvisible;
+ }
+}
+
+Relation LocalTabDefCache::SearchRelationFromLocal(Oid rel_oid)
+{
+ uint32 hash_value = oid_hash((void *)&(rel_oid), sizeof(Oid));
+ Index hash_index = HASH_INDEX(hash_value, (uint32)m_nbuckets);
+ LocalRelationEntry *entry = (LocalRelationEntry *)LocalBaseDefCache::SearchEntryFromLocal(rel_oid, hash_index);
+
+ if (unlikely(entry == NULL)) {
+ return NULL;
+ }
+ Assert(entry->rel->rd_node.spcNode != InvalidOid);
+ Assert(entry->rel->rd_node.relNode != InvalidOid);
+ Assert(entry->rel->rd_islocaltemp == false);
+ SetGttInfo(entry->rel);
+ return entry->rel;
+}
+
+template
+Relation LocalTabDefCache::SearchRelationFromGlobalCopy(Oid rel_oid)
+{
+ if (unlikely(!m_is_inited)) {
+ return NULL;
+ }
+ if (invalid_entries.ExistDefValue(rel_oid)) {
+ return NULL;
+ }
+ if (HistoricSnapshotActive()) {
+ return NULL;
+ }
+ if (!g_instance.global_sysdbcache.hot_standby) {
+ return NULL;
+ }
+ if (unlikely(!g_instance.global_sysdbcache.recovery_finished)) {
+ return NULL;
+ }
+ uint32 hash_value = oid_hash((void *)&(rel_oid), sizeof(Oid));
+ Index hash_index = HASH_INDEX(hash_value, (uint32)m_nbuckets);
+ ResourceOwner owner = LOCAL_SYSDB_RESOWNER;
+ ResourceOwnerEnlargeGlobalBaseEntry(owner);
+ GlobalRelationEntry *global;
+ if (g_instance.global_sysdbcache.HashSearchSharedRelation(rel_oid)) {
+ global = m_global_shared_tabdefcache->SearchReadOnly(rel_oid, hash_value);
+ } else {
+ Assert(m_global_tabdefcache != NULL);
+ Assert(m_is_inited_phase2);
+ if (!m_is_inited_phase2 || m_global_tabdefcache == NULL) {
+ ereport(FATAL,
+ (errcode(ERRCODE_INVALID_STATUS),
+ errmsg("rel_oid %u is shared but search return false", rel_oid)));
+ }
+ global = m_global_tabdefcache->SearchReadOnly(rel_oid, hash_value);
+ }
+
+ if (global == NULL) {
+ return NULL;
+ }
+ ResourceOwnerRememberGlobalBaseEntry(owner, global);
+
+ MemoryContext old = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
+ Relation copy = (Relation)palloc(sizeof(RelationData));
+ CopyLocalRelation(copy, global->rel);
+ MemoryContextSwitchTo(old);
+
+ ResourceOwnerForgetGlobalBaseEntry(owner, global);
+ global->Release();
+ if (insert_into_local) {
+ Assert(RemoveRelationByOid(rel_oid, hash_index) == NULL);
+ CreateLocalRelEntry(copy, hash_index);
+ }
+
+ Assert(copy->rd_node.spcNode != InvalidOid);
+ Assert(copy->rd_node.relNode != InvalidOid);
+ return copy;
+}
+template Relation LocalTabDefCache::SearchRelationFromGlobalCopy(Oid rel_oid);
+template Relation LocalTabDefCache::SearchRelationFromGlobalCopy(Oid rel_oid);
+
+Relation LocalTabDefCache::SearchRelation(Oid rel_oid)
+{
+ Relation rel = SearchRelationFromLocal(rel_oid);
+ if (rel == NULL) {
+ rel = SearchRelationFromGlobalCopy(rel_oid);
+ }
+ return rel;
+}
+
+void LocalTabDefCache::CreateLocalRelEntry(Relation rel, Index hash_index)
+{
+ if (t_thrd.lsc_cxt.lsc->LocalSysDBCacheNeedSwapOut()) {
+ LocalBaseDefCache::RemoveTailDefElements();
+ }
+ Assert(rel->rd_fdwroutine == NULL);
+ Assert(rel->rd_isnailed ? rel->rd_refcnt == 1 : rel->rd_refcnt == 0);
+ Assert(rel->rd_att->tdrefcount > 0);
+ LocalRelationEntry *entry =
+ (LocalRelationEntry *)LocalBaseDefCache::CreateEntry(hash_index, sizeof(LocalRelationEntry));
+ entry->rel = rel;
+ entry->oid = rel->rd_id;
+ entry->obj_is_nailed = rel->rd_isnailed;
+ rel->entry = entry;
+ RememberRelSonMemCxtSpace(rel);
+}
+
+static bool IsRelOidStoreInGlobal(Oid rel_oid)
+{
+ /* pgxc node need reload, we invalid all relcache with locator info */
+ if (unlikely(IsGotPoolReload() && IS_PGXC_COORDINATOR && !IsSystemObjOid(rel_oid))) {
+ return false;
+ }
+ if (unlikely(IsBootstrapProcessingMode())) {
+ return false;
+ }
+ if (unlikely(t_thrd.lsc_cxt.lsc->GetThreadDefExclusive())) {
+ return false;
+ }
+
+ if (unlikely(t_thrd.lsc_cxt.lsc->tabdefcache.invalid_entries.ExistDefValue(rel_oid))) {
+ return false;
+ }
+
+ if (unlikely(u_sess->attr.attr_common.IsInplaceUpgrade)) {
+ return false;
+ }
+ if (HistoricSnapshotActive()) {
+ return false;
+ }
+ if (!g_instance.global_sysdbcache.hot_standby) {
+ return false;
+ }
+ if (unlikely(!g_instance.global_sysdbcache.recovery_finished)) {
+ return false;
+ }
+ if (g_instance.global_sysdbcache.StopInsertGSC()) {
+ return false;
+ }
+ return true;
+}
+
+static bool IsRelationStoreInglobal(Relation rel)
+{
+ Assert(rel->rd_createSubid == InvalidSubTransactionId);
+ Assert(rel->rd_newRelfilenodeSubid == InvalidSubTransactionId);
+ Assert(rel->rd_rel->relowner != InvalidOid);
+ Assert(rel->rd_isvalid);
+ /* 2 is tmp index */
+ Assert(rel->rd_indexvalid != 2);
+
+ return true;
+}
+
+void LocalTabDefCache::InsertRelationIntoGlobal(Relation rel, uint32 hash_value)
+{
+ /* not insert tmp rel or creating rel of session into global cache */
+ if (!IsRelationStoreInglobal(rel)) {
+ return;
+ }
+ /* when insert, we must make sure m_global_shared_tabdefcache is inited at least */
+ Assert(m_global_tabdefcache != NULL || (rel->rd_rel->relisshared && m_global_shared_tabdefcache != NULL));
+ /* upgrade mode never do insert */
+ if (g_instance.global_sysdbcache.HashSearchSharedRelation(rel->rd_id)) {
+ Assert(rel->rd_rel->relisshared);
+ m_global_shared_tabdefcache->Insert(rel, hash_value);
+ } else {
+ Assert(!rel->rd_rel->relisshared);
+ m_global_tabdefcache->Insert(rel, hash_value);
+ }
+}
+
+void LocalTabDefCache::InsertRelationIntoLocal(Relation rel)
+{
+ uint32 hash_value = oid_hash((void *)&(rel->rd_id), sizeof(Oid));
+ Index hash_index = HASH_INDEX(hash_value, (uint32)m_nbuckets);
+ CreateLocalRelEntry(rel, hash_index);
+}
+
+void LocalTabDefCache::RemoveRelation(Relation rel)
+{
+ ForgetRelSonMemCxtSpace(rel);
+ m_bucket_list.RemoveElemFromBucket(&rel->entry->cache_elem);
+ pfree_ext(rel->entry);
+}
+
+Relation LocalTabDefCache::RemoveRelationByOid(Oid rel_oid, Index hash_index)
+{
+ LocalRelationEntry *entry = (LocalRelationEntry *)LocalBaseDefCache::SearchEntryFromLocal(rel_oid, hash_index);
+ if (entry == NULL) {
+ return NULL;
+ }
+ Relation old_rel = entry->rel;
+ RemoveRelation(old_rel);
+ return old_rel;
+}
+
+static void SpecialWorkOfRelationLocInfo(Relation rel)
+{
+ if (rel->rd_locator_info == NULL) {
+ return;
+ }
+ Assert(IS_PGXC_COORDINATOR && rel->rd_id >= FirstNormalObjectId);
+ /* global store nodeoid, we need convert it to nodeid */
+ ListCell *lc;
+ foreach (lc, rel->rd_locator_info->nodeList) {
+ Oid datanode_oid = lfirst_oid(lc);
+ int seqNum = PGXCNodeGetNodeId(datanode_oid, PGXC_NODE_DATANODE);
+ if (likely(seqNum >= 0)) {
+ lfirst_oid(lc) = seqNum;
+ } else {
+ /* convert failed, so free locator info and refrush global, and call RelationBuildLocator
+ * pgxc_pool_reload may cause this, we loss some datanodes after pgxc_pool_reload.
+ * actually we only need refrush rd_locator_info->nodeList. but we assumpt that
+ * pgxc_pool_reload is a small probability event
+ */
+ t_thrd.lsc_cxt.lsc->tabdefcache.InvalidateGlobalRelationNodeList();
+ FreeRelationLocInfo(rel->rd_locator_info);
+ RelationBuildLocator(rel);
+ return;
+ }
+ }
+
+ /* code below can be packaged as a func */
+ RelationLocInfo *rd_locator_info = rel->rd_locator_info;
+ Assert(rd_locator_info->buckets_ptr == NULL);
+ rd_locator_info->buckets_ptr = NULL;
+ rd_locator_info->buckets_cnt = 0;
+ if (!IsAutoVacuumWorkerProcess()) {
+ InitBuckets(rd_locator_info, rel);
+ }
+
+ /*
+ * If the locator type is round robin, we set a node to
+ * use next time. In addition, if it is replicated,
+ * we choose a node to use for balancing reads.
+ */
+ if (rd_locator_info->locatorType == LOCATOR_TYPE_RROBIN ||
+ rd_locator_info->locatorType == LOCATOR_TYPE_REPLICATED) {
+ int offset;
+ /*
+ * pick a random one to start with,
+ * since each process will do this independently
+ */
+ offset = compute_modulo(abs(rand()), list_length(rd_locator_info->nodeList));
+
+ srand(time(NULL));
+ rd_locator_info->roundRobinNode = rd_locator_info->nodeList->head; /* initialize */
+ for (int j = 0; j < offset && rd_locator_info->roundRobinNode->next != NULL; j++)
+ rd_locator_info->roundRobinNode = rd_locator_info->roundRobinNode->next;
+ }
+}
+
+static void SpecialWorkForLocalRel(Relation rel)
+{
+ if (RelationIsIndex(rel)) {
+ rel->rd_aminfo = (RelationAmInfo *)MemoryContextAllocZero(rel->rd_indexcxt, sizeof(RelationAmInfo));
+ }
+ SetGttInfo(rel);
+
+ if (unlikely(rel->rd_rel->relkind == RELKIND_MATVIEW) && !rel->rd_isscannable && !heap_is_matview_init_state(rel)) {
+ /* matview may open smgr, whatever, we dont care */
+ rel->rd_isscannable = true;
+ }
+ SpecialWorkOfRelationLocInfo(rel);
+ Assert(rel->rd_mlogoid == InvalidOid ||
+ rel->rd_mlogoid == find_matview_mlog_table(rel->rd_id) ||
+ find_matview_mlog_table(rel->rd_id) == InvalidOid);
+ RelationInitPhysicalAddr(rel);
+ Assert(rel->rd_node.spcNode != InvalidOid);
+ Assert(rel->rd_node.relNode != InvalidOid);
+}
+
+void LocalTabDefCache::CopyLocalRelation(Relation dest, Relation src)
+{
+ MemoryContext rules_cxt = NULL;
+ if (src->rd_rules != NULL) {
+ rules_cxt = AllocSetContextCreate(LocalMyDBCacheMemCxt(), RelationGetRelationName(src),
+ ALLOCSET_SMALL_MINSIZE, ALLOCSET_SMALL_INITSIZE, ALLOCSET_SMALL_MAXSIZE);
+ }
+ MemoryContext rls_cxt = NULL;
+ if (src->rd_rlsdesc != NULL) {
+ rls_cxt = AllocSetContextCreate(LocalMyDBCacheMemCxt(), RelationGetRelationName(src),
+ ALLOCSET_SMALL_MINSIZE, ALLOCSET_SMALL_INITSIZE, ALLOCSET_SMALL_MAXSIZE);
+ }
+ MemoryContext index_cxt = NULL;
+ if (RelationIsIndex(src)) {
+ index_cxt = AllocSetContextCreate(LocalMyDBCacheMemCxt(), RelationGetRelationName(src),
+ ALLOCSET_SMALL_MINSIZE, ALLOCSET_SMALL_INITSIZE, ALLOCSET_SMALL_MAXSIZE);
+ }
+
+ CopyRelationData(dest, src, rules_cxt, rls_cxt, index_cxt);
+ SpecialWorkForLocalRel(dest);
+}
+
+void LocalTabDefCache::Init()
+{
+ if (m_is_inited) {
+ SetLocalRelCacheCriticalRelcachesBuilt(false);
+ SetLocalRelCacheCriticalSharedRelcachesBuilt(false);
+ return;
+ }
+ /* we dont know what dbid is now */
+
+ needNewLocalCacheFile = false;
+ criticalRelcachesBuilt = false;
+ criticalSharedRelcachesBuilt = false;
+
+ relcacheInvalsReceived = 0;
+ initFileRelationIds = NIL;
+ need_eoxact_work = false;
+
+ g_bucketmap_cache = NIL;
+ max_bucket_map_size = BUCKET_MAP_SIZE;
+
+ EOXactTupleDescArray = NULL;
+ NextEOXactTupleDescNum = 0;
+ EOXactTupleDescArrayLen = 0;
+
+ /*
+ * relation mapper needs to be initialized too
+ */
+ RelationMapInitialize();
+ m_is_inited = true;
+}
+
+void LocalTabDefCache::FormrDesc(const char *relationName, Oid relationReltype, bool is_shared, bool hasoids, int natts,
+ const FormData_pg_attribute *attrs)
+{
+ if (SearchRelationFromLocal(attrs[0].attrelid) != NULL) {
+ return;
+ }
+ if (SearchRelationFromGlobalCopy(attrs[0].attrelid) != NULL) {
+ return;
+ }
+ formrdesc(relationName, relationReltype, is_shared, hasoids, natts, attrs);
+ /* fake-up rel, never insert into gsc */
+}
+
+void LocalTabDefCache::LoadCriticalIndex(Oid indexoid, Oid heapoid)
+{
+ if (SearchRelationFromLocal(indexoid) != NULL) {
+ return;
+ }
+ if (SearchRelationFromGlobalCopy(indexoid) != NULL) {
+ return;
+ }
+
+ Relation ird = load_critical_index(indexoid, heapoid);
+ if (IsRelOidStoreInGlobal(indexoid)) {
+ /* system table never need a readwrite lock if not on upgrade mode */
+ uint32 hash_value = oid_hash((void *)&indexoid, sizeof(Oid));
+ InsertRelationIntoGlobal(ird, hash_value);
+ }
+}
+
+void LocalTabDefCache::InitPhase2()
+{
+ if (m_is_inited_phase2) {
+ return;
+ }
+
+ /* load shared relcache only */
+ m_global_shared_tabdefcache = t_thrd.lsc_cxt.lsc->GetSharedTabDefCache();
+
+ MemoryContext oldcxt;
+
+ /*
+ * relation mapper needs initialized too
+ */
+ RelationMapInitializePhase2();
+
+ /*
+ * In bootstrap mode, the shared catalog isn't there yet, so do nothing.
+ */
+ if (IsBootstrapProcessingMode()) {
+ m_is_inited_phase2 = true;
+ return;
+ }
+
+ /*
+ * switch to cache memory context
+ */
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
+
+ /*
+ * Try to load the shared relcache cache file. If unsuccessful, bootstrap
+ * the cache with pre-made descriptors for the critical shared catalogs.
+ */
+
+ FormrDesc("pg_database", DatabaseRelation_Rowtype_Id, true, true, Natts_pg_database, Desc_pg_database);
+ FormrDesc("pg_authid", AuthIdRelation_Rowtype_Id, true, true, Natts_pg_authid, Desc_pg_authid);
+ FormrDesc("pg_auth_members", AuthMemRelation_Rowtype_Id, true, false, Natts_pg_auth_members, Desc_pg_auth_members);
+ FormrDesc("pg_user_status", UserStatusRelation_Rowtype_Id, true, true, Natts_pg_user_status, Desc_pg_user_status);
+
+#define NUM_CRITICAL_SHARED_RELS 4 /* fix if you change list above */
+ (void)MemoryContextSwitchTo(oldcxt);
+ m_is_inited_phase2 = true;
+}
+
+static bool FlushInitRelation(Relation rel)
+{
+ bool restart = false;
+ /*
+ * If it's a faked-up entry, read the real pg_class tuple.
+ */
+ if (rel->rd_rel->relowner == InvalidOid) {
+ RelationCacheInvalidOid(rel);
+
+ /* relowner had better be OK now, else we'll loop forever */
+ if (rel->rd_rel->relowner == InvalidOid)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("invalid relowner in pg_class entry for \"%s\"", RelationGetRelationName(rel))));
+ restart = true;
+ }
+
+ /*
+ * Fix data that isn't saved in relcache cache file.
+ *
+ * relhasrules or relhastriggers could possibly be wrong or out of
+ * date. If we don't actually find any rules or triggers, clear the
+ * local copy of the flag so that we don't get into an infinite loop
+ * here. We don't make any attempt to fix the pg_class entry, though.
+ */
+ if (rel->rd_rel->relhasrules && rel->rd_rules == NULL) {
+ RelationBuildRuleLock(rel);
+ if (rel->rd_rules == NULL)
+ rel->rd_rel->relhasrules = false;
+ restart = true;
+ }
+ if (rel->rd_rel->relhastriggers && rel->trigdesc == NULL) {
+ RelationBuildTriggers(rel);
+ if (rel->trigdesc == NULL)
+ rel->rd_rel->relhastriggers = false;
+ restart = true;
+ }
+
+ /* get row level security policies for this rel */
+ if (RelationEnableRowSecurity(rel) && rel->rd_rlsdesc == NULL) {
+ RelationBuildRlsPolicies(rel);
+ Assert(rel->rd_rlsdesc != NULL);
+ restart = true;
+ }
+ return restart;
+}
+
+void LocalTabDefCache::InitPhase3(void)
+{
+ if (m_is_inited_phase3) {
+ Assert(CheckMyDatabaseMatch());
+ SetLocalRelCacheCriticalRelcachesBuilt(true);
+ SetLocalRelCacheCriticalSharedRelcachesBuilt(true);
+ return;
+ }
+ m_global_tabdefcache = t_thrd.lsc_cxt.lsc->GetGlobalTabDefCache();
+ m_db_id = t_thrd.lsc_cxt.lsc->my_database_id;
+ m_pgclassdesc = NULL;
+ m_pgindexdesc = NULL;
+ MemoryContext oldcxt;
+ /*
+ * relation mapper needs initialized too
+ */
+ RelationMapInitializePhase3();
+
+ /*
+ * switch to cache memory context
+ */
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
+ /*
+ * Try to load the local relcache cache file. If unsuccessful, bootstrap
+ * the cache with pre-made descriptors for the critical "nailed-in" system
+ * catalogs.
+ *
+ * Vacuum-full pg_class will move entries of indexes on pg_class to the end
+ * of pg_class. When bootstraping critical catcaches and relcached from scratch,
+ * we have to do sequential scan for these entries. For databases with millions
+ * of pg_class entries, this could take quite a long time. To make matters worse,
+ * when multiple backends parallelly do this, they may block one another severly
+ * due to lock on the same share buffer partition. To avoid such case, we only allow
+ * one backend to bootstrap critical catcaches at one time. When it is done, the other
+ * parallel backends would first try to load from init file once again.
+ * Since share catalogs usually have much less entries, we only do so for local catalogs
+ * at present.
+ */
+ FormrDesc("pg_class", RelationRelation_Rowtype_Id, false, true, Natts_pg_class, Desc_pg_class);
+ FormrDesc("pg_attribute", AttributeRelation_Rowtype_Id, false, false, Natts_pg_attribute, Desc_pg_attribute);
+ FormrDesc("pg_proc", ProcedureRelation_Rowtype_Id, false, true, Natts_pg_proc, Desc_pg_proc);
+ FormrDesc("pg_type", TypeRelation_Rowtype_Id, false, true, Natts_pg_type, Desc_pg_type);
+ (void)MemoryContextSwitchTo(oldcxt);
+#define NUM_CRITICAL_LOCAL_RELS 4 /* fix if you change list above */
+ if (IsBootstrapProcessingMode()) {
+ /* In bootstrap mode, the faked-up formrdesc info is all we'll have */
+ m_is_inited_phase3 = true;
+ return;
+ }
+
+ /*
+ * If we didn't get the critical system indexes loaded into relcache, do
+ * so now. These are critical because the catcache and/or opclass cache
+ * depend on them for fetches done during relcache load. Thus, we have an
+ * infinite-recursion problem. We can break the recursion by doing
+ * heapscans instead of indexscans at certain key spots. To avoid hobbling
+ * performance, we only want to do that until we have the critical indexes
+ * loaded into relcache. Thus, the flag u_sess->relcache_cxt.criticalRelcachesBuilt is used to
+ * decide whether to do heapscan or indexscan at the key spots, and we set
+ * it true after we've loaded the critical indexes.
+ *
+ * The critical indexes are marked as "nailed in cache", partly to make it
+ * easy for load_relcache_init_file to count them, but mainly because we
+ * cannot flush and rebuild them once we've set u_sess->relcache_cxt.criticalRelcachesBuilt to
+ * true. (NOTE: perhaps it would be possible to reload them by
+ * temporarily setting u_sess->relcache_cxt.criticalRelcachesBuilt to false again. For now,
+ * though, we just nail 'em in.)
+ *
+ * RewriteRelRulenameIndexId and TriggerRelidNameIndexId are not critical
+ * in the same way as the others, because the critical catalogs don't
+ * (currently) have any rules or triggers, and so these indexes can be
+ * rebuilt without inducing recursion. However they are used during
+ * relcache load when a rel does have rules or triggers, so we choose to
+ * nail them for performance reasons.
+ */
+ /* we dont load from file */
+ Assert(!LocalRelCacheCriticalRelcachesBuilt());
+ LoadCriticalIndex(ClassOidIndexId, RelationRelationId);
+ LoadCriticalIndex(AttributeRelidNumIndexId, AttributeRelationId);
+ LoadCriticalIndex(IndexRelidIndexId, IndexRelationId);
+ LoadCriticalIndex(OpclassOidIndexId, OperatorClassRelationId);
+ LoadCriticalIndex(AccessMethodProcedureIndexId, AccessMethodProcedureRelationId);
+ LoadCriticalIndex(RewriteRelRulenameIndexId, RewriteRelationId);
+ LoadCriticalIndex(TriggerRelidNameIndexId, TriggerRelationId);
+#define NUM_CRITICAL_LOCAL_INDEXES 7 /* fix if you change list above */
+ SetLocalRelCacheCriticalRelcachesBuilt(true);
+
+ /*
+ * Process critical shared indexes too.
+ *
+ * DatabaseNameIndexId isn't critical for relcache loading, but rather for
+ * initial lookup of u_sess->proc_cxt.MyDatabaseId, without which we'll never find any
+ * non-shared catalogs at all. Autovacuum calls InitPostgres with a
+ * database OID, so it instead depends on DatabaseOidIndexId. We also
+ * need to nail up some indexes on pg_authid and pg_auth_members for use
+ * during client authentication.
+ */
+ Assert(!LocalRelCacheCriticalSharedRelcachesBuilt());
+ LoadCriticalIndex(DatabaseNameIndexId, DatabaseRelationId);
+ LoadCriticalIndex(DatabaseOidIndexId, DatabaseRelationId);
+ LoadCriticalIndex(AuthIdRolnameIndexId, AuthIdRelationId);
+ LoadCriticalIndex(AuthIdOidIndexId, AuthIdRelationId);
+ LoadCriticalIndex(AuthMemMemRoleIndexId, AuthMemRelationId);
+ LoadCriticalIndex(UserStatusRoleidIndexId, UserStatusRelationId);
+#define NUM_CRITICAL_SHARED_INDEXES 6 /* fix if you change list above */
+ SetLocalRelCacheCriticalSharedRelcachesBuilt(true);
+
+ /*
+ * Now, scan all the relcache entries and update anything that might be
+ * wrong in the results from formrdesc or the relcache cache file. If we
+ * faked up relcache entries using formrdesc, then read the real pg_class
+ * rows and replace the fake entries with them. Also, if any of the
+ * relcache entries have rules or triggers, load that info the hard way
+ * since it isn't recorded in the cache file.
+ *
+ * Whenever we access the catalogs to read data, there is a possibility of
+ * a shared-inval cache flush causing relcache entries to be removed.
+ * Since hash_seq_search only guarantees to still work after the *current*
+ * entry is removed, it's unsafe to continue the hashtable scan afterward.
+ * We handle this by restarting the scan from scratch after each access.
+ * This is theoretically O(N^2), but the number of entries that actually
+ * need to be fixed is small enough that it doesn't matter.
+ */
+ Dlelem *bucket_elt;
+ forloopactivebucketlist(bucket_elt, m_bucket_list.GetActiveBucketList()) {
+ Dlelem *elt;
+ forloopbucket(elt, bucket_elt) {
+ LocalRelationEntry *entry = (LocalRelationEntry *)DLE_VAL(elt);
+ Assert(entry->rel->entry == entry);
+ elt = DLGetSucc(elt);
+ Relation rel = entry->rel;
+ /*
+ * Make sure *this* entry doesn't get flushed while we work with it.
+ */
+ RelationIncrementReferenceCount(rel);
+ bool restart = FlushInitRelation(rel);
+ /* Release hold on the rel */
+ RelationDecrementReferenceCount(rel);
+
+ /* Now, restart the hashtable scan if needed */
+ if (restart) {
+ if (IsRelOidStoreInGlobal(rel->rd_id)) {
+ /* system table never need a readwrite lock if not on upgrade mode */
+ uint32 hash_value = oid_hash((void *)&(rel->rd_id), sizeof(Oid));
+ InsertRelationIntoGlobal(rel, hash_value);
+ }
+ bucket_elt = DLGetHead(m_bucket_list.GetActiveBucketList());
+ elt = NULL;
+ }
+ }
+ }
+ m_is_inited_phase3 = true;
+#ifdef MEMORY_CONTEXT_CHECKING
+ MemoryContextCheck(LocalMyDBCacheMemCxt(), false);
+#endif
+}
+
+void LocalTabDefCache::InvalidateGlobalRelation(Oid db_id, Oid rel_oid, bool is_commit)
+{
+ if (unlikely(db_id == InvalidOid && rel_oid == InvalidOid)) {
+ /* This is used by alter publication as changes in publications may affect
+ * large number of tables. see function CacheInvalidateRelcacheAll */
+ g_instance.global_sysdbcache.InvalidAllRelations();
+ return;
+ }
+ if (!is_commit) {
+ invalid_entries.InsertInvalidDefValue(rel_oid);
+ return;
+ }
+ if (db_id == InvalidOid) {
+ t_thrd.lsc_cxt.lsc->GetSharedTabDefCache()->Invalidate(db_id, rel_oid);
+ } else if (m_global_tabdefcache == NULL) {
+ Assert(!m_is_inited_phase3);
+ Assert(CheckMyDatabaseMatch());
+ GlobalSysDBCacheEntry *entry = g_instance.global_sysdbcache.FindTempGSCEntry(db_id);
+ if (entry == NULL) {
+ return;
+ }
+ entry->m_tabdefCache->Invalidate(db_id, rel_oid);
+ g_instance.global_sysdbcache.ReleaseTempGSCEntry(entry);
+ } else {
+ Assert(CheckMyDatabaseMatch());
+ Assert(m_db_id == t_thrd.lsc_cxt.lsc->my_database_id);
+ Assert(m_db_id == db_id);
+ m_global_tabdefcache->Invalidate(db_id, rel_oid);
+ }
+}
+
+void LocalTabDefCache::InvalidateRelationAll()
+{
+ /*
+ * Reload relation mapping data before starting to reconstruct cache.
+ */
+ RelationMapInvalidateAll();
+
+ List *rebuildFirstList = NIL;
+ List *rebuildList = NIL;
+ Dlelem *bucket_elt;
+ forloopactivebucketlist(bucket_elt, m_bucket_list.GetActiveBucketList()) {
+ Dlelem *elt;
+ forloopbucket(elt, bucket_elt) {
+ LocalRelationEntry *entry = (LocalRelationEntry *)DLE_VAL(elt);
+ Assert(entry->rel->entry == entry);
+ elt = DLGetSucc(elt);
+ Relation rel = entry->rel;
+ /* Must close all smgr references to avoid leaving dangling ptrs */
+ RelationCloseSmgr(rel);
+
+ /* Ignore new rels, since they are never cross-backend targets */
+ if (rel->rd_createSubid != InvalidSubTransactionId) {
+ continue;
+ }
+ AddLocalRelCacheInvalsReceived(1);
+
+ if (RelationHasReferenceCountZero(rel)) {
+ /* Delete this entry immediately */
+ Assert(!rel->rd_isnailed);
+ RelationClearRelation(rel, false);
+ } else {
+ /*
+ * If it's a mapped rel, immediately update its rd_node in
+ * case its relfilenode changed. We must do this during phase 1
+ * in case the rel is consulted during rebuild of other
+ * relcache entries in phase 2. It's safe since consulting the
+ * map doesn't involve any access to relcache entries.
+ */
+ if (RelationIsMapped(rel))
+ RelationInitPhysicalAddr(rel);
+
+ /*
+ * Add this entry to list of stuff to rebuild in second pass.
+ * pg_class goes to the front of rebuildFirstList while
+ * pg_class_oid_index goes to the back of rebuildFirstList, so
+ * they are done first and second respectively. Other nailed
+ * rels go to the front of rebuildList, so they'll be done
+ * next in no particular order; and everything else goes to the
+ * back of rebuildList.
+ */
+ if (RelationGetRelid(rel) == RelationRelationId)
+ rebuildFirstList = lcons(rel, rebuildFirstList);
+ else if (RelationGetRelid(rel) == ClassOidIndexId)
+ rebuildFirstList = lappend(rebuildFirstList, rel);
+ else if (rel->rd_isnailed)
+ rebuildList = lcons(rel, rebuildList);
+ else
+ rebuildList = lappend(rebuildList, rel);
+ }
+ /* RelationClearRelation call RelationCacheDelete to remove rel not rebuilt
+ * RelationClearRelation needn't insert into global, global already updated */
+ }
+ }
+
+ /*
+ * Now zap any remaining smgr cache entries. This must happen before we
+ * start to rebuild entries, since that may involve catalog fetches which
+ * will re-open catalog files.
+ */
+ smgrcloseall();
+ ListCell *l = NULL;
+ /* Phase 2: rebuild the items found to need rebuild in phase 1 */
+ foreach (l, rebuildFirstList) {
+ Relation rel = (Relation)lfirst(l);
+ /* RelationClearRelation call RelationBuildDesc to rebuild the rel,
+ * and RelationBuildDesc call SEARCH_RELATION_FROM_GLOBAL to search first */
+ RelationClearRelation(rel, true);
+ }
+ list_free_ext(rebuildFirstList);
+ foreach (l, rebuildList) {
+ Relation rel = (Relation)lfirst(l);
+ RelationClearRelation(rel, true);
+ }
+ list_free_ext(rebuildList);
+}
+
+void LocalTabDefCache::InvalidateRelationNodeList()
+{
+ Dlelem *bucket_elt;
+ forloopactivebucketlist(bucket_elt, m_bucket_list.GetActiveBucketList()) {
+ Dlelem *elt;
+ forloopbucket(elt, bucket_elt) {
+ LocalRelationEntry *entry = (LocalRelationEntry *)DLE_VAL(elt);
+ Assert(entry->rel->entry == entry);
+ elt = DLGetSucc(elt);
+ Relation rel = entry->rel;
+ if (rel->rd_locator_info != NULL) {
+ RelationClearRelation(rel, !RelationHasReferenceCountZero(rel));
+ }
+ }
+ }
+}
+
+void LocalTabDefCache::InvalidateRelationBucketsAll()
+{
+ Dlelem *bucket_elt;
+ forloopactivebucketlist(bucket_elt, m_bucket_list.GetActiveBucketList()) {
+ Dlelem *elt;
+ forloopbucket(elt, bucket_elt) {
+ LocalRelationEntry *entry = (LocalRelationEntry *)DLE_VAL(elt);
+ Assert(entry->rel->entry == entry);
+ elt = DLGetSucc(elt);
+ Relation rel = entry->rel;
+ if (rel->rd_locator_info != NULL) {
+ InvalidateBuckets(rel->rd_locator_info);
+ }
+ }
+ }
+}
+
+void LocalTabDefCache::RememberToFreeTupleDescAtEOX(TupleDesc td)
+{
+ if (EOXactTupleDescArray == NULL) {
+ MemoryContext oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
+ EOXactTupleDescArrayLen = 16;
+ EOXactTupleDescArray = (TupleDesc *)palloc(EOXactTupleDescArrayLen * sizeof(TupleDesc));
+ NextEOXactTupleDescNum = 0;
+ MemoryContextSwitchTo(oldcxt);
+ } else if (NextEOXactTupleDescNum >= EOXactTupleDescArrayLen) {
+ int32 newlen = EOXactTupleDescArrayLen * 2;
+ Assert(EOXactTupleDescArrayLen > 0);
+ EOXactTupleDescArray = (TupleDesc *)repalloc(EOXactTupleDescArray, newlen * sizeof(TupleDesc));
+ EOXactTupleDescArrayLen = newlen;
+ }
+ EOXactTupleDescArray[NextEOXactTupleDescNum++] = td;
+}
+
+/* Free all tupleDescs remembered in RememberToFreeTupleDescAtEOX in a batch when a transaction ends */
+void LocalTabDefCache::AtEOXact_FreeTupleDesc()
+{
+ if (EOXactTupleDescArrayLen > 0) {
+ Assert(EOXactTupleDescArray != NULL);
+ for (int i = 0; i < NextEOXactTupleDescNum; i++) {
+ Assert(EOXactTupleDescArray[i]->tdrefcount == 0);
+ FreeTupleDesc(EOXactTupleDescArray[i]);
+ }
+ pfree_ext(EOXactTupleDescArray);
+ }
+ NextEOXactTupleDescNum = 0;
+ EOXactTupleDescArrayLen = 0;
+}
+
+/*
+ * AtEOXact_RelationCache
+ *
+ * Clean up the relcache at main-transaction commit or abort.
+ *
+ * Note: this must be called *before* processing invalidation messages.
+ * In the case of abort, we don't want to try to rebuild any invalidated
+ * cache entries (since we can't safely do database accesses). Therefore
+ * we must reset refcnts before handling pending invalidations.
+ *
+ *
+ */
+void LocalTabDefCache::AtEOXact_RelationCache(bool isCommit)
+{
+ invalid_entries.ResetInitFlag();
+#ifdef MEMORY_CONTEXT_CHECKING
+ MemoryContextCheck(LocalMyDBCacheMemCxt(), false);
+#endif
+ /*
+ * To speed up transaction exit, we want to avoid scanning the relcache
+ * unless there is actually something for this routine to do. Other than
+ * the debug-only Assert checks, most transactions don't create any work
+ * for us to do here, so we keep a static flag that gets set if there is
+ * anything to do. (Currently, this means either a relation is created in
+ * the current xact, or one is given a new relfilenode, or an index list
+ * is forced.) For simplicity, the flag remains set till end of top-level
+ * transaction, even though we could clear it at subtransaction end in
+ * some cases.
+ */
+ if (!LocalRelCacheNeedEOXactWork()
+#ifdef USE_ASSERT_CHECKING
+ && !assert_enabled
+#endif
+ ) {
+ return;
+ }
+
+ Dlelem *bucket_elt;
+ forloopactivebucketlist(bucket_elt, m_bucket_list.GetActiveBucketList()) {
+ Dlelem *elt;
+ forloopbucket(elt, bucket_elt) {
+ LocalRelationEntry *entry = (LocalRelationEntry *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ Relation rel = entry->rel;
+
+ /*
+ * The relcache entry's ref count should be back to its normal
+ * not-in-a-transaction state: 0 unless it's nailed in cache.
+ *
+ * In bootstrap mode, this is NOT true, so don't check it --- the
+ * bootstrap code expects rels to stay open across start/commit
+ * transaction calls. (That seems bogus, but it's not worth fixing.)
+ */
+ if (!IsBootstrapProcessingMode()) {
+ int expected_refcnt;
+
+ expected_refcnt = rel->rd_isnailed ? 1 : 0;
+ if (rel->rd_refcnt != expected_refcnt && IsolatedResourceOwner != NULL) {
+ elog(WARNING, "relation \"%s\" rd_refcnt is %d but expected_refcnt %d. ",
+ RelationGetRelationName(rel), rel->rd_refcnt, expected_refcnt);
+ PrintResourceOwnerLeakWarning();
+ }
+#ifdef USE_ASSERT_CHECKING
+ Assert(rel->rd_refcnt == expected_refcnt);
+#endif
+ }
+
+ /*
+ * Is it a rel created in the current transaction?
+ *
+ * During commit, reset the flag to zero, since we are now out of the
+ * creating transaction. During abort, simply delete the relcache
+ * entry --- it isn't interesting any longer. (NOTE: if we have
+ * forgotten the new-ness of a new rel due to a forced cache
+ * flush, the entry will get deleted anyway by shared-cache-inval
+ * processing of the aborted pg_class insertion.)
+ */
+ if (rel->rd_createSubid != InvalidSubTransactionId) {
+ if (isCommit)
+ rel->rd_createSubid = InvalidSubTransactionId;
+ else if (RelationHasReferenceCountZero(rel)) {
+ RelationClearRelation(rel, false);
+ continue;
+ } else {
+ /*
+ * Hmm, somewhere there's a (leaked?) reference to the rel.
+ * We daren't remove the entry for fear of dereferencing a
+ * dangling pointer later. Bleat, and mark it as not belonging to
+ * the current transaction. Hopefully it'll get cleaned up
+ * eventually. This must be just a WARNING to avoid
+ * error-during-error-recovery loops.
+ */
+ rel->rd_createSubid = InvalidSubTransactionId;
+ ereport(WARNING, (errmsg("cannot remove relcache entry for \"%s\" because it has nonzero refcount",
+ RelationGetRelationName(rel))));
+ }
+ }
+
+ /*
+ * Likewise, reset the hint about the relfilenode being new.
+ */
+ rel->rd_newRelfilenodeSubid = InvalidSubTransactionId;
+
+ /*
+ * Flush any temporary index list.
+ */
+ if (rel->rd_indexvalid == 2) {
+ list_free_ext(rel->rd_indexlist);
+ rel->rd_indexlist = NIL;
+ rel->rd_oidindex = InvalidOid;
+ rel->rd_indexvalid = 0;
+ }
+ if (rel->partMap != NULL && unlikely(rel->partMap->isDirty)) {
+ RelationClearRelation(rel, false);
+ }
+ }
+ }
+ /* Once done with the transaction, we can reset u_sess->relcache_cxt.need_eoxact_work */
+ SetLocalRelCacheNeedEOXactWork(false);
+}
+
+/*
+ * AtEOSubXact_RelationCache
+ *
+ * Clean up the relcache at sub-transaction commit or abort.
+ *
+ * Note: this must be called *before* processing invalidation messages.
+ */
+void LocalTabDefCache::AtEOSubXact_RelationCache(bool isCommit, SubTransactionId mySubid, SubTransactionId parentSubid)
+{
+ /* dont update global info here, even we commit this relation create operator */
+ /*
+ * Skip the relcache scan if nothing to do --- see notes for
+ * AtEOXact_RelationCache.
+ */
+ if (!LocalRelCacheNeedEOXactWork())
+ return;
+
+ Dlelem *bucket_elt;
+ forloopactivebucketlist(bucket_elt, m_bucket_list.GetActiveBucketList()) {
+ Dlelem *elt;
+ forloopbucket(elt, bucket_elt) {
+ LocalRelationEntry *entry = (LocalRelationEntry *)DLE_VAL(elt);
+ elt = DLGetSucc(elt);
+ Relation rel = entry->rel;
+
+ /*
+ * Is it a rel created in the current subtransaction?
+ *
+ * During subcommit, mark it as belonging to the parent, instead.
+ * During subabort, simply delete the relcache entry.
+ */
+ if (rel->rd_createSubid == mySubid) {
+ if (isCommit)
+ rel->rd_createSubid = parentSubid;
+ else if (RelationHasReferenceCountZero(rel)) {
+ RelationClearRelation(rel, false);
+ continue;
+ } else {
+ /*
+ * Hmm, somewhere there's a (leaked?) reference to the rel.
+ * We daren't remove the entry for fear of dereferencing a
+ * dangling pointer later. Bleat, and transfer it to the parent
+ * subtransaction so we can try again later. This must be just a
+ * WARNING to avoid error-during-error-recovery loops.
+ */
+ rel->rd_createSubid = parentSubid;
+ ereport(WARNING, (errmsg("cannot remove relcache entry for \"%s\" because it has nonzero refcount",
+ RelationGetRelationName(rel))));
+ }
+ }
+
+ /*
+ * Likewise, update or drop any new-relfilenode-in-subtransaction
+ * hint.
+ */
+ if (rel->rd_newRelfilenodeSubid == mySubid) {
+ if (isCommit)
+ rel->rd_newRelfilenodeSubid = parentSubid;
+ else
+ rel->rd_newRelfilenodeSubid = InvalidSubTransactionId;
+ }
+
+ /*
+ * Flush any temporary index list.
+ */
+ if (rel->rd_indexvalid == 2) {
+ list_free_ext(rel->rd_indexlist);
+ rel->rd_indexlist = NIL;
+ rel->rd_oidindex = InvalidOid;
+ rel->rd_indexvalid = 0;
+ }
+ }
+ }
+}
+
+Relation LocalTabDefCache::RelationIdGetRelation(Oid rel_oid)
+{
+ Assert(CheckMyDatabaseMatch());
+ Relation rd = SearchRelation(rel_oid);
+ if (RelationIsValid(rd)) {
+ RelationIncrementReferenceCount(rd);
+ /* revalidate cache entry if necessary */
+ if (!rd->rd_isvalid) {
+ /*
+ * Indexes only have a limited number of possible schema changes,
+ * and we don't want to use the full-blown procedure because it's
+ * a headache for indexes that reload itself depends on.
+ */
+ if (RelationIsIndex(rd)) {
+ RelationReloadIndexInfo(rd);
+ } else {
+ RelationClearRelation(rd, true);
+ }
+ }
+
+ /*
+ * In some cases, after the relcache is built, the temp table's node group is dropped
+ * because of cluster resizeing, so we should do checking when get the rel directly from
+ * relcache.
+ */
+ if (rd->rd_rel->relpersistence == RELPERSISTENCE_TEMP)
+ (void)checkGroup(rel_oid, RELATION_IS_OTHER_TEMP(rd));
+
+ return rd;
+ }
+
+ /*
+ * no reldesc in the cache, so have RelationBuildDesc() build one and add
+ * it.
+ */
+ Assert(m_is_inited_phase2);
+ bool is_oid_store_in_global = IsRelOidStoreInGlobal(rel_oid);
+ /* sys table dont need a rwlock */
+ Assert(m_global_tabdefcache != NULL || g_instance.global_sysdbcache.HashSearchSharedRelation(rel_oid));
+ bool has_concurrent_lock = is_oid_store_in_global &&
+ !IsSystemObjOid(rel_oid);
+ uint32 hash_value = oid_hash((void *)&(rel_oid), sizeof(Oid));
+ pthread_rwlock_t *oid_lock = NULL;
+ if (has_concurrent_lock) {
+ oid_lock = m_global_tabdefcache->GetHashValueLock(hash_value);
+ AcquireGSCTableReadLock(&has_concurrent_lock, oid_lock);
+ }
+ rd = RelationBuildDesc(rel_oid, true, true);
+ /* system table dont insert into global only when upgrading, who never be modified except on upgrade mode */
+ if (RelationIsValid(rd) && is_oid_store_in_global && (IsSystemObjOid(rel_oid) || has_concurrent_lock)) {
+ InsertRelationIntoGlobal(rd, hash_value);
+ }
+ if (has_concurrent_lock) {
+ ReleaseGSCTableReadLock(&has_concurrent_lock, oid_lock);
+ }
+
+ if (RelationIsValid(rd)) {
+ RelationIncrementReferenceCount(rd);
+ /* Insert TDE key to buffer cache for tde table */
+ if (g_instance.attr.attr_security.enable_tde && IS_PGXC_DATANODE && RelationisEncryptEnable(rd)) {
+ RelationInsertTdeInfoToCache(rd);
+ }
+ }
+
+ return rd;
+}
+
+void LocalTabDefCache::ResetInitFlag()
+{
+ m_bucket_list.ResetContent();
+ invalid_entries.ResetInitFlag();
+ needNewLocalCacheFile = false;
+ criticalRelcachesBuilt = false;
+ criticalSharedRelcachesBuilt = false;
+
+ relcacheInvalsReceived = 0;
+ initFileRelationIds = NIL;
+ need_eoxact_work = false;
+
+ g_bucketmap_cache = NIL;
+ max_bucket_map_size = 0;
+
+ EOXactTupleDescArray = NULL;
+ NextEOXactTupleDescNum = 0;
+ EOXactTupleDescArrayLen = 0;
+
+ m_global_tabdefcache = NULL;
+ m_pgclassdesc = NULL;
+ m_pgindexdesc = NULL;
+ m_global_shared_tabdefcache = NULL;
+
+ m_is_inited = false;
+ m_is_inited_phase2 = false;
+ m_is_inited_phase3 = false;
+
+ m_db_id = InvalidOid;
+}
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/lsyscache.cpp b/src/common/backend/utils/cache/lsyscache.cpp
index 37cb7686a..4485b621b 100644
--- a/src/common/backend/utils/cache/lsyscache.cpp
+++ b/src/common/backend/utils/cache/lsyscache.cpp
@@ -233,7 +233,7 @@ bool get_ordering_op_properties(Oid opno, Oid* opfamily, Oid* opcintype, int16*
*/
catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple tuple = &catlist->members[i]->tuple;
+ HeapTuple tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_amop aform = (Form_pg_amop)GETSTRUCT(tuple);
/* must be btree */
if (!OID_IS_BTREE(aform->amopmethod)) {
@@ -404,7 +404,7 @@ Oid get_ordering_op_for_equality_op(Oid opno, bool use_lhs_type)
*/
catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple tuple = &catlist->members[i]->tuple;
+ HeapTuple tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_amop aform = (Form_pg_amop)GETSTRUCT(tuple);
/* must be btree */
if (!OID_IS_BTREE(aform->amopmethod)) {
@@ -456,7 +456,7 @@ List* get_mergejoin_opfamilies(Oid opno)
catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple tuple = &catlist->members[i]->tuple;
+ HeapTuple tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_amop aform = (Form_pg_amop)GETSTRUCT(tuple);
/* must be btree equality */
if (OID_IS_BTREE(aform->amopmethod) && aform->amopstrategy == BTEqualStrategyNumber) {
@@ -501,7 +501,7 @@ bool get_compatible_hash_operators(Oid opno, Oid* lhs_opno, Oid* rhs_opno)
*/
catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple tuple = &catlist->members[i]->tuple;
+ HeapTuple tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_amop aform = (Form_pg_amop)GETSTRUCT(tuple);
if (aform->amopmethod == HASH_AM_OID && aform->amopstrategy == HTEqualStrategyNumber) {
/* No extra lookup needed if given operator is single-type */
@@ -586,7 +586,7 @@ bool get_op_hash_functions(Oid opno, RegProcedure* lhs_procno, RegProcedure* rhs
catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple tuple = &catlist->members[i]->tuple;
+ HeapTuple tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_amop aform = (Form_pg_amop)GETSTRUCT(tuple);
if (aform->amopmethod == HASH_AM_OID && aform->amopstrategy == HTEqualStrategyNumber) {
@@ -653,7 +653,7 @@ List* get_op_btree_interpretation(Oid opno)
*/
catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno));
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple op_tuple = &catlist->members[i]->tuple;
+ HeapTuple op_tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_amop op_form = (Form_pg_amop)GETSTRUCT(op_tuple);
StrategyNumber op_strategy;
/* must be btree */
@@ -680,7 +680,7 @@ List* get_op_btree_interpretation(Oid opno)
if (OidIsValid(op_negator)) {
catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(op_negator));
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple op_tuple = &catlist->members[i]->tuple;
+ HeapTuple op_tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_amop op_form = (Form_pg_amop)GETSTRUCT(op_tuple);
StrategyNumber op_strategy;
/* must be btree */
@@ -734,7 +734,7 @@ bool equality_ops_are_compatible(Oid opno1, Oid opno2)
catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno1));
result = false;
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple op_tuple = &catlist->members[i]->tuple;
+ HeapTuple op_tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_amop op_form = (Form_pg_amop)GETSTRUCT(op_tuple);
/* must be btree or hash */
if (OID_IS_BTREE(op_form->amopmethod) || op_form->amopmethod == HASH_AM_OID) {
@@ -1518,7 +1518,7 @@ char* get_func_langname(Oid funcid)
ereport(ERROR, (errcode(ERRCODE_CACHE_LOOKUP_FAILED), errmsg("cache lookup failed for function %u", funcid)));
}
Datum datum = heap_getattr(tp, Anum_pg_proc_prolang, RelationGetDescr(relation), &isNull);
- langoid = DatumGetInt16(datum);
+ langoid = DatumGetObjectId(datum);
heap_close(relation, NoLock);
ReleaseSysCache(tp);
@@ -1729,7 +1729,6 @@ Oid get_valid_relname_relid(const char* relnamespace, const char* relname)
Oid oldnspid = InvalidOid;
Oid relid = InvalidOid;
Oid oldrelid = InvalidOid;
- uint64 inval_count = 0;
bool retry = false;
Assert(relnamespace != NULL);
Assert(relname != NULL);
@@ -1741,8 +1740,13 @@ Oid get_valid_relname_relid(const char* relnamespace, const char* relname)
* the answer doesn't change.
*
*/
+ uint64 sess_inval_count;
+ uint64 thrd_inval_count = 0;
for (;;) {
- inval_count = u_sess->inval_cxt.SharedInvalidMessageCounter;
+ sess_inval_count = u_sess->inval_cxt.SIMCounter;
+ if (EnableLocalSysCache()) {
+ thrd_inval_count = t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter;
+ }
nspid = get_namespace_oid(relnamespace, false);
relid = get_relname_relid(relname, nspid);
/*
@@ -1797,8 +1801,15 @@ Oid get_valid_relname_relid(const char* relnamespace, const char* relname)
LockDatabaseObject(NamespaceRelationId, nspid, 0, AccessShareLock);
}
/* If no invalidation message were processed, we're done! */
- if (inval_count == u_sess->inval_cxt.SharedInvalidMessageCounter) {
- break;
+ if (EnableLocalSysCache()) {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter &&
+ thrd_inval_count == t_thrd.lsc_cxt.lsc->inval_cxt.SIMCounter) {
+ break;
+ }
+ } else {
+ if (sess_inval_count == u_sess->inval_cxt.SIMCounter) {
+ break;
+ }
}
/*
* Let's repeat the name lookup, to make
@@ -2597,7 +2608,7 @@ Oid get_pgxc_nodeoid(const char* nodename)
int i;
memlist = SearchSysCacheList1(PGXCNODENAME, PointerGetDatum(nodename));
for (i = 0; i < memlist->n_members; i++) {
- HeapTuple tup = &memlist->members[i]->tuple;
+ HeapTuple tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(memlist, i);
char node_type = ((Form_pgxc_node)GETSTRUCT(tup))->node_type;
if (node_type == PGXC_NODE_COORDINATOR || node_type == PGXC_NODE_DATANODE) {
node_oid = HeapTupleGetOid(tup);
@@ -2615,7 +2626,7 @@ Oid get_pgxc_datanodeoid(const char* nodename, bool missingOK)
int i;
memlist = SearchSysCacheList1(PGXCNODENAME, PointerGetDatum(nodename));
for (i = 0; i < memlist->n_members; i++) {
- HeapTuple tup = &memlist->members[i]->tuple;
+ HeapTuple tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(memlist, i);
char node_type = ((Form_pgxc_node)GETSTRUCT(tup))->node_type;
if (node_type == PGXC_NODE_DATANODE) {
dn_oid = HeapTupleGetOid(tup);
@@ -2657,7 +2668,7 @@ bool check_pgxc_node_name_is_exist(
Assert(host != NULL);
memlist = SearchSysCacheList1(PGXCNODENAME, PointerGetDatum(nodename));
for (i = 0; i < memlist->n_members; i++) {
- HeapTuple tup = &memlist->members[i]->tuple;
+ HeapTuple tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(memlist, i);
const char* host_exist = NameStr(((Form_pgxc_node)GETSTRUCT(tup))->node_host);
int port_exist = ((Form_pgxc_node)GETSTRUCT(tup))->node_port;
int comm_sctp_port_exist = ((Form_pgxc_node)GETSTRUCT(tup))->sctp_port;
@@ -2745,7 +2756,7 @@ void get_node_info(const char* nodename, bool* node_is_ccn, ItemPointer tuple_po
heap_close(rel, AccessShareLock);
return;
}
- tuple = &memlist->members[0]->tuple;
+ tuple = t_thrd.lsc_cxt.FetchTupleFromCatCList(memlist, 0);
/* get nodeis_central for the node */
Datum centralDatum = SysCacheGetAttr(PGXCNODEOID, tuple, Anum_pgxc_node_is_central, &is_null);
if (!is_null) {
@@ -2861,7 +2872,7 @@ bool is_pgxc_central_nodename(const char* nodename)
is_central = false;
goto result;
}
- tup = &memlist->members[0]->tuple;
+ tup = t_thrd.lsc_cxt.FetchTupleFromCatCList(memlist, 0);
central_datum = ((Form_pgxc_node)GETSTRUCT(tup))->nodeis_central;
is_central = DatumGetBool(central_datum);
result:
@@ -5041,7 +5052,7 @@ Oid get_func_oid(const char* funcname, Oid funcnamespace, Expr* expr)
/* Search syscache by name only */
#ifndef ENABLE_MULTIPLE_NODES
- if (u_sess->attr.attr_common.IsInplaceUpgrade) {
+ if (t_thrd.proc->workingVersionNum < 92470) {
catlist = SearchSysCacheList1(PROCNAMEARGSNSP, CStringGetDatum(funcname));
} else {
catlist = SearchSysCacheList1(PROCALLARGS, CStringGetDatum(funcname));
@@ -5075,7 +5086,7 @@ Oid get_func_oid(const char* funcname, Oid funcnamespace, Expr* expr)
catlist = SearchSysCacheList1(PROCNAMEARGSNSP, CStringGetDatum(funcname));
#endif
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple proctup = &catlist->members[i]->tuple;
+ HeapTuple proctup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_proc procform = (Form_pg_proc)GETSTRUCT(proctup);
if (OidIsValid(funcnamespace)) {
/* Consider only procs in specified namespace */
@@ -5138,8 +5149,9 @@ Oid get_func_oid(const char* funcname, Oid funcnamespace, Expr* expr)
continue;
}
+ Oid func_oid = HeapTupleGetOid(proctup);
ReleaseSysCacheList(catlist);
- return HeapTupleGetOid(proctup);
+ return func_oid;
}
ReleaseSysCacheList(catlist);
return InvalidOid;
@@ -5160,7 +5172,7 @@ Oid get_func_oid_ext(const char* funcname, Oid funcnamespace, Oid funcrettype, i
catlist = SearchSysCacheList1(PROCNAMEARGSNSP, CStringGetDatum(funcname));
#endif
for (i = 0; i < catlist->n_members; i++) {
- HeapTuple proctup = &catlist->members[i]->tuple;
+ HeapTuple proctup = t_thrd.lsc_cxt.FetchTupleFromCatCList(catlist, i);
Form_pg_proc procform = (Form_pg_proc)GETSTRUCT(proctup);
if (OidIsValid(funcnamespace)) {
/* Consider only procs in specified namespace */
@@ -5186,8 +5198,9 @@ Oid get_func_oid_ext(const char* funcname, Oid funcnamespace, Oid funcrettype, i
if (j < funcnargs) {
continue;
}
+ Oid func_oid = HeapTupleGetOid(proctup);
ReleaseSysCacheList(catlist);
- return HeapTupleGetOid(proctup);
+ return func_oid;
}
ReleaseSysCacheList(catlist);
return InvalidOid;
diff --git a/src/common/backend/utils/cache/partcache.cpp b/src/common/backend/utils/cache/partcache.cpp
index 42f431fee..2979c7025 100644
--- a/src/common/backend/utils/cache/partcache.cpp
+++ b/src/common/backend/utils/cache/partcache.cpp
@@ -24,6 +24,7 @@
#include "postgres.h"
#include "knl/knl_variable.h"
#include
+#include "access/csnlog.h"
#include "access/reloptions.h"
#include "access/sysattr.h"
#include "access/transam.h"
@@ -58,7 +59,6 @@
#include "rewrite/rewriteDefine.h"
#include "rewrite/rewriteHandler.h"
#include "storage/lmgr.h"
-#include "storage/page_compression.h"
#include "storage/smgr/smgr.h"
#include "storage/smgr/segment.h"
#include "catalog/storage.h"
@@ -78,46 +78,9 @@
#include "catalog/pg_partition.h"
#include "postmaster/autovacuum.h"
#include "nodes/makefuncs.h"
-
-/*
- * part 1:macro definitions, global virables, and typedefs
- */
-typedef struct partidcacheent {
- Oid partoid;
- Partition partdesc;
-} PartIdCacheEnt;
-
-#define PartitionCacheInsert(PARTITION) \
- do { \
- PartIdCacheEnt* idhentry; \
- bool found = true; \
- idhentry = (PartIdCacheEnt*)hash_search( \
- u_sess->cache_cxt.PartitionIdCache, (void*)&((PARTITION)->pd_id), HASH_ENTER, &found); \
- /* used to give notice if found -- now just keep quiet */ \
- idhentry->partdesc = PARTITION; \
- } while (0)
-
-#define PartitionIdCacheLookup(ID, PARTITION) \
- do { \
- PartIdCacheEnt* hentry; \
- hentry = (PartIdCacheEnt*)hash_search(u_sess->cache_cxt.PartitionIdCache, (void*)&(ID), HASH_FIND, NULL); \
- if (hentry != NULL) \
- (PARTITION) = hentry->partdesc; \
- else \
- (PARTITION) = NULL; \
- } while (0)
-
-#define PartitionCacheDelete(PARTITION) \
- do { \
- PartIdCacheEnt* idhentry; \
- idhentry = (PartIdCacheEnt*)hash_search( \
- u_sess->cache_cxt.PartitionIdCache, (void*)&((PARTITION)->pd_id), HASH_REMOVE, NULL); \
- if (idhentry == NULL) \
- ereport(WARNING, \
- (errcode(ERRCODE_UNDEFINED_TABLE), errmsg("trying to delete a rd_id partdesc that does not exist"))); \
- } while (0)
-
-#define INITPARTCACHESIZE 100
+#include "utils/knl_relcache.h"
+#include "utils/knl_partcache.h"
+#include "replication/walreceiver.h"
/*
*part 2: static functions used only in this c source file
@@ -126,12 +89,7 @@ typedef struct partidcacheent {
*/
static HeapTuple ScanPgPartition(Oid targetPartId, bool indexOK, Snapshot snapshot);
static Partition AllocatePartitionDesc(Form_pg_partition relp);
-static Partition PartitionBuildDesc(Oid targetPartId, StorageType storage_type, bool insertIt);
-static void PartitionInitPhysicalAddr(Partition partition);
-static void PartitionDestroyPartition(Partition partition);
static void PartitionFlushPartition(Partition partition);
-static void PartitionClearPartition(Partition partition, bool rebuild);
-static void PartitionReloadIndexInfo(Partition part);
static void PartitionParseRelOptions(Partition partition, HeapTuple tuple);
@@ -172,7 +130,7 @@ static HeapTuple ScanPgPartition(Oid targetPartId, bool indexOK, Snapshot snapsh
pg_partition_desc = heap_open(PartitionRelationId, AccessShareLock);
pg_partition_scan = systable_beginscan(pg_partition_desc,
PartitionOidIndexId,
- indexOK && u_sess->relcache_cxt.criticalRelcachesBuilt,
+ indexOK && LocalRelCacheCriticalRelcachesBuilt(),
snapshot,
1,
key);
@@ -200,8 +158,8 @@ static Partition AllocatePartitionDesc(Form_pg_partition partp)
Form_pg_partition partitionForm;
errno_t rc = 0;
- /* Relcache entries must live in u_sess->cache_mem_cxt */
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ /* Relcache entries must live in LocalMyDBCacheMemCxt() */
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
/*
* allocate and zero space for new relation descriptor
@@ -235,7 +193,7 @@ static Partition AllocatePartitionDesc(Form_pg_partition partp)
return partition;
}
-StorageType PartitionGetStorageType(Oid parentOid)
+StorageType PartitionGetStorageType(Partition partition, Oid parentOid)
{
HeapTuple pg_class_tuple;
StorageType storageType;
@@ -261,7 +219,7 @@ StorageType PartitionGetStorageType(Oid parentOid)
return storageType;
}
-static Partition PartitionBuildDesc(Oid targetPartId, StorageType storage_type, bool insertIt)
+Partition PartitionBuildDesc(Oid targetPartId, StorageType storage_type, bool insertIt)
{
Partition partition;
Oid partid;
@@ -291,7 +249,6 @@ static Partition PartitionBuildDesc(Oid targetPartId, StorageType storage_type,
* to partition->pd_part.
*/
partition = AllocatePartitionDesc(partp);
-
/*
* initialize the partition's partition id (partition->pd_id)
*/
@@ -324,7 +281,7 @@ static Partition PartitionBuildDesc(Oid targetPartId, StorageType storage_type,
partitionTableOid = partition->pd_part->parentid;
}
if (storage_type == INVALID_STORAGE) {
- storage_type = PartitionGetStorageType(partitionTableOid);
+ storage_type = PartitionGetStorageType(partition, partitionTableOid);
}
}
@@ -346,24 +303,30 @@ static Partition PartitionBuildDesc(Oid targetPartId, StorageType storage_type,
/* Assign value in partitiongetrelation. */
partition->partMap = NULL;
+ if (IS_DISASTER_RECOVER_MODE) {
+ TransactionId xmin = HeapTupleGetRawXmin(pg_partition_tuple);
+ partition->xmin_csn = CSNLogGetDRCommitSeqNo(xmin);
+ } else {
+ partition->xmin_csn = InvalidCommitSeqNo;
+ }
+
/*
* now we can free the memory allocated for pg_class_tuple
*/
heap_freetuple_ext(pg_partition_tuple);
+ /* It's fully valid */
+ partition->pd_isvalid = true;
/*
* Insert newly created relation into partcache hash table, if requested.
*/
if (insertIt) {
- PartitionCacheInsert(partition);
+ PartitionIdCacheInsertIntoLocal(partition);
}
- /* It's fully valid */
- partition->pd_isvalid = true;
-
return partition;
}
-static void PartitionInitPhysicalAddr(Partition partition)
+void PartitionInitPhysicalAddr(Partition partition)
{
partition->pd_node.spcNode = ConvertToRelfilenodeTblspcOid(partition->pd_part->reltablespace);
if (partition->pd_node.spcNode == GLOBALTABLESPACE_OID) {
@@ -387,12 +350,6 @@ static void PartitionInitPhysicalAddr(Partition partition)
partition->pd_id)));
}
}
-
- partition->pd_node.opt = 0;
- if (partition->rd_options) {
- SetupPageCompressForRelation(&partition->pd_node, &((StdRdOptions*)(partition->rd_options))->compress,
- PartitionGetPartitionName(partition));
- }
}
/*
@@ -402,6 +359,9 @@ static void PartitionInitPhysicalAddr(Partition partition)
*/
Partition PartitionIdGetPartition(Oid partitionId, StorageType storage_type)
{
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->partdefcache.PartitionIdGetPartition(partitionId, storage_type);
+ }
Partition pd;
/*
* first try to find reldesc in the cache
@@ -481,7 +441,7 @@ void PartitionClose(Partition partition)
}
Partition PartitionBuildLocalPartition(const char *relname, Oid partid, Oid partfilenode, Oid parttablespace,
- StorageType storage_type, Datum reloptions)
+ StorageType storage_type)
{
Partition part;
MemoryContext oldcxt;
@@ -489,7 +449,7 @@ Partition PartitionBuildLocalPartition(const char *relname, Oid partid, Oid part
/*
* switch to the cache context to create the partcache entry.
*/
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
/*
* allocate a new relation descriptor and fill in basic state fields.
@@ -505,7 +465,7 @@ Partition PartitionBuildLocalPartition(const char *relname, Oid partid, Oid part
part->pd_newRelfilenodeSubid = InvalidSubTransactionId;
/* must flag that we have rels created in this transaction */
- u_sess->cache_cxt.part_cache_need_eoxact_work = true;
+ SetPartCacheNeedEoxactWork(true);
/*
* initialize partition tuple form (caller may add/override data later)
@@ -530,11 +490,6 @@ Partition PartitionBuildLocalPartition(const char *relname, Oid partid, Oid part
if (partfilenode != InvalidOid) {
PartitionInitPhysicalAddr(part);
- /* compressed option was set by PartitionInitPhysicalAddr if part->rd_options != NULL */
- if (part->rd_options == NULL && reloptions) {
- StdRdOptions* options = (StdRdOptions*)default_reloptions(reloptions, false, RELOPT_KIND_HEAP);
- SetupPageCompressForRelation(&part->pd_node, &options->compress, PartitionGetPartitionName(part));
- }
}
if (storage_type == SEGMENT_PAGE) {
@@ -543,16 +498,17 @@ Partition PartitionBuildLocalPartition(const char *relname, Oid partid, Oid part
part->pd_node.bucketNode = InvalidBktId;
}
+ /* It's fully valid */
+ part->pd_isvalid = true;
/*
* Okay to insert into the partcache hash tables.
*/
- PartitionCacheInsert(part);
+ PartitionIdCacheInsertIntoLocal(part);
/*
* done building partcache entry.
*/
(void)MemoryContextSwitchTo(oldcxt);
- /* It's fully valid */
- part->pd_isvalid = true;
+
/*
* Caller expects us to pin the returned entry.
*/
@@ -566,7 +522,7 @@ Partition PartitionBuildLocalPartition(const char *relname, Oid partid, Oid part
* Physically delete a partition cache entry and all subsidiary data.
* Caller must already have unhooked the entry from the hash table.
*/
-static void PartitionDestroyPartition(Partition partition)
+void PartitionDestroyPartition(Partition partition)
{
Assert(PartitionHasReferenceCountZero(partition));
@@ -580,13 +536,10 @@ static void PartitionDestroyPartition(Partition partition)
* Free all the subsidiary data structures of the partcache entry, then the
* entry itself.
*/
- if (partition->pd_part) {
- pfree_ext(partition->pd_part);
- }
+ pfree_ext(partition->pd_indexattr);
+ pfree_ext(partition->pd_part);
list_free_ext(partition->pd_indexlist);
- if (partition->rd_options) {
- pfree_ext(partition->rd_options);
- }
+ pfree_ext(partition->rd_options);
if (partition->partrel) {
/* in function releaseDummyRelation, owner->nfakerelrefs decrease one due to ResourceOwnerForgetFakerelRef,
* which is not we expect, so we use ResourceOwnerRememberFakerelRef correspondingly */
@@ -627,7 +580,7 @@ static void PartitionDestroyPartition(Partition partition)
* to match the relation's refcnt status, but we keep it as a crosscheck
* that we're doing what the caller expects.
*/
-static void PartitionClearPartition(Partition partition, bool rebuild)
+void PartitionClearPartition(Partition partition, bool rebuild)
{
/*
* As per notes above, a rel to be rebuilt MUST have refcnt > 0; while of
@@ -681,7 +634,7 @@ static void PartitionClearPartition(Partition partition, bool rebuild)
*/
if (!rebuild) {
/* Remove it from the hash table */
- PartitionCacheDelete(partition);
+ PartitionIdCacheDeleteLocal(partition);
/* And release storage */
PartitionDestroyPartition(partition);
@@ -715,17 +668,23 @@ static void PartitionClearPartition(Partition partition, bool rebuild)
* is good because whatever ref counts the entry may have do not
* necessarily belong to that resource owner.
*/
- Partition newpart;
+ Partition newpart = NULL;
Oid save_partid = PartitionGetPartid(partition);
errno_t rc = 0;
/* Build temporary entry, but don't link it into hashtable */
int4 tempNode = partition->pd_node.bucketNode;
- newpart = PartitionBuildDesc(save_partid, INVALID_STORAGE, false);
+ if (EnableLocalSysCache()) {
+ // call build means local doesnt contain relation or it it invalid, so search from global directly
+ newpart = t_thrd.lsc_cxt.lsc->partdefcache.SearchPartitionFromGlobalCopy(save_partid);
+ }
+ if (!RelationIsValid(newpart)) {
+ newpart = PartitionBuildDesc(save_partid, INVALID_STORAGE, false);
+ }
if (NULL == newpart) {
/* Should only get here if partition was deleted */
- PartitionCacheDelete(partition);
+ PartitionIdCacheDeleteLocal(partition);
PartitionDestroyPartition(partition);
ereport(ERROR,
(errcode(ERRCODE_OBJECT_IN_USE), errmsg("partition %u deleted while still in use", save_partid)));
@@ -790,6 +749,7 @@ static void PartitionClearPartition(Partition partition, bool rebuild)
SWAPFIELD(PartitionMap*, partMap);
}
+ SWAPFIELD(LocalPartitionEntry*, entry);
#undef SWAPFIELD
/* And now we can throw away the temporary entry */
@@ -838,7 +798,7 @@ void PartitionForgetPartition(Oid partid)
{
Partition partition;
- PartitionIdCacheLookup(partid, partition);
+ PartitionIdCacheLookupOnlyLocal(partid, partition);
if (!PointerIsValid(partition)) {
return; /* not in cache, nothing to do */
@@ -871,7 +831,7 @@ void PartitionCacheInvalidateEntry(Oid partitionId)
{
Partition partition;
- PartitionIdCacheLookup(partitionId, partition);
+ PartitionIdCacheLookupOnlyLocal(partitionId, partition);
if (PointerIsValid(partition)) {
PartitionFlushPartition(partition);
@@ -908,8 +868,13 @@ void PartitionCacheInvalidateEntry(Oid partitionId)
* items. This should ensure that system catalogs are up to date before
* we attempt to use them to reload information about other open relations.
*/
+
void PartitionCacheInvalidate(void)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->partdefcache.InvalidateAll();
+ return;
+ }
HASH_SEQ_STATUS status;
PartIdCacheEnt* idhentry = NULL;
Partition partition;
@@ -966,7 +931,7 @@ void PartitionCloseSmgrByOid(Oid partitionId)
{
Partition partition;
- PartitionIdCacheLookup(partitionId, partition);
+ PartitionIdCacheLookupOnlyLocal(partitionId, partition);
if (!PointerIsValid(partition)) {
return; /* not in cache, nothing to do */
@@ -990,6 +955,10 @@ void PartitionCloseSmgrByOid(Oid partitionId)
*/
void AtEOXact_PartitionCache(bool isCommit)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->partdefcache.AtEOXact_PartitionCache(isCommit);
+ return;
+ }
HASH_SEQ_STATUS status;
PartIdCacheEnt* idhentry = NULL;
@@ -1070,6 +1039,10 @@ void AtEOXact_PartitionCache(bool isCommit)
*/
void AtEOSubXact_PartitionCache(bool isCommit, SubTransactionId mySubid, SubTransactionId parentSubid)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->partdefcache.AtEOSubXact_PartitionCache(isCommit, mySubid, parentSubid);
+ return;
+ }
HASH_SEQ_STATUS status;
PartIdCacheEnt* idhentry = NULL;
@@ -1127,6 +1100,10 @@ void AtEOSubXact_PartitionCache(bool isCommit, SubTransactionId mySubid, SubTran
void PartitionCacheInitialize(void)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->partdefcache.Init();
+ return;
+ }
HASHCTL ctl;
errno_t rc;
@@ -1140,6 +1117,7 @@ void PartitionCacheInitialize(void)
ctl.entrysize = sizeof(PartIdCacheEnt);
ctl.hash = oid_hash;
ctl.hcxt = u_sess->cache_mem_cxt;
+ const int INITPARTCACHESIZE = 128;
u_sess->cache_cxt.PartitionIdCache =
hash_create("Partcache by OID", INITPARTCACHESIZE, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
}
@@ -1249,6 +1227,73 @@ bytea* merge_rel_part_reloption(Oid rel_oid, Oid part_oid)
return merged_rd_options;
}
+void UpdatePartrelPointer(Relation partrel, Relation rel, Partition part)
+{
+ Assert(partrel->rd_refcnt == part->pd_refcnt);
+ Assert(partrel->rd_isvalid == part->pd_isvalid);
+ Assert(partrel->rd_indexvalid == part->pd_indexvalid);
+ Assert(partrel->rd_createSubid == part->pd_createSubid);
+ Assert(partrel->rd_newRelfilenodeSubid == part->pd_newRelfilenodeSubid);
+
+ Assert(partrel->rd_rel->reltoastrelid == part->pd_part->reltoastrelid);
+ Assert(partrel->rd_rel->reltablespace == part->pd_part->reltablespace);
+ Assert(partrel->rd_rel->relfilenode == part->pd_part->relfilenode);
+ Assert(partrel->rd_rel->relpages == part->pd_part->relpages);
+ Assert(partrel->rd_rel->reltuples == part->pd_part->reltuples);
+ Assert(partrel->rd_rel->relallvisible == part->pd_part->relallvisible);
+ Assert(partrel->rd_rel->relcudescrelid == part->pd_part->relcudescrelid);
+ Assert(partrel->rd_rel->relcudescidx == part->pd_part->relcudescidx);
+ Assert(partrel->rd_rel->reldeltarelid == part->pd_part->reldeltarelid);
+ Assert(partrel->rd_rel->reldeltaidx == part->pd_part->reldeltaidx);
+ Assert(partrel->rd_bucketoid == rel->rd_bucketoid);
+
+ partrel->rd_att = rel->rd_att;
+ Assert(partrel->rd_partHeapOid == part->pd_part->indextblid);
+ partrel->rd_index = rel->rd_index;
+ partrel->rd_indextuple = rel->rd_indextuple;
+ partrel->rd_am = rel->rd_am;
+ partrel->rd_indnkeyatts = rel->rd_indnkeyatts;
+ Assert(partrel->rd_tam_type == rel->rd_tam_type);
+
+ partrel->rd_aminfo = rel->rd_aminfo;
+ partrel->rd_opfamily = rel->rd_opfamily;
+ partrel->rd_opcintype = rel->rd_opcintype;
+ partrel->rd_support = rel->rd_support;
+ partrel->rd_supportinfo = rel->rd_supportinfo;
+
+ partrel->rd_indoption = rel->rd_indoption;
+ partrel->rd_indexprs = rel->rd_indexprs;
+ partrel->rd_indpred = rel->rd_indpred;
+ partrel->rd_exclops = rel->rd_exclops;
+ partrel->rd_exclprocs = rel->rd_exclprocs;
+ partrel->rd_exclstrats = rel->rd_exclstrats;
+
+ partrel->rd_amcache = rel->rd_amcache;
+ partrel->rd_indcollation = rel->rd_indcollation;
+ Assert(partrel->rd_id == part->pd_id);
+ partrel->rd_indexlist = part->pd_indexlist;
+ Assert(partrel->rd_oidindex == part->pd_oidindex);
+ Assert(partrel->rd_toastoid == part->pd_toastoid);
+ Assert(partrel->subpartitiontype == part->pd_part->parttype);
+ partrel->pgstat_info = part->pd_pgstat_info;
+ Assert(partrel->parentId == rel->rd_id);
+ Assert(partrel->rd_isblockchain == rel->rd_isblockchain);
+ Assert(partrel->storage_type == rel->storage_type);
+}
+
+static void SetRelationPartitionMap(Relation relation, Partition part)
+{
+ if (!(PartitionHasSubpartition(part) && part->pd_part->parttype == PART_OBJ_TYPE_TABLE_PARTITION)) {
+ return;
+ }
+ if (part->partMap != NULL) {
+ relation->partMap = part->partMap;
+ } else {
+ RelationInitPartitionMap(relation, true);
+ part->partMap = relation->partMap;
+ }
+}
+
/*
* @@GaussDB@@
* Target : data partition
@@ -1266,6 +1311,21 @@ Relation partitionGetRelation(Relation rel, Partition part)
bytea* des_reloption = NULL;
Assert(PointerIsValid(rel) && PointerIsValid(part));
+ /*
+ * If the rel is subpartitiontable and the part is subpartition, we need open Level 1 partition to get subpartition
+ * relation. When the caller gets subpartition, The level-1 partition has been locked. Therefore, partitionOpen used
+ * NoLock here.
+ */
+ if (RelationIsSubPartitioned(rel) && rel->rd_id != part->pd_part->parentid) {
+ Assert(rel->rd_id == partid_get_parentid(part->pd_part->parentid));
+ Partition parentPart = partitionOpen(rel, part->pd_part->parentid, NoLock);
+ Relation parentPartRel = partitionGetRelation(rel, parentPart);
+ relation = partitionGetRelation(parentPartRel, part);
+ releaseDummyRelation(&parentPartRel);
+ partitionClose(rel, parentPart, NoLock);
+ return relation;
+ }
+ Assert(rel->rd_id == part->pd_part->parentid);
/*
* Memory malloced in merge_rel_part_reloption cannot mount in CacheMemoryContext,
@@ -1276,7 +1336,7 @@ Relation partitionGetRelation(Relation rel, Partition part)
merge_reloption = merge_rel_part_reloption(RelationGetRelid(rel), PartitionGetPartid(part));
}
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
relation = (Relation)palloc0(sizeof(RelationData));
if (!IsBootstrapProcessingMode()) {
ResourceOwnerRememberFakerelRef(t_thrd.utils_cxt.CurrentResourceOwner, relation);
@@ -1324,7 +1384,7 @@ Relation partitionGetRelation(Relation rel, Partition part)
relation->rd_indexcxt = NULL;
} else {
Assert(rel->rd_indexcxt != NULL);
- relation->rd_indexcxt = AllocSetContextCreate(u_sess->cache_mem_cxt,
+ relation->rd_indexcxt = AllocSetContextCreate(LocalMyDBCacheMemCxt(),
PartitionGetPartitionName(part),
ALLOCSET_SMALL_MINSIZE,
ALLOCSET_SMALL_INITSIZE,
@@ -1385,14 +1445,8 @@ Relation partitionGetRelation(Relation rel, Partition part)
securec_check(ret, "\0", "\0");
}
- if (PartitionHasSubpartition(part) && part->pd_part->parttype == PART_OBJ_TYPE_TABLE_PARTITION) {
- if (part->partMap != NULL) {
- relation->partMap = part->partMap;
- } else {
- RelationInitPartitionMap(relation, true);
- part->partMap = relation->partMap;
- }
- }
+ SetRelationPartitionMap(relation, part);
+
(void)MemoryContextSwitchTo(oldcxt);
return relation;
@@ -1446,7 +1500,7 @@ void releaseDummyRelation(Relation* relation)
* Brief : reload minimal information for an open index partition
* Description :
*/
-static void PartitionReloadIndexInfo(Partition part)
+void PartitionReloadIndexInfo(Partition part)
{
HeapTuple pg_partition_tuple;
Form_pg_partition partForm;
@@ -1638,7 +1692,7 @@ void PartitionSetNewRelfilenode(Relation parent, Partition part, TransactionId f
part->pd_newRelfilenodeSubid = GetCurrentSubTransactionId();
/* ... and now we have eoxact cleanup work to do */
- u_sess->cache_cxt.part_cache_need_eoxact_work = true;
+ SetPartCacheNeedEoxactWork(true);
}
static void PartitionParseRelOptions(Partition partition, HeapTuple tuple)
@@ -1668,13 +1722,13 @@ static void PartitionParseRelOptions(Partition partition, HeapTuple tuple)
options = heap_reloptions(RELKIND_RELATION, datum, false);
/*
- * Copy parsed data into u_sess->cache_mem_cxt. To guard against the
+ * Copy parsed data into LocalMyDBCacheMemCxt(). To guard against the
* possibility of leaks in the reloptions code, we want to do the actual
* parsing in the caller's memory context and copy the results into
- * u_sess->cache_mem_cxt after the fact.
+ * LocalMyDBCacheMemCxt() after the fact.
*/
if (options != NULL) {
- partition->rd_options = (bytea*)MemoryContextAlloc(u_sess->cache_mem_cxt, VARSIZE(options));
+ partition->rd_options = (bytea*)MemoryContextAlloc(LocalMyDBCacheMemCxt(), VARSIZE(options));
rc = memcpy_s(partition->rd_options, VARSIZE(options), options, VARSIZE(options));
securec_check(rc, "", "");
pfree_ext(options);
@@ -1850,7 +1904,7 @@ Datum SetWaitCleanGpiRelOptions(Datum oldOptions, bool enable)
}
/* Update pg_partition's tuple attribute reloptions wait_clean_gpi */
-static void UpdateWaitCleanGpiRelOptions(Relation pgPartition, HeapTuple partTuple, bool enable, bool inplace)
+void UpdateWaitCleanGpiRelOptions(Relation pgPartition, HeapTuple partTuple, bool enable, bool inplace)
{
HeapTuple newTuple;
Datum partOptions;
diff --git a/src/common/backend/utils/cache/plancache.cpp b/src/common/backend/utils/cache/plancache.cpp
index 0197bae9f..c0b7bdd5e 100644
--- a/src/common/backend/utils/cache/plancache.cpp
+++ b/src/common/backend/utils/cache/plancache.cpp
@@ -133,12 +133,12 @@ bool IsStreamSupport()
*/
void InitPlanCache(void)
{
- CacheRegisterRelcacheCallback(PlanCacheRelCallback, (Datum)0);
- CacheRegisterPartcacheCallback(PlanCacheRelCallback, (Datum)0);
- CacheRegisterSyscacheCallback(PROCOID, PlanCacheFuncCallback, (Datum)0);
- CacheRegisterSyscacheCallback(NAMESPACEOID, PlanCacheSysCallback, (Datum)0);
- CacheRegisterSyscacheCallback(OPEROID, PlanCacheSysCallback, (Datum)0);
- CacheRegisterSyscacheCallback(AMOPOPID, PlanCacheSysCallback, (Datum)0);
+ CacheRegisterSessionRelcacheCallback(PlanCacheRelCallback, (Datum)0);
+ CacheRegisterSessionPartcacheCallback(PlanCacheRelCallback, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(PROCOID, PlanCacheFuncCallback, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(NAMESPACEOID, PlanCacheSysCallback, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(OPEROID, PlanCacheSysCallback, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(AMOPOPID, PlanCacheSysCallback, (Datum)0);
}
/* ddl no need to global it */
@@ -1598,13 +1598,6 @@ static bool ChooseCustomPlan(CachedPlanSource* plansource, ParamListInfo boundPa
return ret;
}
- /* Don't choose custom plan if using pbe optimization */
- bool isPbeAndFqs = u_sess->attr.attr_sql.enable_pbe_optimization && plansource->gplan_is_fqs;
- if (isPbeAndFqs) {
- ReportReasonForPlanChoose(PBE_OPTIMIZATION);
- return false;
- }
-
/* Let settings force the decision */
if (unlikely(PLAN_CACHE_MODE_AUTO != u_sess->attr.attr_sql.g_planCacheMode)) {
if (PLAN_CACHE_MODE_FORCE_GENERIC_PLAN == u_sess->attr.attr_sql.g_planCacheMode) {
@@ -1618,6 +1611,13 @@ static bool ChooseCustomPlan(CachedPlanSource* plansource, ParamListInfo boundPa
}
}
+ /* Don't choose custom plan if using pbe optimization */
+ bool isPbeAndFqs = u_sess->attr.attr_sql.enable_pbe_optimization && plansource->gplan_is_fqs;
+ if (isPbeAndFqs) {
+ ReportReasonForPlanChoose(PBE_OPTIMIZATION);
+ return false;
+ }
+
/* Generate custom plans until we have done at least 5 (arbitrary) */
if (plansource->num_custom_plans < 5) {
ReportReasonForPlanChoose(TRY_CPLAN);
@@ -1994,6 +1994,178 @@ void ReleaseCachedPlan(CachedPlan* plan, bool useResOwner)
}
}
+/*
+ * CachedPlanIsSimplyValid: quick check for plan still being valid
+ *
+ * This function must not be used unless CachedPlanAllowsSimpleValidityCheck
+ * previously said it was OK.
+ *
+ * If the plan is valid, and "owner" is not NULL, record a refcount on
+ * the plan in that resowner before returning. It is caller's responsibility
+ * to be sure that a refcount is held on any plan that's being actively used.
+ * long
+ * The code here is unconditionally safe as as the only use of this
+ * CachedPlanSource is in connection with the particular CachedPlan pointer
+ * that's passed in. If the plansource were being used for other purposes,
+ * it's possible that its generic plan could be invalidated and regenerated
+ * while the current caller wasn't looking, and then there could be a chance
+ * collision of address between this caller's now-stale plan pointer and the
+ * actual address of the new generic plan. For current uses, that scenario
+ * can't happen; but with a plansource shared across multiple uses, it'd be
+ * advisable to also save plan->generation and verify that that still matches.
+ */
+bool CachedPlanIsSimplyValid(CachedPlanSource *plansource, CachedPlan *plan, ResourceOwner owner)
+{
+ /*
+ * Careful here: since the caller doesn't necessarily hold a refcount on
+ * the plan to start with, it's possible that "plan" is a dangling
+ * pointer. Don't dereference it until we've verified that it still
+ * matches the plansource's gplan (which is either valid or NULL).
+ */
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+
+ /*
+ * Has cache invalidation fired on this plan? We can check this right
+ * away since there are no locks that we'd need to acquire first. Note
+ * that here we *do* check plansource->is_valid, so as to force plan
+ * rebuild if that's become false.
+ */
+ if (!plansource->is_valid || plan != plansource->gplan || !plan->is_valid)
+ return false;
+
+ Assert(plan->magic == CACHEDPLAN_MAGIC);
+
+ /* Is the search_path still the same as when we made it? */
+ Assert(plansource->search_path != NULL);
+ if (!OverrideSearchPathMatchesCurrent(plansource->search_path))
+ return false;
+
+ /* It's still good. Bump refcount if requested. */
+ if (owner) {
+ ResourceOwnerEnlargePlanCacheRefs(owner);
+ plan->refcount++;
+ ResourceOwnerRememberPlanCacheRef(owner, plan);
+ }
+
+ return true;
+}
+
+/*
+ * CachedPlanAllowsSimpleValidityCheck: can we use CachedPlanIsSimplyValid?
+ *
+ * This function, together with CachedPlanIsSimplyValid, provides a fast path
+ * for revalidating "simple" generic plans. The core requirement to be simple
+ * is that the plan must not require taking any locks, which translates to
+ * not touching any tables; this happens to match up well with an important
+ * use-case in PL/pgSQL. This function tests whether that's true, along
+ * with checking some other corner cases that we'd rather not bother with
+ * handling in the fast path. (Note that it's still possible for such a plan
+ * to be invalidated, for example due to a change in a function that was
+ * inlined into the plan.)
+ *
+ * If the plan is simply valid, and "owner" is not NULL, record a refcount on
+ * the plan in that resowner before returning. It is caller's responsibility
+ * to be sure that a refcount is held on any plan that's being actively used.
+ *
+ * This must only be called on known-valid generic plans (eg, ones just
+ * returned by GetCachedPlan). If it returns true, the caller may re-use
+ * the cached plan as long as CachedPlanIsSimplyValid returns true; that
+ * check is much cheaper than the full revalidation done by GetCachedPlan.
+ * Nonetheless, no required checks are omitted.
+ */
+bool CachedPlanAllowsSimpleValidityCheck(CachedPlanSource *plansource, CachedPlan *plan, ResourceOwner owner)
+{
+ ListCell *lc;
+
+ /*
+ * Sanity-check that the caller gave us a validated generic plan. Notice
+ * that we *don't* assert plansource->is_valid as you might expect; that's
+ * because it's possible that that's already false when GetCachedPlan
+ * returns, e.g. because ResetPlanCache happened partway through. We
+ * should accept the plan as long as plan->is_valid is true, and expect to
+ * replan after the next CachedPlanIsSimplyValid call.
+ */
+ Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
+ Assert(plan->magic == CACHEDPLAN_MAGIC);
+ Assert(plan->is_valid);
+ Assert(plan == plansource->gplan);
+ Assert(plansource->search_path != NULL);
+ Assert(OverrideSearchPathMatchesCurrent(plansource->search_path));
+
+ /* We don't support oneshot plans here. */
+ if (plansource->is_oneshot)
+ return false;
+ Assert(!plan->is_oneshot);
+
+ /*
+ * If the plan is dependent on RLS considerations, or it's transient,
+ * reject. These things probably can't ever happen for table-free
+ * queries, but for safety's sake let's check.
+ */
+
+ if (plan->dependsOnRole)
+ return false;
+ if (TransactionIdIsValid(plan->saved_xmin))
+ return false;
+
+ /*
+ * Reject if AcquirePlannerLocks would have anything to do. This is
+ * simplistic, but there's no need to inquire any more carefully; indeed,
+ * for current callers it shouldn't even be possible to hit any of these
+ * checks.
+ */
+ foreach(lc, plansource->query_list) {
+ Query *query = lfirst_node(Query, lc);
+
+ if (query->commandType == CMD_UTILITY)
+ return false;
+ if (query->rtable || query->cteList || query->hasSubLinks)
+ return false;
+ }
+
+ /*
+ * Reject if AcquireExecutorLocks would have anything to do. This is
+ * probably unnecessary given the previous check, but let's be safe.
+ */
+ foreach(lc, plan->stmt_list)
+ {
+ PlannedStmt *plannedstmt = lfirst_node(PlannedStmt, lc);
+ ListCell *lc2;
+
+ if (plannedstmt->commandType == CMD_UTILITY)
+ return false;
+
+ /*
+ * We have to grovel through the rtable because it's likely to contain
+ * an RTE_RESULT relation, rather than being totally empty.
+ */
+ foreach(lc2, plannedstmt->rtable)
+ {
+ RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc2);
+
+ if (rte->rtekind == RTE_RELATION)
+ return false;
+ }
+
+ if (!IsA(plannedstmt->planTree, BaseResult))
+ return false;
+ }
+
+ /*
+ * Okay, it's simple. Note that what we've primarily established here is
+ * that no locks need be taken before checking the plan's is_valid flag.
+ */
+
+ /* Bump refcount if requested. */
+ if (owner) {
+ ResourceOwnerEnlargePlanCacheRefs(owner);
+ plan->refcount++;
+ ResourceOwnerRememberPlanCacheRef(owner, plan);
+ }
+
+ return true;
+}
+
/*
* CachedPlanSetParentContext: move a CachedPlanSource to a new memory context
*
diff --git a/src/common/backend/utils/cache/relcache.cpp b/src/common/backend/utils/cache/relcache.cpp
index 7a962f7f6..603df604e 100644
--- a/src/common/backend/utils/cache/relcache.cpp
+++ b/src/common/backend/utils/cache/relcache.cpp
@@ -114,6 +114,8 @@
#include "catalog/pg_ts_parser.h"
#include "catalog/pg_ts_template.h"
#include "catalog/pg_type.h"
+#include "catalog/pg_uid.h"
+#include "catalog/pg_uid_fn.h"
#include "catalog/pg_user_mapping.h"
#include "catalog/pg_user_status.h"
#include "catalog/pg_workload_group.h"
@@ -132,7 +134,7 @@
#include "catalog/gs_column_keys_args.h"
#include "catalog/gs_client_global_keys.h"
#include "catalog/gs_client_global_keys_args.h"
-
+#include "catalog/gs_db_privilege.h"
#include "catalog/gs_matview.h"
#include "catalog/gs_matview_dependency.h"
#include "catalog/pg_snapshot.h"
@@ -174,7 +176,6 @@
#include "rewrite/rewriteDefine.h"
#include "rewrite/rewriteRlsPolicy.h"
#include "storage/lmgr.h"
-#include "storage/page_compression.h"
#include "storage/smgr/smgr.h"
#include "storage/smgr/segment.h"
#include "threadpool/threadpool.h"
@@ -195,12 +196,17 @@
#include "utils/partitionmap_gs.h"
#include "utils/resowner.h"
#include "utils/evp_cipher.h"
+#include "access/csnlog.h"
#include "access/cstore_am.h"
#include "nodes/nodeFuncs.h"
#include "nodes/makefuncs.h"
+#include "replication/walreceiver.h"
#ifdef ENABLE_MULTIPLE_NODES
#include "tsdb/common/ts_tablecmds.h"
#endif /* ENABLE_MULTIPLE_NODES */
+#include "utils/knl_relcache.h"
+#include "utils/knl_partcache.h"
+#include "utils/knl_localtabdefcache.h"
/*
* name of relcache init file(s), used to speed up backend startup
@@ -212,15 +218,15 @@
/*
* hardcoded tuple descriptors, contents generated by genbki.pl
*/
-static const FormData_pg_attribute Desc_pg_class[Natts_pg_class] = {Schema_pg_class};
-static const FormData_pg_attribute Desc_pg_attribute[Natts_pg_attribute] = {Schema_pg_attribute};
-static const FormData_pg_attribute Desc_pg_proc[Natts_pg_proc] = {Schema_pg_proc};
-static const FormData_pg_attribute Desc_pg_type[Natts_pg_type] = {Schema_pg_type};
-static const FormData_pg_attribute Desc_pg_database[Natts_pg_database] = {Schema_pg_database};
-static const FormData_pg_attribute Desc_pg_authid[Natts_pg_authid] = {Schema_pg_authid};
-static const FormData_pg_attribute Desc_pg_auth_members[Natts_pg_auth_members] = {Schema_pg_auth_members};
-static const FormData_pg_attribute Desc_pg_index[Natts_pg_index] = {Schema_pg_index};
-static const FormData_pg_attribute Desc_pg_user_status[Natts_pg_user_status] = {Schema_pg_user_status};
+extern const FormData_pg_attribute Desc_pg_class[Natts_pg_class] = {Schema_pg_class};
+extern const FormData_pg_attribute Desc_pg_attribute[Natts_pg_attribute] = {Schema_pg_attribute};
+extern const FormData_pg_attribute Desc_pg_proc[Natts_pg_proc] = {Schema_pg_proc};
+extern const FormData_pg_attribute Desc_pg_type[Natts_pg_type] = {Schema_pg_type};
+extern const FormData_pg_attribute Desc_pg_database[Natts_pg_database] = {Schema_pg_database};
+extern const FormData_pg_attribute Desc_pg_authid[Natts_pg_authid] = {Schema_pg_authid};
+extern const FormData_pg_attribute Desc_pg_auth_members[Natts_pg_auth_members] = {Schema_pg_auth_members};
+extern const FormData_pg_attribute Desc_pg_index[Natts_pg_index] = {Schema_pg_index};
+extern const FormData_pg_attribute Desc_pg_user_status[Natts_pg_user_status] = {Schema_pg_user_status};
static const FormData_pg_attribute Desc_pg_default_acl[Natts_pg_default_acl] = {Schema_pg_default_acl};
static const FormData_pg_attribute Desc_pg_pltemplate[Natts_pg_pltemplate] = {Schema_pg_pltemplate};
@@ -288,6 +294,7 @@ static const FormData_pg_attribute Desc_gs_job_attribute[Natts_gs_job_attribute]
static const FormData_pg_attribute Desc_pg_object[Natts_pg_object] = {Schema_pg_object};
static const FormData_pg_attribute Desc_pg_synonym[Natts_pg_synonym] = {Schema_pg_synonym};
static const FormData_pg_attribute Desc_pg_hashbucket[Natts_pg_hashbucket] = {Schema_pg_hashbucket};
+static const FormData_pg_attribute Desc_gs_uid[Natts_gs_uid] = {Schema_gs_uid};
static const FormData_pg_attribute Desc_pg_snapshot[Natts_pg_snapshot] = {Schema_gs_txn_snapshot};
static const FormData_pg_attribute Desc_pg_recyclebin[Natts_pg_recyclebin] = {Schema_gs_recyclebin};
static const FormData_pg_attribute Desc_gs_global_chain[Natts_gs_global_chain] = {Schema_gs_global_chain};
@@ -320,6 +327,7 @@ static const FormData_pg_attribute Desc_gs_opt_model[Natts_gs_opt_model] = {Sche
static const FormData_pg_attribute Desc_gs_model_warehouse[Natts_gs_model_warehouse] = {Schema_gs_model_warehouse};
static const FormData_pg_attribute Desc_gs_package[Natts_gs_package] = {Schema_gs_package};
+static const FormData_pg_attribute Desc_gs_db_privilege[Natts_gs_db_privilege] = {Schema_gs_db_privilege};
static const FormData_pg_attribute Desc_pg_subscription[Natts_pg_subscription] = {Schema_pg_subscription};
static const FormData_pg_attribute Desc_pg_publication[Natts_pg_publication] = {Schema_pg_publication};
static const FormData_pg_attribute Desc_pg_publication_rel[Natts_pg_publication_rel] = {Schema_pg_publication_rel};
@@ -829,6 +837,15 @@ static struct CatalogRelationBuildParam catalogBuildParam[CATALOG_NUM] = {{Defau
Desc_pg_directory,
false,
true},
+ {DbPrivilegeId,
+ "gs_db_privilege",
+ DbPrivilege_Rowtype_Id,
+ false,
+ true,
+ Natts_gs_db_privilege,
+ Desc_gs_db_privilege,
+ false,
+ true},
{ObsScanInfoRelationId,
"pg_obsscaninfo",
ObsScanInfoRelation_Rowtype_Id,
@@ -910,6 +927,15 @@ static struct CatalogRelationBuildParam catalogBuildParam[CATALOG_NUM] = {{Defau
Desc_pg_snapshot,
false,
true},
+ {UidRelationId,
+ "gs_uid",
+ UidRelationId_Rowtype_Id,
+ false,
+ false,
+ Natts_gs_uid,
+ Desc_gs_uid,
+ false,
+ true},
{PgxcClassRelationId,
"pgxc_class",
PgxcClassRelation_Rowtype_Id,
@@ -1220,38 +1246,6 @@ typedef struct relidcacheent {
*/
THR_LOCAL bool needNewLocalCacheFile = false;
-/*
- * macros to manipulate the lookup hashtables
- */
-#define RelationCacheInsert(RELATION) \
- do { \
- RelIdCacheEnt* idhentry = NULL; \
- bool found = false; \
- idhentry = (RelIdCacheEnt*)hash_search( \
- u_sess->relcache_cxt.RelationIdCache, (void*)&((RELATION)->rd_id), HASH_ENTER, &found); \
- /* used to give notice if found -- now just keep quiet */ \
- idhentry->reldesc = RELATION; \
- } while (0)
-
-#define RelationIdCacheLookup(ID, RELATION) \
- do { \
- RelIdCacheEnt* hentry = NULL; \
- hentry = (RelIdCacheEnt*)hash_search(u_sess->relcache_cxt.RelationIdCache, (void*)&(ID), HASH_FIND, NULL); \
- if (hentry != NULL) \
- (RELATION) = hentry->reldesc; \
- else \
- (RELATION) = NULL; \
- } while (0)
-
-#define RelationCacheDelete(RELATION) \
- do { \
- RelIdCacheEnt* idhentry; \
- idhentry = (RelIdCacheEnt*)hash_search( \
- u_sess->relcache_cxt.RelationIdCache, (void*)&((RELATION)->rd_id), HASH_REMOVE, NULL); \
- if (idhentry == NULL) \
- ereport(WARNING, (errmsg("trying to delete a rd_id reldesc that does not exist"))); \
- } while (0)
-
/*
* Special cache for opclass-related information
*
@@ -1268,38 +1262,29 @@ typedef struct opclasscacheent {
} OpClassCacheEnt;
/* non-export function prototypes */
-static void RelationDestroyRelation(Relation relation, bool remember_tupdesc);
static void RememberToFreeTupleDescAtEOX(TupleDesc td);
-static void RelationClearRelation(Relation relation, bool rebuild);
-static void RelationReloadIndexInfo(Relation relation);
static void RelationFlushRelation(Relation relation);
static bool load_relcache_init_file(bool shared);
static void write_relcache_init_file(bool shared);
static void write_item(const void* data, Size len, FILE* fp);
-static void formrdesc(const char* relationName, Oid relationReltype, bool isshared, bool hasoids, int natts,
- const FormData_pg_attribute* attrs);
-
static Relation AllocateRelationDesc(Form_pg_class relp);
static void RelationParseRelOptions(Relation relation, HeapTuple tuple);
static void RelationBuildTupleDesc(Relation relation, bool onlyLoadInitDefVal);
-static Relation RelationBuildDesc(Oid targetRelId, bool insertIt, bool buildkey = true);
-static void RelationInitPhysicalAddr(Relation relation);
+
static void RelationInitBucketKey(Relation relation, HeapTuple tuple);
static void RelationInitBucketInfo(Relation relation, HeapTuple tuple);
-static void load_critical_index(Oid indexoid, Oid heapoid);
-static TupleDesc GetPgClassDescriptor(void);
-static TupleDesc GetPgIndexDescriptor(void);
+
static void AttrDefaultFetch(Relation relation);
static void CheckConstraintFetch(Relation relation);
static List* insert_ordered_oid(List* list, Oid datum);
-static void IndexSupportInitialize(oidvector* indclass, RegProcedure* indexSupport, Oid* opFamily, Oid* opcInType,
- StrategyNumber maxSupportNumber, AttrNumber maxAttributeNumber);
-static OpClassCacheEnt* LookupOpclassInfo(Oid operatorClassOid, StrategyNumber numSupport);
+static void IndexSupportInitialize(Relation relation, oidvector* indclass, StrategyNumber maxSupportNumber,
+ AttrNumber maxAttributeNumber);
+static OpClassCacheEnt* LookupOpclassInfo(Relation relation, Oid operatorClassOid, StrategyNumber numSupport);
static void RelationCacheInitFileRemoveInDir(const char* tblspcpath);
static void unlink_initfile(const char* initfilename);
-static void SetBackendId(Relation relation);
+
/*
* ScanPgRelation
*
@@ -1319,15 +1304,15 @@ HeapTuple ScanPgRelation(Oid targetRelId, bool indexOK, bool force_non_historic)
SysScanDesc pg_class_scan;
ScanKeyData key[1];
Snapshot snapshot = NULL;
-
/*
* If something goes wrong during backend startup, we might find ourselves
* trying to read pg_class before we've selected a database. That ain't
* gonna work, so bail out with a useful error message. If this happens,
* it probably means a relcache entry that needs to be nailed isn't.
*/
- if (!OidIsValid(u_sess->proc_cxt.MyDatabaseId))
+ if (!OidIsValid(GetMyDatabaseId())) {
ereport(FATAL, (errmsg("cannot read pg_class without having selected a database")));
+ }
/*
* form a scan key
@@ -1359,7 +1344,7 @@ HeapTuple ScanPgRelation(Oid targetRelId, bool indexOK, bool force_non_historic)
*/
pg_class_scan = systable_beginscan(
- pg_class_desc, ClassOidIndexId, indexOK && u_sess->relcache_cxt.criticalRelcachesBuilt, snapshot, 1, key);
+ pg_class_desc, ClassOidIndexId, indexOK && LocalRelCacheCriticalRelcachesBuilt(), snapshot, 1, key);
#ifdef ENABLE_MULTIPLE_NODES
/* If we do seqscan on pg_class, skip sync. */
@@ -1394,8 +1379,8 @@ static Relation AllocateRelationDesc(Form_pg_class relp)
MemoryContext oldcxt;
Form_pg_class relationForm;
- /* Relcache entries must live in u_sess->cache_mem_cxt */
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ /* Relcache entries must live in LocalMyDBCacheMemCxt */
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
/*
* allocate and zero space for new relation descriptor
@@ -1423,7 +1408,8 @@ static Relation AllocateRelationDesc(Form_pg_class relp)
*/
relationForm = (Form_pg_class)palloc(sizeof(FormData_pg_class));
- MemCpy(relationForm, relp, CLASS_TUPLE_SIZE);
+ errno_t rc = memcpy_s(relationForm, CLASS_TUPLE_SIZE, relp, CLASS_TUPLE_SIZE);
+ securec_check(rc, "", "");
/* initialize relation tuple form */
relation->rd_rel = relationForm;
@@ -1473,17 +1459,18 @@ static void RelationParseRelOptions(Relation relation, HeapTuple tuple)
* we might not have any other for pg_class yet (consider executing this
* code for pg_class itself)
*/
- options = extractRelOptions(
- tuple, GetPgClassDescriptor(), RelationIsIndex(relation) ? relation->rd_am->amoptions : InvalidOid);
+ options = extractRelOptions(tuple, GetLSCPgClassDescriptor(),
+ RelationIsIndex(relation) ? relation->rd_am->amoptions : InvalidOid);
/*
- * Copy parsed data into u_sess->cache_mem_cxt. To guard against the
+ * Copy parsed data into LocalMyDBCacheMemCxt. To guard against the
* possibility of leaks in the reloptions code, we want to do the actual
* parsing in the caller's memory context and copy the results into
- * u_sess->cache_mem_cxt after the fact.
+ * LocalMyDBCacheMemCxt after the fact.
*/
if (options != NULL) {
- relation->rd_options = (bytea*)MemoryContextAlloc(u_sess->cache_mem_cxt, VARSIZE(options));
- MemCpy(relation->rd_options, options, VARSIZE(options));
+ relation->rd_options = (bytea*)MemoryContextAlloc(LocalMyDBCacheMemCxt(), VARSIZE(options));
+ errno_t rc = memcpy_s(relation->rd_options, VARSIZE(options), options, VARSIZE(options));
+ securec_check(rc, "", "");
pfree_ext(options);
}
}
@@ -1520,7 +1507,7 @@ static void RelationBuildTupleDesc(Relation relation, bool onlyLoadInitDefVal)
relation->rd_att->tdtypmod = -1; /* unnecessary, but... */
relation->rd_att->tdhasoid = relation->rd_rel->relhasoids;
- constr = (TupleConstr*)MemoryContextAllocZero(u_sess->cache_mem_cxt, sizeof(TupleConstr));
+ constr = (TupleConstr*)MemoryContextAllocZero(LocalMyDBCacheMemCxt(), sizeof(TupleConstr));
constr->has_not_null = false;
constr->has_generated_stored = false;
}
@@ -1553,7 +1540,7 @@ static void RelationBuildTupleDesc(Relation relation, bool onlyLoadInitDefVal)
*/
pg_attribute_desc = heap_open(AttributeRelationId, AccessShareLock);
pg_attribute_scan = systable_beginscan(
- pg_attribute_desc, AttributeRelidNumIndexId, u_sess->relcache_cxt.criticalRelcachesBuilt, snapshot, 2, skey);
+ pg_attribute_desc, AttributeRelidNumIndexId, LocalRelCacheCriticalRelcachesBuilt(), snapshot, 2, skey);
/*
* add attribute data to relation->rd_att
@@ -1567,7 +1554,7 @@ static void RelationBuildTupleDesc(Relation relation, bool onlyLoadInitDefVal)
return;
/* set all the *TupInitDefVal* objects later. */
- initdvals = (TupInitDefVal*)MemoryContextAllocZero(u_sess->cache_mem_cxt, need * sizeof(TupInitDefVal));
+ initdvals = (TupInitDefVal*)MemoryContextAllocZero(LocalMyDBCacheMemCxt(), need * sizeof(TupInitDefVal));
while (HeapTupleIsValid(pg_attribute_tuple = systable_getnext(pg_attribute_scan))) {
Form_pg_attribute attp;
@@ -1611,8 +1598,9 @@ static void RelationBuildTupleDesc(Relation relation, bool onlyLoadInitDefVal)
/* fetch and copy the default value. */
bytea* val = DatumGetByteaP(dval);
int len = VARSIZE(val) - VARHDRSZ;
- char* buf = (char*)MemoryContextAlloc(u_sess->cache_mem_cxt, len);
- MemCpy(buf, VARDATA(val), len);
+ char* buf = (char*)MemoryContextAlloc(LocalMyDBCacheMemCxt(), len);
+ errno_t rc = memcpy_s(buf, len, VARDATA(val), len);
+ securec_check(rc, "", "");
initdvals[attp->attnum - 1].isNull = false;
initdvals[attp->attnum - 1].datum = (Datum*)buf;
@@ -1628,7 +1616,7 @@ static void RelationBuildTupleDesc(Relation relation, bool onlyLoadInitDefVal)
if (attp->atthasdef && !onlyLoadInitDefVal) {
if (attrdef == NULL)
attrdef = (AttrDefault*)MemoryContextAllocZero(
- u_sess->cache_mem_cxt, RelationGetNumberOfAttributes(relation) * sizeof(AttrDefault));
+ LocalMyDBCacheMemCxt(), RelationGetNumberOfAttributes(relation) * sizeof(AttrDefault));
attrdef[ndef].adnum = attp->attnum;
attrdef[ndef].adbin = NULL;
ndef++;
@@ -1716,7 +1704,7 @@ static void RelationBuildTupleDesc(Relation relation, bool onlyLoadInitDefVal)
else
constr->defval = attrdef;
constr->num_defval = ndef;
- constr->generatedCols = (char *)MemoryContextAllocZero(u_sess->cache_mem_cxt,
+ constr->generatedCols = (char *)MemoryContextAllocZero(LocalMyDBCacheMemCxt(),
RelationGetNumberOfAttributes(relation) * sizeof(char));
AttrDefaultFetch(relation);
} else {
@@ -1729,7 +1717,7 @@ static void RelationBuildTupleDesc(Relation relation, bool onlyLoadInitDefVal)
{
constr->num_check = relation->rd_rel->relchecks;
constr->check =
- (ConstrCheck*)MemoryContextAllocZero(u_sess->cache_mem_cxt, constr->num_check * sizeof(ConstrCheck));
+ (ConstrCheck*)MemoryContextAllocZero(LocalMyDBCacheMemCxt(), constr->num_check * sizeof(ConstrCheck));
CheckConstraintFetch(relation);
} else {
constr->num_check = 0;
@@ -1764,7 +1752,7 @@ static void RelationBuildTupleDesc(Relation relation, bool onlyLoadInitDefVal)
* manageable. The other subsidiary data structures are simple enough
* to be easy to free explicitly, anyway.
*/
-static void RelationBuildRuleLock(Relation relation)
+void RelationBuildRuleLock(Relation relation)
{
MemoryContext rulescxt;
MemoryContext oldcxt;
@@ -1782,11 +1770,13 @@ static void RelationBuildRuleLock(Relation relation)
* Make the private context. Parameters are set on the assumption that
* it'll probably not contain much data.
*/
- rulescxt = AllocSetContextCreate(u_sess->cache_mem_cxt,
+
+ rulescxt = AllocSetContextCreate(LocalMyDBCacheMemCxt(),
RelationGetRelationName(relation),
ALLOCSET_SMALL_MINSIZE,
ALLOCSET_SMALL_INITSIZE,
ALLOCSET_SMALL_MAXSIZE);
+
relation->rd_rulescxt = rulescxt;
/*
@@ -1955,7 +1945,7 @@ static Relation CatalogRelationBuildDesc(const char* relationName, Oid relationR
bool has_not_null = false;
MemoryContext oldcxt;
/* Relcache entries must live in t_thrd.mem_cxt.cache_mem_cxt */
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
/*
* allocate new relation desc, clear all fields of reldesc
*/
@@ -2054,7 +2044,7 @@ CatalogRelationBuildParam GetCatalogParam(Oid targetId)
return result;
}
-static void SetBackendId(Relation relation)
+void SetBackendId(Relation relation)
{
switch (relation->rd_rel->relpersistence) {
case RELPERSISTENCE_UNLOGGED:
@@ -2085,7 +2075,7 @@ static void SetBackendId(Relation relation)
* (suggesting we are trying to access a just-deleted relation).
* Any other error is reported via elog.
*/
-static Relation RelationBuildDesc(Oid targetRelId, bool insertIt, bool buildkey)
+Relation RelationBuildDesc(Oid targetRelId, bool insertIt, bool buildkey)
{
Relation relation;
HeapTuple pg_class_tuple;
@@ -2102,7 +2092,6 @@ static Relation RelationBuildDesc(Oid targetRelId, bool insertIt, bool buildkey)
*/
if (!HeapTupleIsValid(pg_class_tuple))
return NULL;
-
/*
* get information from the pg_class_tuple
*/
@@ -2112,6 +2101,7 @@ static Relation RelationBuildDesc(Oid targetRelId, bool insertIt, bool buildkey)
CatalogRelationBuildParam catalogParam = GetCatalogParam(targetRelId);
if (catalogParam.oid != 0) {
int natts = 0;
+ catalogParam.relationReltype = relp->reltype;
relation = CatalogRelationBuildDesc(catalogParam.relationName,
catalogParam.relationReltype,
catalogParam.isshared,
@@ -2199,6 +2189,11 @@ static Relation RelationBuildDesc(Oid targetRelId, bool insertIt, bool buildkey)
/* extract reloptions if any */
RelationParseRelOptions(relation, pg_class_tuple);
+ relation->rd_att->tdhasuids = RELATION_HAS_UIDS(relation);
+ if (RELATION_HAS_UIDS(relation)) {
+ BuildUidHashCache(GetMyDatabaseId(), relid);
+ }
+
if (RelationIsRedistributeDest(relation))
relation->rd_att->tdisredistable = true;
@@ -2259,6 +2254,12 @@ static Relation RelationBuildDesc(Oid targetRelId, bool insertIt, bool buildkey)
relation->rd_createcsn = csnInfo.createcsn;
relation->rd_changecsn = csnInfo.changecsn;
+ if (relation->rd_id >= FirstNormalObjectId && IS_DISASTER_RECOVER_MODE) {
+ TransactionId xmin = HeapTupleGetRawXmin(pg_class_tuple);
+ relation->xmin_csn = CSNLogGetDRCommitSeqNo(xmin);
+ } else {
+ relation->xmin_csn = InvalidCommitSeqNo;
+ }
/*
* now we can free the memory allocated for pg_class_tuple
*/
@@ -2284,14 +2285,14 @@ static Relation RelationBuildDesc(Oid targetRelId, bool insertIt, bool buildkey)
relation->rd_isblockchain = false;
}
+ /* It's fully valid */
+ relation->rd_isvalid = true;
/*
* Insert newly created relation into relcache hash table, if requested.
*/
- if (insertIt)
- RelationCacheInsert(relation);
-
- /* It's fully valid */
- relation->rd_isvalid = true;
+ if (insertIt) {
+ RelationIdCacheInsertIntoLocal(relation);
+ }
return relation;
}
@@ -2402,7 +2403,7 @@ RelationInitBucketKey(Relation relation, HeapTuple tuple)
}
/* build Bucket key */
- old_context = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ old_context = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
/* Initialize int2verctor structure for attribute number array of bucket key*/
bkey = buildint2vector(NULL, nColumn);
@@ -2433,13 +2434,16 @@ RelationInitBucketKey(Relation relation, HeapTuple tuple)
* be treated as shared, even if relisshared isn't set. Hence we do not
* look at relisshared here.
*/
-static void RelationInitPhysicalAddr(Relation relation)
+void RelationInitPhysicalAddr(Relation relation)
{
relation->rd_node.spcNode = ConvertToRelfilenodeTblspcOid(relation->rd_rel->reltablespace);
if (relation->rd_node.spcNode == GLOBALTABLESPACE_OID)
relation->rd_node.dbNode = InvalidOid;
- else
- relation->rd_node.dbNode = u_sess->proc_cxt.MyDatabaseId;
+ else {
+ Assert(CheckMyDatabaseMatch());
+ relation->rd_node.dbNode = GetMyDatabaseId();
+ }
+
if (relation->rd_rel->relfilenode) {
/*
* Even if we are using a decoding snapshot that doesn't represent
@@ -2495,12 +2499,6 @@ static void RelationInitPhysicalAddr(Relation relation)
if (!RelationIsPartitioned(relation) && relation->storage_type == SEGMENT_PAGE) {
relation->rd_node.bucketNode = SegmentBktId;
}
-
- // setup page compression options
- relation->rd_node.opt = 0;
- if (relation->rd_options && REL_SUPPORT_COMPRESSED(relation)) {
- SetupPageCompressForRelation(&relation->rd_node, &((StdRdOptions*)(relation->rd_options))->compress, RelationGetRelationName(relation));
- }
}
static void IndexRelationInitKeyNums(Relation relation)
@@ -2513,7 +2511,7 @@ static void IndexRelationInitKeyNums(Relation relation)
indnkeyatts = RelationGetNumberOfAttributes(relation);
} else {
Datum indkeyDatum =
- heap_getattr(relation->rd_indextuple, Anum_pg_index_indnkeyatts, GetPgIndexDescriptor(), &isnull);
+ heap_getattr(relation->rd_indextuple, Anum_pg_index_indnkeyatts, GetLSCPgIndexDescriptor(), &isnull);
Assert(!isnull);
indnkeyatts = DatumGetInt16(indkeyDatum);
}
@@ -2557,7 +2555,7 @@ void RelationInitIndexAccessInfo(Relation relation, HeapTuple index_tuple)
ereport(ERROR,
(errcode(ERRCODE_CACHE_LOOKUP_FAILED),
errmsg("cache lookup failed for index %u", RelationGetRelid(relation))));
- oldcontext = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ oldcontext = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
relation->rd_indextuple = heap_copytuple(tuple);
relation->rd_index = (Form_pg_index)GETSTRUCT(relation->rd_indextuple);
(void)MemoryContextSwitchTo(oldcontext);
@@ -2576,7 +2574,7 @@ void RelationInitIndexAccessInfo(Relation relation, HeapTuple index_tuple)
ereport(ERROR,
(errcode(ERRCODE_CACHE_LOOKUP_FAILED),
errmsg("cache lookup failed for access method %u", relation->rd_rel->relam)));
- aform = (Form_pg_am)MemoryContextAlloc(u_sess->cache_mem_cxt, sizeof *aform);
+ aform = (Form_pg_am)MemoryContextAlloc(LocalMyDBCacheMemCxt(), sizeof *aform);
rc = memcpy_s(aform, sizeof(*aform), GETSTRUCT(tuple), sizeof(*aform));
securec_check(rc, "\0", "\0");
ReleaseSysCache(tuple);
@@ -2605,17 +2603,20 @@ void RelationInitIndexAccessInfo(Relation relation, HeapTuple index_tuple)
* Context parameters are set on the assumption that it'll probably not
* contain much data.
*/
- indexcxt = AllocSetContextCreate(u_sess->cache_mem_cxt,
+ indexcxt = AllocSetContextCreate(LocalMyDBCacheMemCxt(),
RelationGetRelationName(relation),
ALLOCSET_SMALL_MINSIZE,
ALLOCSET_SMALL_INITSIZE,
ALLOCSET_SMALL_MAXSIZE);
+
relation->rd_indexcxt = indexcxt;
/*
* Allocate arrays to hold data. Opclasses are not used for included
* columns, so allocate them for indnkeyatts only.
*/
+
+
relation->rd_aminfo = (RelationAmInfo*)MemoryContextAllocZero(indexcxt, sizeof(RelationAmInfo));
relation->rd_opfamily = (Oid*)MemoryContextAllocZero(indexcxt, indnkeyatts * sizeof(Oid));
@@ -2634,13 +2635,14 @@ void RelationInitIndexAccessInfo(Relation relation, HeapTuple index_tuple)
relation->rd_indcollation = (Oid*)MemoryContextAllocZero(indexcxt, indnkeyatts * sizeof(Oid));
relation->rd_indoption = (int16*)MemoryContextAllocZero(indexcxt, indnkeyatts * sizeof(int16));
-
+
/*
* indcollation cannot be referenced directly through the C struct,
* because it comes after the variable-width indkey field. Must extract
* the datum the hard way...
*/
- indcollDatum = fastgetattr(relation->rd_indextuple, Anum_pg_index_indcollation, GetPgIndexDescriptor(), &isnull);
+ indcollDatum = fastgetattr(relation->rd_indextuple, Anum_pg_index_indcollation,
+ GetLSCPgIndexDescriptor(), &isnull);
Assert(!isnull);
indcoll = (oidvector*)DatumGetPointer(indcollDatum);
rc = memcpy_s(relation->rd_indcollation, indnkeyatts * sizeof(Oid), indcoll->values, indnkeyatts * sizeof(Oid));
@@ -2651,7 +2653,8 @@ void RelationInitIndexAccessInfo(Relation relation, HeapTuple index_tuple)
* comes after the variable-width indkey field. Must extract the datum
* the hard way...
*/
- indclassDatum = fastgetattr(relation->rd_indextuple, Anum_pg_index_indclass, GetPgIndexDescriptor(), &isnull);
+ indclassDatum = fastgetattr(relation->rd_indextuple, Anum_pg_index_indclass,
+ GetLSCPgIndexDescriptor(), &isnull);
Assert(!isnull);
indclass = (oidvector*)DatumGetPointer(indclassDatum);
@@ -2660,13 +2663,14 @@ void RelationInitIndexAccessInfo(Relation relation, HeapTuple index_tuple)
* opfamilies and opclass input types. (aminfo and supportinfo are left
* as zeroes, and are filled on-the-fly when used)
*/
- IndexSupportInitialize(
- indclass, relation->rd_support, relation->rd_opfamily, relation->rd_opcintype, amsupport, indnkeyatts);
+ IndexSupportInitialize(relation,
+ indclass, amsupport, indnkeyatts);
/*
* Similarly extract indoption and copy it to the cache entry
*/
- indoptionDatum = fastgetattr(relation->rd_indextuple, Anum_pg_index_indoption, GetPgIndexDescriptor(), &isnull);
+ indoptionDatum = fastgetattr(relation->rd_indextuple, Anum_pg_index_indoption,
+ GetLSCPgIndexDescriptor(), &isnull);
Assert(!isnull);
indoption = (int2vector*)DatumGetPointer(indoptionDatum);
rc = memcpy_s(relation->rd_indoption, indnkeyatts * sizeof(int16), indoption->values, indnkeyatts * sizeof(int16));
@@ -2697,9 +2701,13 @@ void RelationInitIndexAccessInfo(Relation relation, HeapTuple index_tuple)
* numbers must always match those obtainable from the system catalog entries
* for the index and access method.
*/
-static void IndexSupportInitialize(oidvector* indclass, RegProcedure* indexSupport, Oid* opFamily, Oid* opcInType,
- StrategyNumber maxSupportNumber, AttrNumber maxAttributeNumber)
+static void IndexSupportInitialize(Relation relation, oidvector* indclass, StrategyNumber maxSupportNumber,
+ AttrNumber maxAttributeNumber)
{
+ RegProcedure* indexSupport = relation->rd_support;
+ Oid* opFamily = relation->rd_opfamily;
+ Oid* opcInType = relation->rd_opcintype;
+
int attIndex;
for (attIndex = 0; attIndex < maxAttributeNumber; attIndex++) {
@@ -2709,7 +2717,7 @@ static void IndexSupportInitialize(oidvector* indclass, RegProcedure* indexSuppo
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("bogus pg_index tuple")));
/* look up the info for this opclass, using a cache */
- opcentry = LookupOpclassInfo(indclass->values[attIndex], maxSupportNumber);
+ opcentry = LookupOpclassInfo(relation, indclass->values[attIndex], maxSupportNumber);
/* copy cached data into relcache entry */
opFamily[attIndex] = opcentry->opcfamily;
@@ -2744,7 +2752,7 @@ static void IndexSupportInitialize(oidvector* indclass, RegProcedure* indexSuppo
* be able to flush this cache as well as the contents of relcache entries
* for indexes.
*/
-static OpClassCacheEnt* LookupOpclassInfo(Oid operatorClassOid, StrategyNumber numSupport)
+static OpClassCacheEnt* LookupOpclassInfo(Relation relation, Oid operatorClassOid, StrategyNumber numSupport)
{
OpClassCacheEnt* opcentry = NULL;
bool found = false;
@@ -2757,7 +2765,6 @@ static OpClassCacheEnt* LookupOpclassInfo(Oid operatorClassOid, StrategyNumber n
if (u_sess->relcache_cxt.OpClassCache == NULL) {
/* First time through: initialize the opclass cache */
HASHCTL ctl;
-
MemSet(&ctl, 0, sizeof(ctl));
ctl.keysize = sizeof(Oid);
ctl.entrysize = sizeof(OpClassCacheEnt);
@@ -2766,9 +2773,8 @@ static OpClassCacheEnt* LookupOpclassInfo(Oid operatorClassOid, StrategyNumber n
u_sess->relcache_cxt.OpClassCache =
hash_create("Operator class cache", 64, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
}
-
- opcentry =
- (OpClassCacheEnt*)hash_search(u_sess->relcache_cxt.OpClassCache, (void*)&operatorClassOid, HASH_ENTER, &found);
+ opcentry = (OpClassCacheEnt *)hash_search(
+ u_sess->relcache_cxt.OpClassCache, (void *)&operatorClassOid, HASH_ENTER, &found);
/*
* After opcentry->supportProcs palloc failed, but opcentry has been inserted
@@ -2811,7 +2817,7 @@ static OpClassCacheEnt* LookupOpclassInfo(Oid operatorClassOid, StrategyNumber n
* looking up info for the opclasses used by the indexes we would like to
* reference here.
*/
- indexOK = u_sess->relcache_cxt.criticalRelcachesBuilt ||
+ indexOK = LocalRelCacheCriticalRelcachesBuilt() ||
(operatorClassOid != OID_BTREE_OPS_OID && operatorClassOid != INT2_BTREE_OPS_OID);
/*
@@ -2901,7 +2907,7 @@ static OpClassCacheEnt* LookupOpclassInfo(Oid operatorClassOid, StrategyNumber n
*
* NOTE: we assume we are already switched into u_sess->cache_mem_cxt.
*/
-static void formrdesc(const char* relationName, Oid relationReltype, bool isshared, bool hasoids, int natts,
+extern void formrdesc(const char* relationName, Oid relationReltype, bool isshared, bool hasoids, int natts,
const FormData_pg_attribute* attrs)
{
Relation relation;
@@ -2990,7 +2996,9 @@ static void formrdesc(const char* relationName, Oid relationReltype, bool isshar
*/
has_not_null = false;
for (i = 0; i < natts; i++) {
- MemCpy(relation->rd_att->attrs[i], &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
+ errno_t rc = memcpy_s(relation->rd_att->attrs[i], ATTRIBUTE_FIXED_PART_SIZE,
+ &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
+ securec_check(rc, "", "");
has_not_null = has_not_null || attrs[i].attnotnull;
/* make sure attcacheoff is valid */
relation->rd_att->attrs[i]->attcacheoff = -1;
@@ -3048,13 +3056,14 @@ static void formrdesc(const char* relationName, Oid relationReltype, bool isshar
relation->rd_rel->relhasindex = true;
}
+ /* It's fully valid */
+ relation->rd_isvalid = true;
+
/*
* add new reldesc to relcache
*/
- RelationCacheInsert(relation);
-
- /* It's fully valid */
- relation->rd_isvalid = true;
+ RelationIdCacheInsertIntoLocal(relation);
+ Assert(relation->rd_rel->relowner == InvalidOid);
}
/* ----------------------------------------------------------------
@@ -3080,6 +3089,10 @@ static void formrdesc(const char* relationName, Oid relationReltype, bool isshar
*/
Relation RelationIdGetRelation(Oid relationId)
{
+ Assert(CheckMyDatabaseMatch());
+ if (EnableLocalSysCache()) {
+ return t_thrd.lsc_cxt.lsc->tabdefcache.RelationIdGetRelation(relationId);
+ }
Relation rd;
/*
@@ -3117,7 +3130,7 @@ Relation RelationIdGetRelation(Oid relationId)
* no reldesc in the cache, so have RelationBuildDesc() build one and add
* it.
*/
- rd = RelationBuildDesc(relationId, true);
+ rd = RelationBuildDesc(relationId, true, true);
if (RelationIsValid(rd)) {
RelationIncrementReferenceCount(rd);
/* Insert TDE key to buffer cache for tde table */
@@ -3148,10 +3161,11 @@ void RelationIncrementReferenceCount(Relation rel)
if (RelationIsPartition(rel) || RelationIsBucket(rel)) {
return;
}
- ResourceOwnerEnlargeRelationRefs(t_thrd.utils_cxt.CurrentResourceOwner);
+
+ ResourceOwnerEnlargeRelationRefs(LOCAL_SYSDB_RESOWNER);
rel->rd_refcnt += 1;
if (!IsBootstrapProcessingMode())
- ResourceOwnerRememberRelationRef(t_thrd.utils_cxt.CurrentResourceOwner, rel);
+ ResourceOwnerRememberRelationRef(LOCAL_SYSDB_RESOWNER, rel);
}
/*
@@ -3167,7 +3181,7 @@ void RelationDecrementReferenceCount(Relation rel)
Assert(rel->rd_refcnt > 0);
rel->rd_refcnt -= 1;
if (!IsBootstrapProcessingMode())
- ResourceOwnerForgetRelationRef(t_thrd.utils_cxt.CurrentResourceOwner, rel);
+ ResourceOwnerForgetRelationRef(LOCAL_SYSDB_RESOWNER, rel);
}
void RelationIncrementReferenceCount(Oid relationId)
@@ -3178,7 +3192,7 @@ void RelationIncrementReferenceCount(Oid relationId)
void RelationDecrementReferenceCount(Oid relationId)
{
Relation rd;
- RelationIdCacheLookup(relationId, rd);
+ RelationIdCacheLookupOnlyLocal(relationId, rd);
if (RelationIsValid(rd)) {
RelationDecrementReferenceCount(rd);
}
@@ -3234,7 +3248,7 @@ void RelationClose(Relation relation)
* the heap and index in that order. This is ensured in current usage by
* only applying this to indexes being opened or having positive refcount.
*/
-static void RelationReloadIndexInfo(Relation relation)
+void RelationReloadIndexInfo(Relation relation)
{
bool indexOK = false;
HeapTuple pg_class_tuple;
@@ -3262,9 +3276,9 @@ static void RelationReloadIndexInfo(Relation relation)
ereport(DEBUG1,
(errmsg("relation->rd_rel->relisshared-%d criticalRelcachesBuilt-%d",
relation->rd_rel->relisshared,
- u_sess->relcache_cxt.criticalRelcachesBuilt)));
+ LocalRelCacheCriticalRelcachesBuilt())));
- if (relation->rd_rel->relisshared && !u_sess->relcache_cxt.criticalRelcachesBuilt) {
+ if (relation->rd_rel->relisshared && !LocalRelCacheCriticalRelcachesBuilt()) {
relation->rd_isvalid = true;
return;
}
@@ -3277,12 +3291,14 @@ static void RelationReloadIndexInfo(Relation relation)
*/
indexOK = (RelationGetRelid(relation) != ClassOidIndexId);
pg_class_tuple = ScanPgRelation(RelationGetRelid(relation), indexOK, false);
- if (!HeapTupleIsValid(pg_class_tuple))
+ if (!HeapTupleIsValid(pg_class_tuple)) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("could not find pg_class tuple for index %u", RelationGetRelid(relation))));
+ }
relp = (Form_pg_class)GETSTRUCT(pg_class_tuple);
- MemCpy(relation->rd_rel, relp, CLASS_TUPLE_SIZE);
+ errno_t rc = memcpy_s(relation->rd_rel, CLASS_TUPLE_SIZE, relp, CLASS_TUPLE_SIZE);
+ securec_check(rc, "", "");
/* Reload reloptions in case they changed */
if (relation->rd_options)
pfree_ext(relation->rd_options);
@@ -3357,13 +3373,37 @@ static void RelationDestroySliceMap(Relation relation)
return;
}
+
+static void RelationDestroyIndex(Relation rel)
+{
+ if (rel->rd_indexcxt != NULL) {
+ MemoryContextDelete(rel->rd_indexcxt);
+ rel->rd_indexcxt = NULL;
+ }
+}
+
+void RelationDestroyRule(Relation rel)
+{
+ if (rel->rd_rulescxt != NULL) {
+ MemoryContextDelete(rel->rd_rulescxt);
+ rel->rd_rulescxt = NULL;
+ }
+}
+
+void RelationDestroyRls(Relation rel)
+{
+ if (rel->rd_rlsdesc != NULL) {
+ MemoryContextDelete(rel->rd_rlsdesc->rlsCxt);
+ rel->rd_rlsdesc = NULL;
+ }
+}
/*
* RelationDestroyRelation
*
* Physically delete a relation cache entry and all subsidiary data.
* Caller must already have unhooked the entry from the hash table.
*/
-static void RelationDestroyRelation(Relation relation, bool remember_tupdesc)
+void RelationDestroyRelation(Relation relation, bool remember_tupdesc)
{
Assert(RelationHasReferenceCountZero(relation));
@@ -3378,8 +3418,7 @@ static void RelationDestroyRelation(Relation relation, bool remember_tupdesc)
* Free all the subsidiary data structures of the relcache entry, then the
* entry itself.
*/
- if (relation->rd_rel)
- pfree_ext(relation->rd_rel);
+ pfree_ext(relation->rd_rel);
/* can't use DecrTupleDescRefCount here */
Assert(relation->rd_att->tdrefcount > 0);
if (--relation->rd_att->tdrefcount == 0) {
@@ -3399,29 +3438,18 @@ static void RelationDestroyRelation(Relation relation, bool remember_tupdesc)
}
list_free_ext(relation->rd_indexlist);
bms_free_ext(relation->rd_indexattr);
- bms_free_ext(relation->rd_pkattr);
bms_free_ext(relation->rd_keyattr);
+ bms_free_ext(relation->rd_pkattr);
bms_free_ext(relation->rd_idattr);
- if (relation->rd_options) {
- pfree_ext(relation->rd_pubactions);
- }
+ pfree_ext(relation->rd_pubactions);
FreeTriggerDesc(relation->trigdesc);
- if (relation->rd_rlsdesc) {
- MemoryContextDelete(relation->rd_rlsdesc->rlsCxt);
- relation->rd_rlsdesc = NULL;
- }
- if (relation->rd_options)
- pfree_ext(relation->rd_options);
- if (relation->rd_indextuple)
- pfree_ext(relation->rd_indextuple);
- if (relation->rd_am)
- pfree_ext(relation->rd_am);
- if (relation->rd_indexcxt)
- MemoryContextDelete(relation->rd_indexcxt);
- if (relation->rd_rulescxt)
- MemoryContextDelete(relation->rd_rulescxt);
- if (relation->rd_fdwroutine)
- pfree_ext(relation->rd_fdwroutine);
+ RelationDestroyRls(relation);
+ pfree_ext(relation->rd_options);
+ pfree_ext(relation->rd_indextuple);
+ pfree_ext(relation->rd_am);
+ RelationDestroyIndex(relation);
+ RelationDestroyRule(relation);
+ pfree_ext(relation->rd_fdwroutine);
if (relation->partMap) {
RelationDestroyPartitionMap(relation->partMap);
}
@@ -3461,7 +3489,7 @@ static void RelationDestroyRelation(Relation relation, bool remember_tupdesc)
* to match the relation's refcnt status, but we keep it as a crosscheck
* that we're doing what the caller expects.
*/
-static void RelationClearRelation(Relation relation, bool rebuild)
+void RelationClearRelation(Relation relation, bool rebuild)
{
/*
* As per notes above, a rel to be rebuilt MUST have refcnt > 0; while of
@@ -3546,7 +3574,7 @@ static void RelationClearRelation(Relation relation, bool rebuild)
*/
if (!rebuild) {
/* Remove it from the hash table */
- RelationCacheDelete(relation);
+ RelationCacheDeleteLocal(relation);
/* And release storage */
RelationDestroyRelation(relation, false);
@@ -3580,14 +3608,20 @@ static void RelationClearRelation(Relation relation, bool rebuild)
* is good because whatever ref counts the entry may have do not
* necessarily belong to that resource owner.
*/
- Relation newrel;
+ Relation newrel = NULL;
Oid save_relid = RelationGetRelid(relation);
bool keep_tupdesc = false;
bool keep_rules = false;
bool buildkey = !REALTION_BUCKETKEY_INITED(relation);
/* Build temporary entry, but don't link it into hashtable */
- newrel = RelationBuildDesc(save_relid, false, buildkey);
+ if (EnableLocalSysCache()) {
+ // call build means local doesnt contain relation or it it invalid, so search from global directly
+ newrel = t_thrd.lsc_cxt.lsc->tabdefcache.SearchRelationFromGlobalCopy(save_relid);
+ }
+ if (!RelationIsValid(newrel)) {
+ newrel = RelationBuildDesc(save_relid, false, buildkey);
+ }
if (newrel == NULL) {
/*
* We can validly get here, if we're using a historic snapshot in
@@ -3638,9 +3672,12 @@ static void RelationClearRelation(Relation relation, bool rebuild)
{
RelationData tmpstruct;
- MemCpy(&tmpstruct, newrel, sizeof(RelationData));
- MemCpy(newrel, relation, sizeof(RelationData));
- MemCpy(relation, &tmpstruct, sizeof(RelationData));
+ errno_t rc = memcpy_s(&tmpstruct, sizeof(RelationData), newrel, sizeof(RelationData));
+ securec_check(rc, "", "");
+ rc = memcpy_s(newrel, sizeof(RelationData), relation, sizeof(RelationData));
+ securec_check(rc, "", "");
+ rc = memcpy_s(relation, sizeof(RelationData), &tmpstruct, sizeof(RelationData));
+ securec_check(rc, "", "");
}
/* rd_smgr must not be swapped, due to back-links from smgr level */
@@ -3655,8 +3692,8 @@ static void RelationClearRelation(Relation relation, bool rebuild)
/* un-swap rd_rel pointers, swap contents instead */
SWAPFIELD(Form_pg_class, rd_rel);
/* ... but actually, we don't have to update newrel->rd_rel */
- MemCpy(relation->rd_rel, newrel->rd_rel, CLASS_TUPLE_SIZE);
-
+ errno_t rc = memcpy_s(relation->rd_rel, CLASS_TUPLE_SIZE, newrel->rd_rel, CLASS_TUPLE_SIZE);
+ securec_check(rc, "", "");
if (newrel->partMap) {
RebuildPartitonMap(newrel->partMap, relation->partMap);
SWAPFIELD(PartitionMap*, partMap);
@@ -3681,14 +3718,12 @@ static void RelationClearRelation(Relation relation, bool rebuild)
/* pgstat_info must be preserved */
SWAPFIELD(struct PgStat_TableStatus*, pgstat_info);
- /* mlog OID override must be preserved */
- SWAPFIELD(Oid, rd_mlogoid);
-
/* newcbi flag and its related information must be preserved */
if (newrel->newcbi) {
SWAPFIELD(bool, newcbi);
relation->rd_node.bucketNode = newrel->rd_node.bucketNode;
}
+ SWAPFIELD(LocalRelationEntry*, entry);
#undef SWAPFIELD
/* And now we can throw away the temporary entry */
@@ -3737,7 +3772,7 @@ void RelationForgetRelation(Oid rid)
{
Relation relation;
- RelationIdCacheLookup(rid, relation);
+ RelationIdCacheLookupOnlyLocal(rid, relation);
if (!PointerIsValid(relation))
return; /* not in cache, nothing to do */
@@ -3766,12 +3801,16 @@ void RelationForgetRelation(Oid rid)
*/
void RelationCacheInvalidateEntry(Oid relationId)
{
+ if (unlikely(relationId == InvalidOid)) {
+ RelationCacheInvalidate();
+ return;
+ }
Relation relation;
- RelationIdCacheLookup(relationId, relation);
+ RelationIdCacheLookupOnlyLocal(relationId, relation);
if (PointerIsValid(relation)) {
- u_sess->relcache_cxt.relcacheInvalsReceived++;
+ AddLocalRelCacheInvalsReceived(1);
RelationFlushRelation(relation);
}
}
@@ -3806,8 +3845,13 @@ void RelationCacheInvalidateEntry(Oid relationId)
* items. This should ensure that system catalogs are up to date before
* we attempt to use them to reload information about other open relations.
*/
+
void RelationCacheInvalidate(void)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->tabdefcache.InvalidateRelationAll();
+ return;
+ }
HASH_SEQ_STATUS status;
RelIdCacheEnt* idhentry = NULL;
Relation relation;
@@ -3896,8 +3940,13 @@ void RelationCacheInvalidate(void)
*
* Need to invalidate bucket_ptr after modify node group.
*/
+
void RelationCacheInvalidateBuckets(void)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->tabdefcache.InvalidateRelationBucketsAll();
+ return;
+ }
HASH_SEQ_STATUS status;
RelIdCacheEnt* idhentry = NULL;
Relation relation;
@@ -3912,6 +3961,26 @@ void RelationCacheInvalidateBuckets(void)
}
}
+void InvalidateRelationNodeList()
+{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->tabdefcache.InvalidateRelationNodeList();
+ return;
+ }
+ HASH_SEQ_STATUS status;
+ RelIdCacheEnt* idhentry = NULL;
+ Relation relation;
+
+ hash_seq_init(&status, u_sess->relcache_cxt.RelationIdCache);
+
+ while ((idhentry = (RelIdCacheEnt*)hash_seq_search(&status)) != NULL) {
+ relation = idhentry->reldesc;
+ if (relation->rd_locator_info != NULL) {
+ RelationClearRelation(relation, !RelationHasReferenceCountZero(relation));
+ }
+ }
+}
+
/*
* RelationCloseSmgrByOid - close a relcache entry's smgr link
*
@@ -3922,7 +3991,7 @@ void RelationCloseSmgrByOid(Oid relationId)
{
Relation relation;
- RelationIdCacheLookup(relationId, relation);
+ RelationIdCacheLookupOnlyLocal(relationId, relation);
if (!PointerIsValid(relation))
return; /* not in cache, nothing to do */
@@ -3963,14 +4032,52 @@ TransactionId RelationGetRelFrozenxid64(Relation r)
return relfrozenxid64;
}
+TransactionId PartGetRelFrozenxid64(Partition part)
+{
+ Relation partRel;
+ HeapTuple partTuple;
+ Datum datum;
+ bool isNull;
+ TransactionId relfrozenxid64;
+
+ partTuple = SearchSysCache1(PARTRELID, ObjectIdGetDatum(part->pd_id));
+ if (!HeapTupleIsValid(partTuple)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_TABLE),
+ errmsg("cache lookup failed for relation %u", part->pd_id)));
+ }
+
+ partRel = heap_open(PartitionRelationId, AccessShareLock);
+
+ datum = heap_getattr(partTuple, Anum_pg_partition_relfrozenxid64, RelationGetDescr(partRel), &isNull);
+ if (isNull) {
+ relfrozenxid64 = part->pd_part->relfrozenxid;
+ if (TransactionIdPrecedes(t_thrd.xact_cxt.ShmemVariableCache->nextXid, relfrozenxid64) ||
+ !TransactionIdIsNormal(relfrozenxid64))
+ relfrozenxid64 = FirstNormalTransactionId;
+ } else {
+ relfrozenxid64 = DatumGetTransactionId(datum);
+ }
+
+ heap_close(partRel, AccessShareLock);
+ ReleaseSysCache(partTuple);
+
+ return relfrozenxid64;
+}
+
Oid RelationGetBucketOid(Relation relation)
{
return relation->rd_bucketoid;
}
/* Remember old tupleDescs when processing invalid messages */
+
void RememberToFreeTupleDescAtEOX(TupleDesc td)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->tabdefcache.RememberToFreeTupleDescAtEOX(td);
+ return;
+ }
if (u_sess->relcache_cxt.EOXactTupleDescArray == NULL) {
MemoryContext oldcxt = NULL;
oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
@@ -3995,6 +4102,10 @@ void RememberToFreeTupleDescAtEOX(TupleDesc td)
/* Free all tupleDescs remembered in RememberToFreeTupleDescAtEOX in a batch when a transaction ends */
void AtEOXact_FreeTupleDesc()
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->tabdefcache.AtEOXact_FreeTupleDesc();
+ return;
+ }
if (u_sess->relcache_cxt.EOXactTupleDescArrayLen > 0) {
Assert(u_sess->relcache_cxt.EOXactTupleDescArray != NULL);
int i;
@@ -4026,6 +4137,10 @@ void AtEOXact_FreeTupleDesc()
*/
void AtEOXact_RelationCache(bool isCommit)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->tabdefcache.AtEOXact_RelationCache(isCommit);
+ return;
+ }
HASH_SEQ_STATUS status;
RelIdCacheEnt* idhentry = NULL;
@@ -4124,6 +4239,11 @@ void AtEOXact_RelationCache(bool isCommit)
relation->rd_pkindex = InvalidOid;
relation->rd_indexvalid = 0;
}
+ if (relation->partMap != NULL && relation->partMap->isDirty) {
+ RelationClearRelation(relation, false);
+ hash_seq_term(&status);
+ hash_seq_init(&status, u_sess->relcache_cxt.RelationIdCache);
+ }
}
/* Once done with the transaction, we can reset u_sess->relcache_cxt.need_eoxact_work */
@@ -4139,6 +4259,10 @@ void AtEOXact_RelationCache(bool isCommit)
*/
void AtEOSubXact_RelationCache(bool isCommit, SubTransactionId mySubid, SubTransactionId parentSubid)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->tabdefcache.AtEOSubXact_RelationCache(isCommit, mySubid, parentSubid);
+ return;
+ }
HASH_SEQ_STATUS status;
RelIdCacheEnt* idhentry = NULL;
@@ -4211,9 +4335,8 @@ void AtEOSubXact_RelationCache(bool isCommit, SubTransactionId mySubid, SubTrans
* and enter it into the relcache.
*/
Relation RelationBuildLocalRelation(const char* relname, Oid relnamespace, TupleDesc tupDesc, Oid relid,
- Oid relfilenode, Oid reltablespace, bool shared_relation, bool mapped_relation, char relpersistence,
- char relkind, int8 row_compress, Datum reloptions, TableAmType tam_type, int8 relindexsplit,
- StorageType storage_type, Oid accessMethodObjectId)
+ Oid relfilenode, Oid reltablespace, bool shared_relation, bool mapped_relation, char relpersistence, char relkind,
+ int8 row_compress, TableAmType tam_type, int8 relindexsplit, StorageType storage_type)
{
Relation rel;
MemoryContext oldcxt;
@@ -4263,7 +4386,7 @@ Relation RelationBuildLocalRelation(const char* relname, Oid relnamespace, Tuple
/*
* switch to the cache context to create the relcache entry.
*/
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
/*
* allocate a new relation descriptor and fill in basic state fields.
@@ -4286,7 +4409,7 @@ Relation RelationBuildLocalRelation(const char* relname, Oid relnamespace, Tuple
rel->rd_newRelfilenodeSubid = InvalidSubTransactionId;
/* must flag that we have rels created in this transaction */
- u_sess->relcache_cxt.need_eoxact_work = true;
+ SetLocalRelCacheNeedEOXactWork(true);
/*
* create a new tuple descriptor from the one passed in. We do this
@@ -4329,7 +4452,6 @@ Relation RelationBuildLocalRelation(const char* relname, Oid relnamespace, Tuple
rel->rd_rel->relowner = BOOTSTRAP_SUPERUSERID;
rel->rd_rel->parttype = PARTTYPE_NON_PARTITIONED_RELATION;
rel->rd_rel->relrowmovement = false;
- rel->rd_rel->relam = accessMethodObjectId;
/* set up persistence and relcache fields dependent on it */
rel->rd_rel->relpersistence = relpersistence;
@@ -4386,31 +4508,26 @@ Relation RelationBuildLocalRelation(const char* relname, Oid relnamespace, Tuple
RelationInitPhysicalAddr(rel);
- /* compressed option was set by RelationInitPhysicalAddr if rel->rd_options != NULL */
- if (rel->rd_options == NULL && reloptions && SUPPORT_COMPRESSED(relkind, rel->rd_rel->relam)) {
- StdRdOptions *options = (StdRdOptions *) default_reloptions(reloptions, false, RELOPT_KIND_HEAP);
- SetupPageCompressForRelation(&rel->rd_node, &options->compress, RelationGetRelationName(rel));
- }
-
-
/* materialized view not initially scannable */
if (relkind == RELKIND_MATVIEW)
rel->rd_isscannable = false;
else
rel->rd_isscannable = true;
+ /* It's fully valid */
+ rel->rd_isvalid = true;
+
/*
* Okay to insert into the relcache hash tables.
*/
- RelationCacheInsert(rel);
+ RelationIdCacheInsertIntoLocal(rel);
/*
* done building relcache entry.
*/
(void)MemoryContextSwitchTo(oldcxt);
- /* It's fully valid */
- rel->rd_isvalid = true;
+
/*
* Caller expects us to pin the returned entry.
@@ -4652,7 +4769,7 @@ void RelationSetNewRelfilenode(Relation relation, TransactionId freezeXid, Multi
*/
relation->rd_newRelfilenodeSubid = GetCurrentSubTransactionId();
/* ... and now we have eoxact cleanup work to do */
- u_sess->relcache_cxt.need_eoxact_work = true;
+ SetLocalRelCacheNeedEOXactWork(true);
}
RelFileNodeBackend CreateNewRelfilenode(Relation relation, TransactionId freezeXid)
@@ -4680,6 +4797,34 @@ RelFileNodeBackend CreateNewRelfilenode(Relation relation, TransactionId freezeX
return newrnode;
}
+RelFileNodeBackend CreateNewRelfilenodePart(Relation parent, Partition part)
+{
+ Oid newrelfilenode;
+ RelFileNodeBackend newrnode;
+
+ /* Allocate a new relfilenode */
+ /*
+ * Create storage for the main fork of the new relfilenode.
+ *
+ * NOTE: any conflict in relfilenode value will be caught here, if
+ * GetNewRelFileNode messes up for any reason.
+ */
+
+ newrelfilenode = GetNewRelFileNode(part->pd_part->reltablespace, NULL, parent->rd_rel->relpersistence);
+
+ newrnode.node = part->pd_node;
+ newrnode.node.relNode = newrelfilenode;
+ newrnode.backend = parent->rd_backend;
+ if (RelationIsCrossBucketIndex(parent)) {
+ part->newcbi = true;
+ }
+
+ partition_create_new_storage(parent, part, newrnode);
+
+ return newrnode;
+}
+
+
void UpdatePgclass(Relation relation, TransactionId freezeXid, const RelFileNodeBackend *rnode)
{
Relation pg_class;
@@ -4742,6 +4887,74 @@ void UpdatePgclass(Relation relation, TransactionId freezeXid, const RelFileNode
return;
}
+void UpdatePartition(Relation parent, Partition part, TransactionId freezeXid, const RelFileNodeBackend *newrnode)
+{
+ Relation pg_partition;
+ HeapTuple tuple;
+ HeapTuple ntup;
+ Form_pg_partition partform;
+ Datum values[Natts_pg_partition];
+ bool nulls[Natts_pg_partition];
+ bool replaces[Natts_pg_partition];
+ errno_t rc;
+
+ /*
+ * Get a writable copy of the pg_partition tuple for the given relation.
+ */
+ pg_partition = heap_open(PartitionRelationId, RowExclusiveLock);
+
+ tuple = SearchSysCacheCopy1(PARTRELID, ObjectIdGetDatum(PartitionGetPartid(part)));
+
+ if (!HeapTupleIsValid(tuple)) {
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("could not find tuple for partition %u", PartitionGetPartid(part))));
+ }
+ partform = (Form_pg_partition)GETSTRUCT(tuple);
+
+ ereport(LOG,
+ (errmsg("Partition %s(%u) set newfilenode %u oldfilenode %u xid %lu",
+ PartitionGetPartitionName(part),
+ PartitionGetPartid(part),
+ newrnode->node.relNode,
+ part->pd_node.relNode,
+ GetCurrentTransactionIdIfAny())));
+
+
+ Assert(!((part)->pd_part->relfilenode == InvalidOid));
+ partform->relfilenode = newrnode->node.relNode;
+
+ Assert(!RELKIND_IS_SEQUENCE(parent->rd_rel->relkind));
+ partform->relpages = 0; /* it's empty until further notice */
+ partform->reltuples = 0;
+ partform->relallvisible = 0;
+
+ /* set relfrozenxid64 */
+ partform->relfrozenxid = (ShortTransactionId)InvalidTransactionId;
+
+ rc = memset_s(values, sizeof(values), 0, sizeof(values));
+ securec_check(rc, "\0", "\0");
+ rc = memset_s(nulls, sizeof(nulls), false, sizeof(nulls));
+ securec_check(rc, "\0", "\0");
+ rc = memset_s(replaces, sizeof(replaces), false, sizeof(replaces));
+ securec_check(rc, "\0", "\0");
+
+ replaces[Anum_pg_partition_relfrozenxid64 - 1] = true;
+ values[Anum_pg_partition_relfrozenxid64 - 1] = TransactionIdGetDatum(freezeXid);
+
+ ntup = heap_modify_tuple(tuple, RelationGetDescr(pg_partition), values, nulls, replaces);
+
+ simple_heap_update(pg_partition, &ntup->t_self, ntup);
+ CatalogUpdateIndexes(pg_partition, ntup);
+
+ heap_freetuple_ext(ntup);
+ heap_freetuple_ext(tuple);
+
+ heap_close(pg_partition, RowExclusiveLock);
+
+ return;
+}
+
/*
* RelationCacheInitialize
*
@@ -4755,9 +4968,12 @@ void UpdatePgclass(Relation relation, TransactionId freezeXid, const RelFileNode
*/
#define INITRELCACHESIZE 400
-
void RelationCacheInitialize(void)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->tabdefcache.Init();
+ return;
+ }
HASHCTL ctl;
/*
@@ -4788,8 +5004,13 @@ void RelationCacheInitialize(void)
* entries for the catalogs themselves. RelationCacheInitializePhase3
* will clean up as needed.
*/
+
void RelationCacheInitializePhase2(void)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->tabdefcache.InitPhase2();
+ return;
+ }
MemoryContext oldcxt;
/*
@@ -4845,8 +5066,7 @@ void RelationCacheInvalidOid(Relation relation)
* Use need to use hardcoded info in schemapg.h to fix it.
*/
natts = relation->rd_rel->relnatts;
- errno_t rc = EOK;
- MemCpy((char*)relation->rd_rel, (char*)relp, CLASS_TUPLE_SIZE);
+ errno_t rc = memcpy_s((char*)relation->rd_rel, CLASS_TUPLE_SIZE, (char*)relp, CLASS_TUPLE_SIZE);
securec_check(rc, "\0", "\0");
relation->rd_rel->relnatts = natts;
@@ -4882,8 +5102,13 @@ void RelationCacheInvalidOid(Relation relation)
* open any system catalog or use any catcache. The last step is to
* rewrite the cache files if needed.
*/
+
void RelationCacheInitializePhase3(void)
{
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->tabdefcache.InitPhase3();
+ return;
+ }
HASH_SEQ_STATUS status;
RelIdCacheEnt* idhentry = NULL;
MemoryContext oldcxt;
@@ -5127,7 +5352,7 @@ retry:
* indexoid is the OID of the target index, heapoid is the OID of the catalog
* it belongs to.
*/
-static void load_critical_index(Oid indexoid, Oid heapoid)
+extern Relation load_critical_index(Oid indexoid, Oid heapoid)
{
Relation ird;
int curRetryCnt = 0;
@@ -5171,6 +5396,7 @@ retry_if_standby_mode:
ird->rd_refcnt = 1;
UnlockRelationOid(indexoid, AccessShareLock);
UnlockRelationOid(heapoid, AccessShareLock);
+ return ird;
}
/*
* GetPgClassDescriptor -- get a predefined tuple descriptor for pg_class
@@ -5187,17 +5413,14 @@ retry_if_standby_mode:
TupleDesc BuildHardcodedDescriptor(int natts, const FormData_pg_attribute* attrs, bool hasoids)
{
TupleDesc result;
- MemoryContext oldcxt;
int i;
-
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
-
result = CreateTemplateTupleDesc(natts, hasoids, TAM_HEAP);
result->tdtypeid = RECORDOID; /* not right, but we don't care */
result->tdtypmod = -1;
for (i = 0; i < natts; i++) {
- MemCpy(result->attrs[i], &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
+ errno_t rc = memcpy_s(result->attrs[i], ATTRIBUTE_FIXED_PART_SIZE, &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
+ securec_check(rc, "", "");
/* make sure attcacheoff is valid */
result->attrs[i]->attcacheoff = -1;
}
@@ -5207,16 +5430,17 @@ TupleDesc BuildHardcodedDescriptor(int natts, const FormData_pg_attribute* attrs
/* Note: we don't bother to set up a TupleConstr entry */
- (void)MemoryContextSwitchTo(oldcxt);
-
return result;
}
-static TupleDesc GetPgClassDescriptor(void)
+extern TupleDesc GetPgClassDescriptor(void)
{
/* Already done? */
- if (u_sess->relcache_cxt.pgclassdesc == NULL)
+ if (u_sess->relcache_cxt.pgclassdesc == NULL) {
+ MemoryContext oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
u_sess->relcache_cxt.pgclassdesc = BuildHardcodedDescriptor(Natts_pg_class, Desc_pg_class, true);
+ (void)MemoryContextSwitchTo(oldcxt);
+ }
return u_sess->relcache_cxt.pgclassdesc;
}
@@ -5229,14 +5453,17 @@ static TupleDesc GetPgClassDescriptor(void)
*/
TupleDesc GetDefaultPgClassDesc(void)
{
- return GetPgClassDescriptor();
+ return GetLSCPgClassDescriptor();
}
-static TupleDesc GetPgIndexDescriptor(void)
+TupleDesc GetPgIndexDescriptor(void)
{
/* Already done? */
- if (u_sess->relcache_cxt.pgindexdesc == NULL)
+ if (u_sess->relcache_cxt.pgindexdesc == NULL) {
+ MemoryContext oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
u_sess->relcache_cxt.pgindexdesc = BuildHardcodedDescriptor(Natts_pg_index, Desc_pg_index, false);
+ (void)MemoryContextSwitchTo(oldcxt);
+ }
return u_sess->relcache_cxt.pgindexdesc;
}
@@ -5249,7 +5476,7 @@ static TupleDesc GetPgIndexDescriptor(void)
*/
TupleDesc GetDefaultPgIndexDesc(void)
{
- return GetPgIndexDescriptor();
+ return GetLSCPgIndexDescriptor();
}
/*
@@ -5315,7 +5542,7 @@ static void AttrDefaultFetch(Relation relation)
ereport(WARNING, (errmsg("null adbin for attr %s of rel %s",
NameStr(relation->rd_att->attrs[adform->adnum - 1]->attname), RelationGetRelationName(relation))));
else
- attrdef[i].adbin = MemoryContextStrdup(u_sess->cache_mem_cxt, TextDatumGetCString(val));
+ attrdef[i].adbin = MemoryContextStrdup(LocalMyDBCacheMemCxt(), TextDatumGetCString(val));
break;
}
@@ -5371,7 +5598,7 @@ static void CheckConstraintFetch(Relation relation)
check[found].ccvalid = conform->convalidated;
check[found].ccnoinherit = conform->connoinherit;
- check[found].ccname = MemoryContextStrdup(u_sess->cache_mem_cxt, NameStr(conform->conname));
+ check[found].ccname = MemoryContextStrdup(LocalMyDBCacheMemCxt(), NameStr(conform->conname));
/* Grab and test conbin is actually set */
val = fastgetattr(htup, Anum_pg_constraint_conbin, conrel->rd_att, &isnull);
@@ -5380,7 +5607,7 @@ static void CheckConstraintFetch(Relation relation)
(errcode(ERRCODE_UNEXPECTED_NULL_VALUE),
errmsg("null conbin for rel %s", RelationGetRelationName(relation))));
- check[found].ccbin = MemoryContextStrdup(u_sess->cache_mem_cxt, TextDatumGetCString(val));
+ check[found].ccbin = MemoryContextStrdup(LocalMyDBCacheMemCxt(), TextDatumGetCString(val));
found++;
}
@@ -5396,7 +5623,7 @@ static void CheckConstraintFetch(Relation relation)
void SaveCopyList(Relation relation, List* result, int oidIndex)
{
- MemoryContext oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ MemoryContext oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
if (relation->rd_indexlist) {
list_free_ext(relation->rd_indexlist);
}
@@ -5564,7 +5791,7 @@ List* RelationGetIndexList(Relation relation, bool inc_unused)
* because it comes after the variable-width indkey field. Must
* extract the datum the hard way...
*/
- indclassDatum = heap_getattr(htup, Anum_pg_index_indclass, GetPgIndexDescriptor(), &isnull);
+ indclassDatum = heap_getattr(htup, Anum_pg_index_indclass, GetLSCPgIndexDescriptor(), &isnull);
Assert(!isnull);
indclass = (oidvector*)DatumGetPointer(indclassDatum);
/*
@@ -5730,7 +5957,7 @@ int RelationGetIndexNum(Relation relation)
* because it comes after the variable-width indkey field. Must
* extract the datum the hard way...
*/
- indclassDatum = heap_getattr(htup, Anum_pg_index_indclass, GetPgIndexDescriptor(), &isnull);
+ indclassDatum = heap_getattr(htup, Anum_pg_index_indclass, GetLSCPgIndexDescriptor(), &isnull);
Assert(!isnull);
indclass = (oidvector*)DatumGetPointer(indclassDatum);
@@ -5808,7 +6035,7 @@ void RelationSetIndexList(Relation relation, List* indexIds, Oid oidIndex)
Assert(relation->rd_isnailed);
/* Copy the list into the cache context (could fail for lack of mem) */
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
indexIds = list_copy(indexIds);
(void)MemoryContextSwitchTo(oldcxt);
/* Okay to replace old list */
@@ -5822,7 +6049,7 @@ void RelationSetIndexList(Relation relation, List* indexIds, Oid oidIndex)
relation->rd_pkindex = InvalidOid;
relation->rd_indexvalid = 2; /* mark list as forced */
/* must flag that we have a forced index list */
- u_sess->relcache_cxt.need_eoxact_work = true;
+ SetLocalRelCacheNeedEOXactWork(true);
}
/*
@@ -5947,7 +6174,8 @@ List* RelationGetIndexExpressions(Relation relation)
* successfully completing the work, we copy it into the relcache entry.
* This avoids problems if we get some sort of error partway through.
*/
- exprsDatum = heap_getattr(relation->rd_indextuple, Anum_pg_index_indexprs, GetPgIndexDescriptor(), &isnull);
+ exprsDatum = heap_getattr(relation->rd_indextuple, Anum_pg_index_indexprs,
+ GetLSCPgIndexDescriptor(), &isnull);
Assert(!isnull);
exprsString = TextDatumGetCString(exprsDatum);
result = (List*)stringToNode(exprsString);
@@ -5994,7 +6222,8 @@ List* RelationGetDummyIndexExpressions(Relation relation)
}
/* Extract raw node tree(s) from index tuple. */
- exprsDatum = heap_getattr(relation->rd_indextuple, Anum_pg_index_indexprs, GetPgIndexDescriptor(), &isnull);
+ exprsDatum = heap_getattr(relation->rd_indextuple, Anum_pg_index_indexprs,
+ GetLSCPgIndexDescriptor(), &isnull);
Assert(!isnull);
exprsString = TextDatumGetCString(exprsDatum);
rawExprs = (List*)stringToNode(exprsString);
@@ -6042,7 +6271,7 @@ List* RelationGetIndexPredicate(Relation relation)
* successfully completing the work, we copy it into the relcache entry.
* This avoids problems if we get some sort of error partway through.
*/
- predDatum = heap_getattr(relation->rd_indextuple, Anum_pg_index_indpred, GetPgIndexDescriptor(), &isnull);
+ predDatum = heap_getattr(relation->rd_indextuple, Anum_pg_index_indpred, GetLSCPgIndexDescriptor(), &isnull);
Assert(!isnull);
predString = TextDatumGetCString(predDatum);
result = (List*)stringToNode(predString);
@@ -6116,7 +6345,7 @@ static void ClusterConstraintFetch(__inout Relation relation)
int numkeys = ARR_DIMS(arr)[0];
errno_t rc = EOK;
- *pClusterKeys = (AttrNumber*)MemoryContextAllocZero(u_sess->cache_mem_cxt, numkeys * sizeof(AttrNumber));
+ *pClusterKeys = (AttrNumber*)MemoryContextAllocZero(LocalMyDBCacheMemCxt(), numkeys * sizeof(AttrNumber));
rc = memcpy_s(*pClusterKeys, numkeys * sizeof(int16), ARR_DATA_PTR(arr), numkeys * sizeof(int16));
securec_check(rc, "\0", "\0");
@@ -6217,16 +6446,16 @@ Bitmapset* RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind att
* won't be returned at all by RelationGetIndexList.
*/
indexattrs = NULL;
- pkindexattrs = NULL;
uindexattrs = NULL;
+ pkindexattrs = NULL;
idindexattrs = NULL;
foreach (l, indexoidlist) {
Oid indexOid = lfirst_oid(l);
Relation indexDesc;
IndexInfo* indexInfo = NULL;
int i;
- bool isPK; /* primary key */
bool isKey = false; /* candidate key */
+ bool isPK; /* primary key */
bool isIDKey = false; /* replica identity index */
indexDesc = index_open(indexOid, AccessShareLock);
@@ -6234,10 +6463,10 @@ Bitmapset* RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind att
/* Extract index key information from the index's pg_index row */
indexInfo = BuildIndexInfo(indexDesc);
- /* Is this a primary key? */
- isPK = (indexOid == relpkindex);
/* Can this index be referenced by a foreign key? */
isKey = indexInfo->ii_Unique && indexInfo->ii_Expressions == NIL && indexInfo->ii_Predicate == NIL;
+ /* Is this a primary key? */
+ isPK = (indexOid == relpkindex);
/* Is this index the configured (or default) replica identity? */
isIDKey = (indexOid == relreplindex);
@@ -6294,9 +6523,9 @@ Bitmapset* RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind att
* leave the relcache entry looking like the other ones are valid but
* empty.
*/
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
- relation->rd_pkattr = bms_copy(pkindexattrs);
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
relation->rd_keyattr = bms_copy(uindexattrs);
+ relation->rd_pkattr = bms_copy(pkindexattrs);
relation->rd_idattr = bms_copy(idindexattrs);
relation->rd_indexattr = bms_copy(indexattrs);
(void)MemoryContextSwitchTo(oldcxt);
@@ -6365,7 +6594,7 @@ Bitmapset* IndexGetAttrBitmap(Relation relation, IndexInfo *indexInfo)
pull_varattnos((Node*)indexInfo->ii_Predicate, 1, &indexattrs);
/* Now save copies of the bitmaps in the relcache entry */
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
relation->rd_indexattr = bms_copy(indexattrs);
(void)MemoryContextSwitchTo(oldcxt);
@@ -6404,9 +6633,12 @@ void RelationGetExclusionInfo(Relation indexRelation, Oid** operators, Oid** pro
/* Quick exit if we have the data cached already */
if (indexRelation->rd_exclstrats != NULL) {
- MemCpy(ops, indexRelation->rd_exclops, sizeof(Oid) * indnkeyatts);
- MemCpy(funcs, indexRelation->rd_exclprocs, sizeof(Oid) * indnkeyatts);
- MemCpy(strats, indexRelation->rd_exclstrats, sizeof(uint16) * indnkeyatts);
+ errno_t rc = memcpy_s(ops, sizeof(Oid) * indnkeyatts, indexRelation->rd_exclops, sizeof(Oid) * indnkeyatts);
+ securec_check(rc, "", "");
+ rc = memcpy_s(funcs, sizeof(Oid) * indnkeyatts, indexRelation->rd_exclprocs, sizeof(Oid) * indnkeyatts);
+ securec_check(rc, "", "");
+ rc = memcpy_s(strats, sizeof(uint16) * indnkeyatts, indexRelation->rd_exclstrats, sizeof(uint16) * indnkeyatts);
+ securec_check(rc, "", "");
return;
}
@@ -6484,12 +6716,17 @@ void RelationGetExclusionInfo(Relation indexRelation, Oid** operators, Oid** pro
/* Save a copy of the results in the relcache entry. */
oldcxt = MemoryContextSwitchTo(indexRelation->rd_indexcxt);
+
indexRelation->rd_exclops = (Oid*)palloc(sizeof(Oid) * indnkeyatts);
indexRelation->rd_exclprocs = (Oid*)palloc(sizeof(Oid) * indnkeyatts);
indexRelation->rd_exclstrats = (uint16*)palloc(sizeof(uint16) * indnkeyatts);
- MemCpy(indexRelation->rd_exclops, ops, sizeof(Oid) * indnkeyatts);
- MemCpy(indexRelation->rd_exclprocs, funcs, sizeof(Oid) * indnkeyatts);
- MemCpy(indexRelation->rd_exclstrats, strats, sizeof(uint16) * indnkeyatts);
+
+ errno_t rc = memcpy_s(indexRelation->rd_exclops, sizeof(Oid) * indnkeyatts, ops, sizeof(Oid) * indnkeyatts);
+ securec_check(rc, "", "");
+ rc = memcpy_s(indexRelation->rd_exclprocs, sizeof(Oid) * indnkeyatts, funcs, sizeof(Oid) * indnkeyatts);
+ securec_check(rc, "", "");
+ rc = memcpy_s(indexRelation->rd_exclstrats, sizeof(uint16) * indnkeyatts, strats, sizeof(uint16) * indnkeyatts);
+ securec_check(rc, "", "");
(void)MemoryContextSwitchTo(oldcxt);
}
@@ -6504,6 +6741,14 @@ struct PublicationActions* GetRelationPublicationActions(Relation relation)
int rc;
PublicationActions* pubactions = (PublicationActions*)palloc0(sizeof(PublicationActions));
+ /*
+ * If not publishable, it publishes no actions. (pgoutput_change() will
+ * ignore it.)
+ */
+ if (!is_publishable_relation(relation)) {
+ return pubactions;
+ }
+
if (relation->rd_pubactions) {
errno_t rcs = memcpy_s(pubactions, sizeof(PublicationActions),
relation->rd_pubactions, sizeof(PublicationActions));
@@ -6548,8 +6793,8 @@ struct PublicationActions* GetRelationPublicationActions(Relation relation)
}
/* Now save copy of the actions in the relcache entry. */
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
- relation->rd_pubactions = (PublicationActions*)palloc(sizeof(PublicationActions));
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
+ relation->rd_pubactions = palloc(sizeof(PublicationActions));
rc = memcpy_s(relation->rd_pubactions, sizeof(PublicationActions), pubactions, sizeof(PublicationActions));
securec_check(rc, "", "");
MemoryContextSwitchTo(oldcxt);
@@ -6931,8 +7176,8 @@ static bool load_relcache_init_file(bool shared)
rel->rd_oidindex = InvalidOid;
rel->rd_pkindex = InvalidOid;
rel->rd_indexattr = NULL;
- rel->rd_pkattr = NULL;
rel->rd_keyattr = NULL;
+ rel->rd_pkattr = NULL;
rel->rd_idattr = NULL;
rel->rd_pubactions = NULL;
rel->rd_createSubid = InvalidSubTransactionId;
@@ -6973,7 +7218,7 @@ static bool load_relcache_init_file(bool shared)
* Now insert all the new relcache entries into the cache.
*/
for (relno = 0; relno < num_rels; relno++) {
- RelationCacheInsert(rels[relno]);
+ RelationIdCacheInsertIntoLocal(rels[relno]);
/* also make a list of their OIDs, for RelationIdIsInInitFile */
if (!shared)
u_sess->relcache_cxt.initFileRelationIds =
@@ -7216,7 +7461,7 @@ static void write_item(const void* data, Size len, FILE* fp)
*/
bool RelationIdIsInInitFile(Oid relationId)
{
- return list_member_oid(u_sess->relcache_cxt.initFileRelationIds, relationId);
+ return list_member_oid(LocalRelCacheInitFileRelationIds(), relationId);
}
/*
@@ -7460,7 +7705,7 @@ List* PartitionGetPartIndexList(Partition part, bool inc_unused)
* because it comes after the variable-width indkey field. Must
* extract the datum the hard way...
*/
- indclassDatum = heap_getattr(indexTup, Anum_pg_index_indclass, GetPgIndexDescriptor(), &isnull);
+ indclassDatum = heap_getattr(indexTup, Anum_pg_index_indclass, GetLSCPgIndexDescriptor(), &isnull);
Assert(!isnull);
indclass = (oidvector*)DatumGetPointer(indclassDatum);
@@ -7485,7 +7730,7 @@ List* PartitionGetPartIndexList(Partition part, bool inc_unused)
heap_close(partrel, AccessShareLock);
/* Now save a copy of the completed list in the relcache entry. */
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
if (part->pd_indexlist) {
list_free_ext(part->pd_indexlist);
}
@@ -7761,6 +8006,15 @@ Relation tuple_get_rel(HeapTuple pg_class_tuple, LOCKMODE lockmode, TupleDesc tu
if (lockmode != NoLock) {
LockRelationOid(relid, lockmode);
}
+ if (EnableLocalSysCache()) {
+ // local and global may has this relation
+ Relation rel = t_thrd.lsc_cxt.lsc->tabdefcache.SearchRelation(relid);
+ if (RelationIsValid(rel)) {
+ pgstat_initstats(rel);
+ RelationIncrementReferenceCount(rel);
+ return rel;
+ }
+ }
Form_pg_class relp = (Form_pg_class)GETSTRUCT(pg_class_tuple);
/* allocate storage for the relation descriptor, and copy pg_class_tuple to relation->rd_rel. */
Relation relation = AllocateRelationDesc(relp);
@@ -7772,7 +8026,7 @@ Relation tuple_get_rel(HeapTuple pg_class_tuple, LOCKMODE lockmode, TupleDesc tu
relation->rd_backend = InvalidBackendId;
relation->rd_islocaltemp = false;
/* initialize the tuple descriptor (relation->rd_att). */
- oldcxt = MemoryContextSwitchTo(u_sess->cache_mem_cxt);
+ oldcxt = MemoryContextSwitchTo(LocalMyDBCacheMemCxt());
relation->rd_att = CreateTupleDescCopy(tuple_desc);
relation->rd_att->tdtypeid = relation->rd_rel->reltype;
@@ -7808,8 +8062,8 @@ Relation tuple_get_rel(HeapTuple pg_class_tuple, LOCKMODE lockmode, TupleDesc tu
relation->rd_isvalid = true;
pgstat_initstats(relation);
- RelationCacheInsert(relation);
relation->rd_att->tdrefcount = 1;
+ RelationIdCacheInsertIntoLocal(relation);
if (RelationIsValid(relation)) {
RelationIncrementReferenceCount(relation);
}
@@ -7878,44 +8132,3 @@ char RelationGetRelReplident(Relation r)
return relreplident;
}
-void SetupPageCompressForRelation(RelFileNode* node, PageCompressOpts* compress_options, const char* relationName)
-{
- uint1 algorithm = compress_options->compressType;
- if (algorithm == COMPRESS_TYPE_NONE) {
- node->opt = 0;
- } else {
- if (!SUPPORT_PAGE_COMPRESSION) {
- ereport(ERROR, (errmsg("unsupported page compression on this platform")));
- }
-
- uint1 compressLevel;
- bool symbol = false;
- if (compress_options->compressLevel >= 0) {
- symbol = true;
- compressLevel = compress_options->compressLevel;
- } else {
- symbol = false;
- compressLevel = -compress_options->compressLevel;
- }
-
- bool success = false;
- uint1 chunkSize = ConvertChunkSize(compress_options->compressChunkSize, &success);
- if (!success) {
- ereport(ERROR, (errmsg("invalid compress_chunk_size %d , must be one of %d, %d, %d or %d for %s",
- compress_options->compressChunkSize, BLCKSZ / 16, BLCKSZ / 8, BLCKSZ / 4, BLCKSZ / 2,
- relationName)));
- }
-
- uint1 preallocChunks = 0;
- if (compress_options->compressPreallocChunks >= BLCKSZ / compress_options->compressChunkSize) {
- ereport(ERROR, (errmsg("invalid compress_prealloc_chunks %d , must be less than %d for %s",
- compress_options->compressPreallocChunks,
- BLCKSZ / compress_options->compressChunkSize, relationName)));
- } else {
- preallocChunks = (uint1)(compress_options->compressPreallocChunks);
- }
- node->opt = 0;
- SET_COMPRESS_OPTION((*node), compress_options->compressByteConvert, compress_options->compressDiffConvert,
- preallocChunks, symbol, compressLevel, algorithm, chunkSize);
- }
-}
\ No newline at end of file
diff --git a/src/common/backend/utils/cache/relfilenodemap.cpp b/src/common/backend/utils/cache/relfilenodemap.cpp
index 82af0c38a..5e3181a2e 100644
--- a/src/common/backend/utils/cache/relfilenodemap.cpp
+++ b/src/common/backend/utils/cache/relfilenodemap.cpp
@@ -35,6 +35,7 @@
#include "utils/relmapper.h"
#include "utils/snapmgr.h"
#include "utils/syscache.h"
+#include "utils/knl_localsysdbcache.h"
const int HASH_ELEM_SIZE = 1024;
@@ -52,14 +53,15 @@ typedef struct {
* RelfilenodeMapInvalidateCallback
* Flush mapping entries when pg_class is updated in a relevant fashion.
*/
-static void RelfilenodeMapInvalidateCallback(Datum arg, Oid relid)
+void RelfilenodeMapInvalidateCallback(Datum arg, Oid relid)
{
HASH_SEQ_STATUS status;
RelfilenodeMapEntry* entry = NULL;
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
/* callback only gets registered after creating the hash */
- Assert(u_sess->relmap_cxt.RelfilenodeMapHash != NULL);
+ Assert(relmap_cxt->RelfilenodeMapHash != NULL);
- hash_seq_init(&status, u_sess->relmap_cxt.RelfilenodeMapHash);
+ hash_seq_init(&status, relmap_cxt->RelfilenodeMapHash);
while ((entry = (RelfilenodeMapEntry*)hash_seq_search(&status)) != NULL) {
/*
* If relid is InvalidOid, signalling a complete reset, we must remove
@@ -69,21 +71,22 @@ static void RelfilenodeMapInvalidateCallback(Datum arg, Oid relid)
if (relid == InvalidOid || /* complete reset */
entry->relid == InvalidOid || /* negative cache entry */
entry->relid == relid) { /* individual flushed relation */
- if (hash_search(u_sess->relmap_cxt.RelfilenodeMapHash, (void *) &entry->key, HASH_REMOVE, NULL) == NULL) {
+ if (hash_search(relmap_cxt->RelfilenodeMapHash, (void *) &entry->key, HASH_REMOVE, NULL) == NULL) {
ereport(ERROR, (errcode(ERRCODE_RELFILENODEMAP), errmsg("hash table corrupted")));
}
}
}
}
-static void UHeapRelfilenodeMapInvalidateCallback(Datum arg, Oid relid)
+void UHeapRelfilenodeMapInvalidateCallback(Datum arg, Oid relid)
{
HASH_SEQ_STATUS status;
RelfilenodeMapEntry* entry = NULL;
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
/* callback only gets registered after creating the hash */
- Assert(u_sess->relmap_cxt.UHeapRelfilenodeMapHash != NULL);
+ Assert(relmap_cxt->UHeapRelfilenodeMapHash != NULL);
- hash_seq_init(&status, u_sess->relmap_cxt.UHeapRelfilenodeMapHash);
+ hash_seq_init(&status, relmap_cxt->UHeapRelfilenodeMapHash);
while ((entry = (RelfilenodeMapEntry*)hash_seq_search(&status)) != NULL) {
/*
* If relid is InvalidOid, signalling a complete reset, we must remove
@@ -93,7 +96,7 @@ static void UHeapRelfilenodeMapInvalidateCallback(Datum arg, Oid relid)
if (relid == InvalidOid || /* complete reset */
entry->relid == InvalidOid || /* negative cache entry */
entry->relid == relid) { /* individual flushed relation */
- if (hash_search(u_sess->relmap_cxt.UHeapRelfilenodeMapHash,
+ if (hash_search(relmap_cxt->UHeapRelfilenodeMapHash,
(void *) &entry->key, HASH_REMOVE, NULL) == NULL) {
ereport(ERROR, (errcode(ERRCODE_RELFILENODEMAP), errmsg("hash table corrupted")));
}
@@ -108,21 +111,21 @@ static void UHeapRelfilenodeMapInvalidateCallback(Datum arg, Oid relid)
static void InitializeRelfilenodeMap()
{
int i;
-
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
/* build skey */
- errno_t ret = memset_s(&u_sess->relmap_cxt.relfilenodeSkey, sizeof(u_sess->relmap_cxt.relfilenodeSkey), 0,
- sizeof(u_sess->relmap_cxt.relfilenodeSkey));
+ errno_t ret = memset_s(&relmap_cxt->relfilenodeSkey, sizeof(relmap_cxt->relfilenodeSkey), 0,
+ sizeof(relmap_cxt->relfilenodeSkey));
securec_check(ret, "\0", "\0");
for (i = 0; i < 2; i++) {
- fmgr_info_cxt(F_OIDEQ, &u_sess->relmap_cxt.relfilenodeSkey[i].sk_func, u_sess->cache_mem_cxt);
- u_sess->relmap_cxt.relfilenodeSkey[i].sk_strategy = BTEqualStrategyNumber;
- u_sess->relmap_cxt.relfilenodeSkey[i].sk_subtype = InvalidOid;
- u_sess->relmap_cxt.relfilenodeSkey[i].sk_collation = InvalidOid;
+ fmgr_info_cxt(F_OIDEQ, &relmap_cxt->relfilenodeSkey[i].sk_func, LocalMyDBCacheMemCxt());
+ relmap_cxt->relfilenodeSkey[i].sk_strategy = BTEqualStrategyNumber;
+ relmap_cxt->relfilenodeSkey[i].sk_subtype = InvalidOid;
+ relmap_cxt->relfilenodeSkey[i].sk_collation = InvalidOid;
}
- u_sess->relmap_cxt.relfilenodeSkey[0].sk_attno = Anum_pg_class_reltablespace;
- u_sess->relmap_cxt.relfilenodeSkey[1].sk_attno = Anum_pg_class_relfilenode;
+ relmap_cxt->relfilenodeSkey[0].sk_attno = Anum_pg_class_reltablespace;
+ relmap_cxt->relfilenodeSkey[1].sk_attno = Anum_pg_class_relfilenode;
/* Initialize the hash table. */
HASHCTL ctl;
@@ -131,40 +134,55 @@ static void InitializeRelfilenodeMap()
ctl.keysize = sizeof(RelfilenodeMapKey);
ctl.entrysize = sizeof(RelfilenodeMapEntry);
ctl.hash = tag_hash;
- ctl.hcxt = u_sess->cache_mem_cxt;
+ if (EnableLocalSysCache()) {
+ Assert(t_thrd.lsc_cxt.lsc->relmap_cxt.RelfilenodeMapHash == NULL);
+ ctl.hcxt = t_thrd.lsc_cxt.lsc->lsc_mydb_memcxt;
- /*
- * Only create the u_sess->relmap_cxt.RelfilenodeMapHash now, so we don't end up partially
- * initialized when fmgr_info_cxt() above ERRORs out with an out of memory
- * error.
- */
- u_sess->relmap_cxt.RelfilenodeMapHash =
- hash_create("RelfilenodeMap cache", 1024, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
+ /*
+ * Only create the relmap_cxt->RelfilenodeMapHash now, so we don't end up partially
+ * initialized when fmgr_info_cxt() above ERRORs out with an out of memory
+ * error.
+ */
+ t_thrd.lsc_cxt.lsc->relmap_cxt.RelfilenodeMapHash =
+ hash_create("RelfilenodeMap cache", 1024, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
- /* Watch for invalidation events. */
- CacheRegisterRelcacheCallback(RelfilenodeMapInvalidateCallback, (Datum)0);
+ /* Watch for invalidation events. */
+ CacheRegisterThreadRelcacheCallback(RelfilenodeMapInvalidateCallback, (Datum)0);
+ } else {
+ ctl.hcxt = u_sess->cache_mem_cxt;
+ /*
+ * Only create the relmap_cxt->RelfilenodeMapHash now, so we don't end up partially
+ * initialized when fmgr_info_cxt() above ERRORs out with an out of memory
+ * error.
+ */
+ u_sess->relmap_cxt.RelfilenodeMapHash =
+ hash_create("RelfilenodeMap cache", 1024, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
+
+ /* Watch for invalidation events. */
+ CacheRegisterSessionRelcacheCallback(RelfilenodeMapInvalidateCallback, (Datum)0);
+ }
}
static void UHeapInitRelfilenodeMap(void)
{
HASHCTL ctl;
int i;
-
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
/* build skey */
- errno_t ret = memset_s(&u_sess->relmap_cxt.uHeapRelfilenodeSkey,
- sizeof(u_sess->relmap_cxt.relfilenodeSkey), 0, sizeof(u_sess->relmap_cxt.relfilenodeSkey));
+ errno_t ret = memset_s(&relmap_cxt->uHeapRelfilenodeSkey,
+ sizeof(relmap_cxt->relfilenodeSkey), 0, sizeof(relmap_cxt->relfilenodeSkey));
securec_check(ret, "\0", "\0");
for (i = 0; i < 2; i++) {
- fmgr_info_cxt(F_OIDEQ, &u_sess->relmap_cxt.uHeapRelfilenodeSkey[i].sk_func,
- u_sess->cache_mem_cxt);
- u_sess->relmap_cxt.uHeapRelfilenodeSkey[i].sk_strategy = BTEqualStrategyNumber;
- u_sess->relmap_cxt.uHeapRelfilenodeSkey[i].sk_subtype = InvalidOid;
- u_sess->relmap_cxt.uHeapRelfilenodeSkey[i].sk_collation = InvalidOid;
+ fmgr_info_cxt(F_OIDEQ, &relmap_cxt->uHeapRelfilenodeSkey[i].sk_func,
+ LocalMyDBCacheMemCxt());
+ relmap_cxt->uHeapRelfilenodeSkey[i].sk_strategy = BTEqualStrategyNumber;
+ relmap_cxt->uHeapRelfilenodeSkey[i].sk_subtype = InvalidOid;
+ relmap_cxt->uHeapRelfilenodeSkey[i].sk_collation = InvalidOid;
}
- u_sess->relmap_cxt.uHeapRelfilenodeSkey[0].sk_attno = Anum_pg_class_reltablespace;
- u_sess->relmap_cxt.uHeapRelfilenodeSkey[1].sk_attno = Anum_pg_class_relfilenode;
+ relmap_cxt->uHeapRelfilenodeSkey[0].sk_attno = Anum_pg_class_reltablespace;
+ relmap_cxt->uHeapRelfilenodeSkey[1].sk_attno = Anum_pg_class_relfilenode;
/* Initialize the hash table. */
ret = memset_s(&ctl, sizeof(ctl), 0, sizeof(ctl));
@@ -172,18 +190,34 @@ static void UHeapInitRelfilenodeMap(void)
ctl.keysize = sizeof(RelfilenodeMapKey);
ctl.entrysize = sizeof(RelfilenodeMapEntry);
ctl.hash = tag_hash;
- ctl.hcxt = u_sess->cache_mem_cxt;
+ if (EnableLocalSysCache()) {
+ Assert(relmap_cxt->UHeapRelfilenodeMapHash == NULL);
+ ctl.hcxt = t_thrd.lsc_cxt.lsc->lsc_mydb_memcxt;
- /*
- * Only create the u_sess->relmap_cxt.RelfilenodeMapHash now, so we don't end up partially
- * initialized when fmgr_info_cxt() above ERRORs out with an out of memory
- * error.
- */
- u_sess->relmap_cxt.UHeapRelfilenodeMapHash = hash_create("UHeapRelfilenodeMap cache",
- HASH_ELEM_SIZE, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
+ /*
+ * Only create the relmap_cxt->RelfilenodeMapHash now, so we don't end up partially
+ * initialized when fmgr_info_cxt() above ERRORs out with an out of memory
+ * error.
+ */
+ relmap_cxt->UHeapRelfilenodeMapHash = hash_create("UHeapRelfilenodeMap cache",
+ HASH_ELEM_SIZE, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
- /* Watch for invalidation events. */
- CacheRegisterRelcacheCallback(UHeapRelfilenodeMapInvalidateCallback, (Datum)0);
+ /* Watch for invalidation events. */
+ CacheRegisterThreadRelcacheCallback(UHeapRelfilenodeMapInvalidateCallback, (Datum)0);
+ } else {
+ ctl.hcxt = u_sess->cache_mem_cxt;
+
+ /*
+ * Only create the relmap_cxt->RelfilenodeMapHash now, so we don't end up partially
+ * initialized when fmgr_info_cxt() above ERRORs out with an out of memory
+ * error.
+ */
+ u_sess->relmap_cxt.UHeapRelfilenodeMapHash = hash_create("UHeapRelfilenodeMap cache",
+ HASH_ELEM_SIZE, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
+
+ /* Watch for invalidation events. */
+ CacheRegisterSessionRelcacheCallback(UHeapRelfilenodeMapInvalidateCallback, (Datum)0);
+ }
}
/*
@@ -203,7 +237,8 @@ Oid RelidByRelfilenode(Oid reltablespace, Oid relfilenode, bool segment)
ScanKeyData skey[2];
Oid relid;
int rc = 0;
- if (u_sess->relmap_cxt.RelfilenodeMapHash == NULL) {
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
+ if (relmap_cxt->RelfilenodeMapHash == NULL) {
InitializeRelfilenodeMap();
}
@@ -228,7 +263,7 @@ Oid RelidByRelfilenode(Oid reltablespace, Oid relfilenode, bool segment)
* since querying invalid values isn't supposed to be a frequent thing,
* but it's basically free.
*/
- entry = (RelfilenodeMapEntry*)hash_search(u_sess->relmap_cxt.RelfilenodeMapHash, (void*)&key, HASH_FIND, &found);
+ entry = (RelfilenodeMapEntry*)hash_search(relmap_cxt->RelfilenodeMapHash, (void*)&key, HASH_FIND, &found);
if (found)
return entry->relid;
@@ -254,7 +289,7 @@ Oid RelidByRelfilenode(Oid reltablespace, Oid relfilenode, bool segment)
relation = heap_open(RelationRelationId, AccessShareLock);
/* copy scankey to local copy, it will be modified during the scan */
- rc = memcpy_s(skey, sizeof(skey), u_sess->relmap_cxt.relfilenodeSkey, sizeof(skey));
+ rc = memcpy_s(skey, sizeof(skey), relmap_cxt->relfilenodeSkey, sizeof(skey));
securec_check(rc, "", "");
/* set scan arguments */
@@ -313,7 +348,7 @@ Oid RelidByRelfilenode(Oid reltablespace, Oid relfilenode, bool segment)
*/
if (relid != InvalidOid) {
entry =
- (RelfilenodeMapEntry*)hash_search(u_sess->relmap_cxt.RelfilenodeMapHash, (void*)&key, HASH_ENTER, &found);
+ (RelfilenodeMapEntry*)hash_search(relmap_cxt->RelfilenodeMapHash, (void*)&key, HASH_ENTER, &found);
entry->relid = relid;
}
if (found)
@@ -333,7 +368,8 @@ Oid UHeapRelidByRelfilenode(Oid reltablespace, Oid relfilenode)
ScanKeyData skey[2];
Oid relid;
int rc = 0;
- if (u_sess->relmap_cxt.UHeapRelfilenodeMapHash == NULL)
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
+ if (relmap_cxt->UHeapRelfilenodeMapHash == NULL)
UHeapInitRelfilenodeMap();
/* pg_class will show 0 when the value is actually u_sess->proc_cxt.MyDatabaseTableSpace */
@@ -357,7 +393,7 @@ Oid UHeapRelidByRelfilenode(Oid reltablespace, Oid relfilenode)
* since querying invalid values isn't supposed to be a frequent thing,
* but it's basically free.
*/
- entry = (RelfilenodeMapEntry*)hash_search(u_sess->relmap_cxt.UHeapRelfilenodeMapHash,
+ entry = (RelfilenodeMapEntry*)hash_search(relmap_cxt->UHeapRelfilenodeMapHash,
(void*)&key, HASH_FIND, &found);
if (found)
@@ -374,7 +410,7 @@ Oid UHeapRelidByRelfilenode(Oid reltablespace, Oid relfilenode)
relation = heap_open(RelationRelationId, AccessShareLock);
/* copy scankey to local copy, it will be modified during the scan */
- rc = memcpy_s(skey, sizeof(skey), u_sess->relmap_cxt.uHeapRelfilenodeSkey, sizeof(skey));
+ rc = memcpy_s(skey, sizeof(skey), relmap_cxt->uHeapRelfilenodeSkey, sizeof(skey));
securec_check(rc, "", "");
/* set scan arguments */
@@ -406,7 +442,7 @@ Oid UHeapRelidByRelfilenode(Oid reltablespace, Oid relfilenode)
* new entry if we had entered it above.
*/
if (relid != InvalidOid) {
- entry = (RelfilenodeMapEntry*)hash_search(u_sess->relmap_cxt.UHeapRelfilenodeMapHash,
+ entry = (RelfilenodeMapEntry*)hash_search(relmap_cxt->UHeapRelfilenodeMapHash,
(void*)&key, HASH_ENTER, &found);
entry->relid = relid;
}
@@ -441,7 +477,7 @@ Oid PartitionRelidByRelfilenode(Oid reltablespace, Oid relfilenode, Oid &partati
/* check plain relations by looking in pg_class */
relation = heap_open(PartitionRelationId, AccessShareLock);
- rc = memcpy_s(skey, sizeof(skey), u_sess->relmap_cxt.relfilenodeSkey, sizeof(skey));
+ rc = memcpy_s(skey, sizeof(skey), GetRelMapCxt()->relfilenodeSkey, sizeof(skey));
securec_check(rc, "", "");
ScanKeyInit(&skey[0], Anum_pg_partition_reltablespace, BTEqualStrategyNumber, F_OIDEQ,
@@ -538,7 +574,7 @@ Oid UHeapPartitionRelidByRelfilenode(Oid reltablespace, Oid relfilenode, Oid& pa
/* check plain relations by looking in pg_class */
relation = heap_open(PartitionRelationId, AccessShareLock);
- rc = memcpy_s(skey, sizeof(skey), u_sess->relmap_cxt.uHeapRelfilenodeSkey, sizeof(skey));
+ rc = memcpy_s(skey, sizeof(skey), GetRelMapCxt()->uHeapRelfilenodeSkey, sizeof(skey));
securec_check(rc, "", "");
skey[0].sk_attno = Anum_pg_partition_reltablespace;
skey[1].sk_attno = Anum_pg_partition_relfilenode;
diff --git a/src/common/backend/utils/cache/relmapper.cpp b/src/common/backend/utils/cache/relmapper.cpp
index 4636f8d8f..f08d4363e 100644
--- a/src/common/backend/utils/cache/relmapper.cpp
+++ b/src/common/backend/utils/cache/relmapper.cpp
@@ -59,8 +59,6 @@
/* non-export function prototypes */
static void apply_map_update(RelMapFile* map, Oid relationId, Oid fileNode, bool add_okay);
static void merge_map_updates(RelMapFile* map, const RelMapFile* updates, bool add_okay);
-static void load_relmap_file(bool shared);
-static void recover_relmap_file(bool shared, bool backupfile);
static void write_relmap_file(bool shared, RelMapFile* newmap, bool write_wal, bool send_sinval, bool preserve_files,
Oid dbid, Oid tsid, const char* dbpath);
static void perform_relmap_update(bool shared, const RelMapFile* updates);
@@ -73,6 +71,7 @@ static pg_crc32 RelmapCrcComp(RelMapFile* map);
static int32 ReadRelMapFile(RelMapFile* map, int fd, bool isNewMap);
static int32 WriteRelMapFile(RelMapFile* map, int fd);
+static void recover_relmap_file(bool shared, bool backupfile, RelMapFile* real_map);
/*
* RelationMapOidToFilenode
*
@@ -89,29 +88,29 @@ Oid RelationMapOidToFilenode(Oid relationId, bool shared)
{
const RelMapFile* map = NULL;
int32 i;
-
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
/* If there are active updates, believe those over the main maps */
if (shared) {
- map = u_sess->relmap_cxt.active_shared_updates;
+ map = relmap_cxt->active_shared_updates;
for (i = 0; i < map->num_mappings; i++) {
if (relationId == map->mappings[i].mapoid) {
return map->mappings[i].mapfilenode;
}
}
- map = u_sess->relmap_cxt.shared_map;
+ map = relmap_cxt->shared_map;
for (i = 0; i < map->num_mappings; i++) {
if (relationId == map->mappings[i].mapoid) {
return map->mappings[i].mapfilenode;
}
}
} else {
- map = u_sess->relmap_cxt.active_local_updates;
+ map = relmap_cxt->active_local_updates;
for (i = 0; i < map->num_mappings; i++) {
if (relationId == map->mappings[i].mapoid) {
return map->mappings[i].mapfilenode;
}
}
- map = u_sess->relmap_cxt.local_map;
+ map = relmap_cxt->local_map;
for (i = 0; i < map->num_mappings; i++) {
if (relationId == map->mappings[i].mapoid) {
return map->mappings[i].mapfilenode;
@@ -138,29 +137,29 @@ Oid RelationMapFilenodeToOid(Oid filenode, bool shared)
{
const RelMapFile* map = NULL;
int32 i;
-
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
/* If there are active updates, believe those over the main maps */
if (shared) {
- map = u_sess->relmap_cxt.active_shared_updates;
+ map = relmap_cxt->active_shared_updates;
for (i = 0; i < map->num_mappings; i++) {
if (filenode == map->mappings[i].mapfilenode) {
return map->mappings[i].mapoid;
}
}
- map = u_sess->relmap_cxt.shared_map;
+ map = relmap_cxt->shared_map;
for (i = 0; i < map->num_mappings; i++) {
if (filenode == map->mappings[i].mapfilenode) {
return map->mappings[i].mapoid;
}
}
} else {
- map = u_sess->relmap_cxt.active_local_updates;
+ map = relmap_cxt->active_local_updates;
for (i = 0; i < map->num_mappings; i++) {
if (filenode == map->mappings[i].mapfilenode) {
return map->mappings[i].mapoid;
}
}
- map = u_sess->relmap_cxt.local_map;
+ map = relmap_cxt->local_map;
for (i = 0; i < map->num_mappings; i++) {
if (filenode == map->mappings[i].mapfilenode) {
return map->mappings[i].mapoid;
@@ -182,15 +181,15 @@ Oid RelationMapFilenodeToOid(Oid filenode, bool shared)
void RelationMapUpdateMap(Oid relationId, Oid fileNode, bool shared, bool immediate)
{
RelMapFile* map = NULL;
-
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
if (IsBootstrapProcessingMode()) {
/*
* In bootstrap mode, the mapping gets installed in permanent map.
*/
if (shared) {
- map = u_sess->relmap_cxt.shared_map;
+ map = relmap_cxt->shared_map;
} else {
- map = u_sess->relmap_cxt.local_map;
+ map = relmap_cxt->local_map;
}
} else {
/*
@@ -206,16 +205,16 @@ void RelationMapUpdateMap(Oid relationId, Oid fileNode, bool shared, bool immedi
if (immediate) {
/* Make it active, but only locally */
if (shared) {
- map = u_sess->relmap_cxt.active_shared_updates;
+ map = relmap_cxt->active_shared_updates;
} else {
- map = u_sess->relmap_cxt.active_local_updates;
+ map = relmap_cxt->active_local_updates;
}
} else {
/* Make it pending */
if (shared) {
- map = u_sess->relmap_cxt.pending_shared_updates;
+ map = relmap_cxt->pending_shared_updates;
} else {
- map = u_sess->relmap_cxt.pending_local_updates;
+ map = relmap_cxt->pending_local_updates;
}
}
}
@@ -291,7 +290,7 @@ static void merge_map_updates(RelMapFile* map, const RelMapFile* updates, bool a
*/
void RelationMapRemoveMapping(Oid relationId)
{
- RelMapFile* map = u_sess->relmap_cxt.active_local_updates;
+ RelMapFile* map = GetRelMapCxt()->active_local_updates;
int32 i;
for (i = 0; i < map->num_mappings; i++) {
@@ -318,16 +317,25 @@ void RelationMapRemoveMapping(Oid relationId)
*/
void RelationMapInvalidate(bool shared)
{
+ if (EnableLocalSysCache()) {
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
+ RelMapFile *rel_map = shared ? relmap_cxt->shared_map : relmap_cxt->local_map;
+ if (IS_MAGIC_EXIST(rel_map->magic)) {
+ t_thrd.lsc_cxt.lsc->LoadRelMapFromGlobal(shared);
+ }
+ return;
+ }
+
if (shared) {
if (IS_MAGIC_EXIST(u_sess->relmap_cxt.shared_map->magic)) {
LWLockAcquire(RelationMappingLock, LW_SHARED);
- load_relmap_file(true);
+ load_relmap_file(true, u_sess->relmap_cxt.shared_map);
LWLockRelease(RelationMappingLock);
}
} else {
if (IS_MAGIC_EXIST(u_sess->relmap_cxt.local_map->magic)) {
LWLockAcquire(RelationMappingLock, LW_SHARED);
- load_relmap_file(false);
+ load_relmap_file(false, u_sess->relmap_cxt.local_map);
LWLockRelease(RelationMappingLock);
}
}
@@ -342,12 +350,23 @@ void RelationMapInvalidate(bool shared)
*/
void RelationMapInvalidateAll(void)
{
+ if (EnableLocalSysCache()) {
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
+ if (IS_MAGIC_EXIST(relmap_cxt->shared_map->magic)) {
+ t_thrd.lsc_cxt.lsc->LoadRelMapFromGlobal(true);
+ }
+ if (IS_MAGIC_EXIST(relmap_cxt->local_map->magic)) {
+ t_thrd.lsc_cxt.lsc->LoadRelMapFromGlobal(false);
+ }
+ return;
+ }
+
LWLockAcquire(RelationMappingLock, LW_SHARED);
if (IS_MAGIC_EXIST(u_sess->relmap_cxt.shared_map->magic)) {
- load_relmap_file(true);
+ load_relmap_file(true, u_sess->relmap_cxt.shared_map);
}
if (IS_MAGIC_EXIST(u_sess->relmap_cxt.local_map->magic)) {
- load_relmap_file(false);
+ load_relmap_file(false, u_sess->relmap_cxt.local_map);
}
LWLockRelease(RelationMappingLock);
}
@@ -359,13 +378,14 @@ void RelationMapInvalidateAll(void)
*/
void AtCCI_RelationMap(void)
{
- if (u_sess->relmap_cxt.pending_shared_updates->num_mappings != 0) {
- merge_map_updates(u_sess->relmap_cxt.active_shared_updates, u_sess->relmap_cxt.pending_shared_updates, true);
- u_sess->relmap_cxt.pending_shared_updates->num_mappings = 0;
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
+ if (relmap_cxt->pending_shared_updates->num_mappings != 0) {
+ merge_map_updates(relmap_cxt->active_shared_updates, relmap_cxt->pending_shared_updates, true);
+ relmap_cxt->pending_shared_updates->num_mappings = 0;
}
- if (u_sess->relmap_cxt.pending_local_updates->num_mappings != 0) {
- merge_map_updates(u_sess->relmap_cxt.active_local_updates, u_sess->relmap_cxt.pending_local_updates, true);
- u_sess->relmap_cxt.pending_local_updates->num_mappings = 0;
+ if (relmap_cxt->pending_local_updates->num_mappings != 0) {
+ merge_map_updates(relmap_cxt->active_local_updates, relmap_cxt->pending_local_updates, true);
+ relmap_cxt->pending_local_updates->num_mappings = 0;
}
}
@@ -386,32 +406,33 @@ void AtCCI_RelationMap(void)
*/
void AtEOXact_RelationMap(bool isCommit)
{
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
if (isCommit) {
/*
* We should not get here with any "pending" updates. (We could
* logically choose to treat such as committed, but in the current
* code this should never happen.)
*/
- Assert(u_sess->relmap_cxt.pending_shared_updates->num_mappings == 0);
- Assert(u_sess->relmap_cxt.pending_local_updates->num_mappings == 0);
+ Assert(relmap_cxt->pending_shared_updates->num_mappings == 0);
+ Assert(relmap_cxt->pending_local_updates->num_mappings == 0);
/*
* Write any active updates to the actual map files, then reset them.
*/
- if (u_sess->relmap_cxt.active_shared_updates->num_mappings != 0) {
- perform_relmap_update(true, u_sess->relmap_cxt.active_shared_updates);
- u_sess->relmap_cxt.active_shared_updates->num_mappings = 0;
+ if (relmap_cxt->active_shared_updates->num_mappings != 0) {
+ perform_relmap_update(true, relmap_cxt->active_shared_updates);
+ relmap_cxt->active_shared_updates->num_mappings = 0;
}
- if (u_sess->relmap_cxt.active_local_updates->num_mappings != 0) {
- perform_relmap_update(false, u_sess->relmap_cxt.active_local_updates);
- u_sess->relmap_cxt.active_local_updates->num_mappings = 0;
+ if (relmap_cxt->active_local_updates->num_mappings != 0) {
+ perform_relmap_update(false, relmap_cxt->active_local_updates);
+ relmap_cxt->active_local_updates->num_mappings = 0;
}
} else {
/* Abort --- drop all local and pending updates */
- u_sess->relmap_cxt.active_shared_updates->num_mappings = 0;
- u_sess->relmap_cxt.active_local_updates->num_mappings = 0;
- u_sess->relmap_cxt.pending_shared_updates->num_mappings = 0;
- u_sess->relmap_cxt.pending_local_updates->num_mappings = 0;
+ relmap_cxt->active_shared_updates->num_mappings = 0;
+ relmap_cxt->active_local_updates->num_mappings = 0;
+ relmap_cxt->pending_shared_updates->num_mappings = 0;
+ relmap_cxt->pending_local_updates->num_mappings = 0;
}
}
@@ -427,10 +448,11 @@ void AtPrepare_RelationMap(void)
if (u_sess->attr.attr_common.IsInplaceUpgrade) {
return;
}
- if (u_sess->relmap_cxt.active_shared_updates->num_mappings != 0 ||
- u_sess->relmap_cxt.active_local_updates->num_mappings != 0 ||
- u_sess->relmap_cxt.pending_shared_updates->num_mappings != 0 ||
- u_sess->relmap_cxt.pending_local_updates->num_mappings != 0) {
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
+ if (relmap_cxt->active_shared_updates->num_mappings != 0 ||
+ relmap_cxt->active_local_updates->num_mappings != 0 ||
+ relmap_cxt->pending_shared_updates->num_mappings != 0 ||
+ relmap_cxt->pending_local_updates->num_mappings != 0) {
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("cannot PREPARE a transaction that modified relation mapping")));
}
@@ -464,16 +486,17 @@ void RelationMapFinishBootstrap(void)
{
Assert(IsBootstrapProcessingMode());
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
/* Shouldn't be anything "pending" ... */
- Assert(u_sess->relmap_cxt.active_shared_updates->num_mappings == 0);
- Assert(u_sess->relmap_cxt.active_local_updates->num_mappings == 0);
- Assert(u_sess->relmap_cxt.pending_shared_updates->num_mappings == 0);
- Assert(u_sess->relmap_cxt.pending_local_updates->num_mappings == 0);
+ Assert(relmap_cxt->active_shared_updates->num_mappings == 0);
+ Assert(relmap_cxt->active_local_updates->num_mappings == 0);
+ Assert(relmap_cxt->pending_shared_updates->num_mappings == 0);
+ Assert(relmap_cxt->pending_local_updates->num_mappings == 0);
/* Write the files; no WAL or sinval needed */
- write_relmap_file(true, u_sess->relmap_cxt.shared_map, false, false, false, InvalidOid, GLOBALTABLESPACE_OID, NULL);
+ write_relmap_file(true, relmap_cxt->shared_map, false, false, false, InvalidOid, GLOBALTABLESPACE_OID, NULL);
write_relmap_file(false,
- u_sess->relmap_cxt.local_map,
+ relmap_cxt->local_map,
false,
false,
false,
@@ -490,6 +513,11 @@ void RelationMapFinishBootstrap(void)
*/
void RelationMapInitialize(void)
{
+ if (EnableLocalSysCache()) {
+ /* when first init or rebuild lsc, they are all palloc0, so nothing need to do
+ * when switchdb , we memset them zero, nothing need to do */
+ return;
+ }
/* The static variables should initialize to zeroes, but let's be sure */
u_sess->relmap_cxt.shared_map->magic = 0; /* mark it not loaded */
u_sess->relmap_cxt.local_map->magic = 0;
@@ -518,8 +546,12 @@ void RelationMapInitializePhase2(void)
/*
* Load the shared map file, die on error.
*/
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->InitRelMapPhase2();
+ return;
+ }
LWLockAcquire(RelationMappingLock, LW_SHARED);
- load_relmap_file(true);
+ load_relmap_file(true, u_sess->relmap_cxt.shared_map);
LWLockRelease(RelationMappingLock);
}
@@ -540,8 +572,13 @@ void RelationMapInitializePhase3(void)
/*
* Load the local map file, die on error.
*/
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->InitRelMapPhase3();
+ return;
+ }
+
LWLockAcquire(RelationMappingLock, LW_SHARED);
- load_relmap_file(false);
+ load_relmap_file(false, u_sess->relmap_cxt.local_map);
LWLockRelease(RelationMappingLock);
}
@@ -553,9 +590,8 @@ void RelationMapInitializePhase3(void)
*
* Note that the local case requires u_sess->proc_cxt.DatabasePath to be set up.
*/
-static void load_relmap_file(bool shared)
+void load_relmap_file(bool shared, RelMapFile *map)
{
- RelMapFile* map = NULL;
char map_file_name[2][MAXPGPATH];
char* file_name = NULL;
pg_crc32 crc;
@@ -574,13 +610,12 @@ static void load_relmap_file(bool shared)
rc = snprintf_s(map_file_name[1], sizeof(map_file_name[1]), sizeof(map_file_name[1]) - 1, "global/%s",
RELMAPPER_FILENAME_BAK);
securec_check_ss(rc, "\0", "\0");
- map = u_sess->relmap_cxt.shared_map;
} else {
rc = snprintf_s(map_file_name[0],
sizeof(map_file_name[0]),
sizeof(map_file_name[0]) - 1,
"%s/%s",
- u_sess->proc_cxt.DatabasePath,
+ GetMyDatabasePath(),
RELMAPPER_FILENAME);
securec_check_ss(rc, "\0", "\0");
@@ -588,10 +623,9 @@ static void load_relmap_file(bool shared)
sizeof(map_file_name[1]),
sizeof(map_file_name[1]) - 1,
"%s/%s",
- u_sess->proc_cxt.DatabasePath,
+ GetMyDatabasePath(),
RELMAPPER_FILENAME_BAK);
securec_check_ss(rc, "\0", "\0");
- map = u_sess->relmap_cxt.local_map;
}
// check backup file
@@ -660,9 +694,9 @@ loop:
ereport(FATAL, (errmsg("relation mapping file \"%s\" contains invalid data", file_name)));
}
if (retry == true) {
- recover_relmap_file(shared, false);
+ recover_relmap_file(shared, false, map);
} else if (fix_backup == true) {
- recover_relmap_file(shared, true);
+ recover_relmap_file(shared, true, map);
}
}
@@ -724,15 +758,16 @@ static void write_relmap_file(bool shared, RelMapFile* newmap, bool write_wal, b
fname[0] = RELMAPPER_FILENAME_BAK;
fname[1] = RELMAPPER_FILENAME;
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
for (int i = 0; i < 2; i++) {
if (shared) {
rc = snprintf_s(map_file_name, sizeof(map_file_name), sizeof(map_file_name) - 1, "global/%s", fname[i]);
securec_check_ss_c(rc, "\0", "\0");
- real_map = u_sess->relmap_cxt.shared_map;
+ real_map = relmap_cxt->shared_map;
} else {
rc = snprintf_s(map_file_name, sizeof(map_file_name), sizeof(map_file_name) - 1, "%s/%s", dbpath, fname[i]);
securec_check_ss_c(rc, "\0", "\0");
- real_map = u_sess->relmap_cxt.local_map;
+ real_map = relmap_cxt->local_map;
}
fd = BasicOpenFile(map_file_name, O_WRONLY | O_CREAT | PG_BINARY, S_IRUSR | S_IWUSR);
@@ -793,6 +828,9 @@ static void write_relmap_file(bool shared, RelMapFile* newmap, bool write_wal, b
(errcode_for_file_access(), errmsg("could not close relation mapping file \"%s\": %m", map_file_name)));
}
}
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->InvalidateGlobalRelMap(shared, dbid, newmap);
+ }
/*
* Now that the file is safely on disk, send sinval message to let other
* backends know to re-read it. We must do this inside the critical
@@ -861,16 +899,20 @@ static void perform_relmap_update(bool shared, const RelMapFile* updates)
* trouble.
*/
LWLockAcquire(RelationMappingLock, LW_EXCLUSIVE);
-
+ knl_u_relmap_context *relmap_cxt = GetRelMapCxt();
/* Be certain we see any other updates just made */
- load_relmap_file(shared);
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->LoadRelMapFromGlobal(shared);
+ } else {
+ load_relmap_file(shared, shared ? relmap_cxt->shared_map : relmap_cxt->local_map);
+ }
/* Prepare updated data in a local variable */
if (shared) {
- rc = memcpy_s(&new_map, sizeof(RelMapFile), u_sess->relmap_cxt.shared_map, sizeof(RelMapFile));
+ rc = memcpy_s(&new_map, sizeof(RelMapFile), relmap_cxt->shared_map, sizeof(RelMapFile));
securec_check(rc, "", "");
} else {
- rc = memcpy_s(&new_map, sizeof(RelMapFile), u_sess->relmap_cxt.local_map, sizeof(RelMapFile));
+ rc = memcpy_s(&new_map, sizeof(RelMapFile), relmap_cxt->local_map, sizeof(RelMapFile));
securec_check(rc, "", "");
}
@@ -882,6 +924,7 @@ static void perform_relmap_update(bool shared, const RelMapFile* updates)
updates,
(g_instance.attr.attr_common.allowSystemTableMods || u_sess->attr.attr_common.IsInplaceUpgrade));
+ Assert(CheckMyDatabaseMatch());
/* Write out the updated map and do other necessary tasks */
write_relmap_file(shared,
&new_map,
@@ -901,10 +944,9 @@ static void perform_relmap_update(bool shared, const RelMapFile* updates)
* we should recover the file using the content of backup file or,
* if there is no backup file, we create it immediately.
*/
-static void recover_relmap_file(bool shared, bool backupfile)
+static void recover_relmap_file(bool shared, bool backupfile, RelMapFile* real_map)
{
int fd;
- RelMapFile* real_map = NULL;
char map_file_name[MAXPGPATH];
char* file_name = NULL;
int level;
@@ -922,16 +964,14 @@ static void recover_relmap_file(bool shared, bool backupfile)
if (shared) {
rc = snprintf_s(map_file_name, sizeof(map_file_name), sizeof(map_file_name) - 1, "global/%s", file_name);
securec_check_ss(rc, "\0", "\0");
- real_map = u_sess->relmap_cxt.shared_map;
} else {
rc = snprintf_s(map_file_name,
sizeof(map_file_name),
sizeof(map_file_name) - 1,
"%s/%s",
- u_sess->proc_cxt.DatabasePath,
+ GetMyDatabasePath(),
file_name);
securec_check_ss(rc, "\0", "\0");
- real_map = u_sess->relmap_cxt.local_map;
}
ereport(level, (errmsg("recover the relation mapping file %s", map_file_name)));
@@ -969,6 +1009,10 @@ static void recover_relmap_file(bool shared, bool backupfile)
(errcode_for_file_access(),
errmsg("recover failed could not close relation mapping file \"%s\": %m", map_file_name)));
}
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->InvalidateGlobalRelMap(shared,
+ shared ? InvalidOid : u_sess->proc_cxt.MyDatabaseId, real_map);
+ }
}
/*
@@ -1023,7 +1067,6 @@ void relmap_redo(XLogReaderState* record)
XLogRecPtr lsn = record->EndRecPtr;
UpdateMinRecoveryPoint(lsn, false);
write_relmap_file((xlrec->dbid == InvalidOid), &new_map, false, true, false, xlrec->dbid, xlrec->tsid, dbpath);
-
pfree_ext(dbpath);
} else {
ereport(PANIC, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("relmap_redo: unknown op code %u", info)));
diff --git a/src/common/backend/utils/cache/spccache.cpp b/src/common/backend/utils/cache/spccache.cpp
index 16f0beddd..6fd41b51b 100644
--- a/src/common/backend/utils/cache/spccache.cpp
+++ b/src/common/backend/utils/cache/spccache.cpp
@@ -43,16 +43,16 @@ typedef struct {
* and easy and doesn't cost much, since there shouldn't be terribly many
* tablespaces, nor do we expect them to be frequently modified.
*/
-static void InvalidateTableSpaceCacheCallback(Datum arg, int cacheid, uint32 hashvalue)
+void InvalidateTableSpaceCacheCallback(Datum arg, int cacheid, uint32 hashvalue)
{
HASH_SEQ_STATUS status;
TableSpaceCacheEntry* spc = NULL;
-
- hash_seq_init(&status, u_sess->cache_cxt.TableSpaceCacheHash);
+ struct HTAB *TableSpaceCacheHash = GetTableSpaceCacheHash();
+ hash_seq_init(&status, TableSpaceCacheHash);
while ((spc = (TableSpaceCacheEntry*)hash_seq_search(&status)) != NULL) {
if (spc->opts != NULL)
pfree_ext(spc->opts);
- if (hash_search(u_sess->cache_cxt.TableSpaceCacheHash, (void*)&spc->oid, HASH_REMOVE, NULL) == NULL)
+ if (hash_search(TableSpaceCacheHash, (void*)&spc->oid, HASH_REMOVE, NULL) == NULL)
ereport(ERROR, (errcode(ERRCODE_DATA_CORRUPTED), errmsg("hash table corrupted")));
}
}
@@ -72,12 +72,20 @@ static void InitializeTableSpaceCache(void)
ctl.keysize = sizeof(Oid);
ctl.entrysize = sizeof(TableSpaceCacheEntry);
ctl.hash = oid_hash;
- ctl.hcxt = u_sess->cache_mem_cxt;
- u_sess->cache_cxt.TableSpaceCacheHash =
+ if (EnableLocalSysCache()) {
+ ctl.hcxt = t_thrd.lsc_cxt.lsc->lsc_share_memcxt;
+ t_thrd.lsc_cxt.lsc->TableSpaceCacheHash =
+ hash_create("TableSpace cache", 16, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
+ /* Watch for invalidation events. */
+ CacheRegisterThreadSyscacheCallback(TABLESPACEOID, InvalidateTableSpaceCacheCallback, (Datum)0);
+ } else {
+ ctl.hcxt = u_sess->cache_mem_cxt;
+ u_sess->cache_cxt.TableSpaceCacheHash =
hash_create("TableSpace cache", 16, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
-
- /* Watch for invalidation events. */
- CacheRegisterSyscacheCallback(TABLESPACEOID, InvalidateTableSpaceCacheCallback, (Datum)0);
+ /* Watch for invalidation events. */
+ CacheRegisterSessionSyscacheCallback(TABLESPACEOID, InvalidateTableSpaceCacheCallback, (Datum)0);
+ }
+
}
/*
@@ -100,9 +108,9 @@ static TableSpaceCacheEntry* get_tablespace(Oid spcid)
spcid = ConvertToRelfilenodeTblspcOid(spcid);
/* Find existing cache entry, if any. */
- if (!u_sess->cache_cxt.TableSpaceCacheHash)
+ if (!GetTableSpaceCacheHash())
InitializeTableSpaceCache();
- spc = (TableSpaceCacheEntry*)hash_search(u_sess->cache_cxt.TableSpaceCacheHash, (void*)&spcid, HASH_FIND, NULL);
+ spc = (TableSpaceCacheEntry*)hash_search(GetTableSpaceCacheHash(), (void*)&spcid, HASH_FIND, NULL);
if (spc != NULL)
return spc;
@@ -129,7 +137,7 @@ static TableSpaceCacheEntry* get_tablespace(Oid spcid)
ereport(ERROR, (errcode(ERRCODE_INVALID_OPTION), errmsg("Invalid tablespace relation option.")));
}
- opts = (TableSpaceOpts*)MemoryContextAlloc(u_sess->cache_mem_cxt, VARSIZE(bytea_opts));
+ opts = (TableSpaceOpts*)MemoryContextAlloc(LocalSharedCacheMemCxt(), VARSIZE(bytea_opts));
rc = memcpy_s(opts, VARSIZE(bytea_opts), bytea_opts, VARSIZE(bytea_opts));
securec_check(rc, "", "");
}
@@ -141,7 +149,7 @@ static TableSpaceCacheEntry* get_tablespace(Oid spcid)
* reading the pg_tablespace entry, since doing so could cause a cache
* flush.
*/
- spc = (TableSpaceCacheEntry*)hash_search(u_sess->cache_cxt.TableSpaceCacheHash, (void*)&spcid, HASH_ENTER, NULL);
+ spc = (TableSpaceCacheEntry*)hash_search(GetTableSpaceCacheHash(), (void*)&spcid, HASH_ENTER, NULL);
spc->opts = opts;
return spc;
}
diff --git a/src/common/backend/utils/cache/syscache.cpp b/src/common/backend/utils/cache/syscache.cpp
index a7074deeb..f6b954fc2 100644
--- a/src/common/backend/utils/cache/syscache.cpp
+++ b/src/common/backend/utils/cache/syscache.cpp
@@ -32,6 +32,7 @@
#include "catalog/pg_aggregate.h"
#include "catalog/gs_client_global_keys.h"
#include "catalog/gs_column_keys.h"
+#include "catalog/gs_db_privilege.h"
#include "catalog/gs_encrypted_columns.h"
#include "catalog/gs_encrypted_proc.h"
#include "catalog/gs_job_argument.h"
@@ -84,6 +85,7 @@
#include "catalog/pg_ts_parser.h"
#include "catalog/pg_ts_template.h"
#include "catalog/pg_type.h"
+#include "catalog/pg_uid.h"
#include "catalog/pg_user_mapping.h"
#include "catalog/pg_extension_data_source.h"
#include "catalog/pg_streaming_stream.h"
@@ -102,6 +104,7 @@
#include "utils/rel_gs.h"
#include "utils/syscache.h"
#include "catalog/pg_user_status.h"
+#include "lite/memory_lite.h"
#include "catalog/pg_publication.h"
#include "catalog/pg_publication_rel.h"
#include "catalog/pg_replication_origin.h"
@@ -141,19 +144,13 @@
/*
* struct cachedesc: information defining a single syscache
*/
-struct cachedesc {
- Oid reloid; /* OID of the relation being cached */
- Oid indoid; /* OID of index relation for this cache */
- int nkeys; /* # of keys needed for cache lookup */
- int key[4]; /* attribute numbers of key attrs */
- int nbuckets; /* number of hash buckets for this cache */
-};
-static const struct cachedesc cacheinfo[] = {{AggregateRelationId, /* AGGFNOID */
- AggregateFnoidIndexId,
- 1,
- {Anum_pg_aggregate_aggfnoid, 0, 0, 0},
- 32},
+const cachedesc cacheinfo[] = {
+ {AggregateRelationId, /* AGGFNOID */
+ AggregateFnoidIndexId,
+ 1,
+ {Anum_pg_aggregate_aggfnoid, 0, 0, 0},
+ 32},
{AccessMethodRelationId, /* AMNAME */
AmNameIndexId,
1,
@@ -458,24 +455,24 @@ static const struct cachedesc cacheinfo[] = {{AggregateRelationId, /* AGGFNOID *
PartitionOidIndexId,
1,
{ObjectIdAttributeNumber, 0, 0, 0},
- 1024},
+ PARTITION_OID_INDEX_ID_NBUCKETS},
{PartitionRelationId, /* PARTPARTOID */
PartitionPartOidIndexId,
3,
{Anum_pg_partition_relname, Anum_pg_partition_parttype, Anum_pg_partition_parentid, 0},
- 1024},
+ PARTITION_PART_OID_INDEX_ID_NBUCKETS},
{PartitionRelationId, /* PARTINDEXTBLPARENTOID */
PartitionIndexTableIdParentOidIndexId,
3,
{Anum_pg_partition_indextblid, Anum_pg_partition_parentid, ObjectIdAttributeNumber, 0},
- 1024},
+ PARTITION_INDEX_TABLE_ID_PARENT_OID_INDEX_ID_NBUCKETS},
{PgJobRelationId, /* PGJOBID */
PgJobIdIndexId,
1,
{Anum_pg_job_job_id, 0, 0, 0},
- 2048},
+ PG_JOB_ID_INDEX_ID_NBUCKETS},
{PgJobProcRelationId, /* PGJOBPROCID */
PgJobProcIdIndexId,
1,
@@ -485,39 +482,39 @@ static const struct cachedesc cacheinfo[] = {{AggregateRelationId, /* AGGFNOID *
PgObjectIndex,
2,
{Anum_pg_object_oid, Anum_pg_object_type, 0, 0},
- 2048},
+ PG_OBJECT_INDEX_NBUCKETS},
#ifdef PGXC
{PgxcClassRelationId, /* PGXCCLASSRELID */
PgxcClassPgxcRelIdIndexId,
1,
{Anum_pgxc_class_pcrelid, 0, 0, 0},
- 1024},
+ PGXC_CLASS_PGXC_REL_ID_INDEX_ID_NBUCKETS},
{PgxcGroupRelationId, /* PGXCGROUPNAME */
PgxcGroupGroupNameIndexId,
1,
{Anum_pgxc_group_name, 0, 0, 0},
- 256},
+ PGXC_GROUP_GROUP_NAME_INDEX_ID_NBUCKETS},
{PgxcGroupRelationId, /* PGXCGROUPOID */
PgxcGroupOidIndexId,
1,
{ObjectIdAttributeNumber, 0, 0, 0},
- 256},
+ PGXC_GROUP_OID_INDEX_ID_NBUCKETS},
{PgxcNodeRelationId, /* PGXCNODENAMETYPE */
PgxcNodeNodeNameIndexId,
3,
{Anum_pgxc_node_name, Anum_pgxc_node_type, ObjectIdAttributeNumber, 0},
- 256},
+ PGXC_NODE_NODE_NAME_INDEX_ID_NBUCKETS},
{PgxcNodeRelationId, /* PGXCNODEOID */
PgxcNodeOidIndexId,
1,
{ObjectIdAttributeNumber, 0, 0, 0},
- 256},
+ PGXC_NODE_OID_INDEX_ID_NBUCKETS},
{PgxcNodeRelationId, /* PGXCNODEIDENTIFIER */
PgxcNodeNodeIdIndexId,
1,
{Anum_pgxc_node_id, 0, 0, 0},
- 256},
+ PGXC_NODE_NODE_ID_INDEX_ID_NBUCKETS},
{ResourcePoolRelationId, /* PGXCRESOURCEPOOLNAME */
ResourcePoolPoolNameIndexId,
1,
@@ -532,12 +529,12 @@ static const struct cachedesc cacheinfo[] = {{AggregateRelationId, /* AGGFNOID *
WorkloadGroupGroupNameIndexId,
1,
{Anum_pg_workload_group_wgname, 0, 0, 0},
- 256},
+ WORKLOAD_GROUP_GROUP_NAME_INDEX_ID_NBUCKETS},
{WorkloadGroupRelationId, /* PGXCWORKLOADGROUPOID */
WorkloadGroupOidIndexId,
1,
{ObjectIdAttributeNumber, 0, 0, 0},
- 256},
+ WORKLOAD_GROUP_OID_INDEX_ID_NBUCKETS},
{AppWorkloadGroupMappingRelationId, /* PGXCAPPWGMAPPINGNAME */
AppWorkloadGroupMappingNameIndexId,
1,
@@ -552,8 +549,20 @@ static const struct cachedesc cacheinfo[] = {{AggregateRelationId, /* AGGFNOID *
PgxcSliceIndexId,
4,
{Anum_pgxc_slice_relid, Anum_pgxc_slice_type, Anum_pgxc_slice_relname, Anum_pgxc_slice_sindex},
- 1024},
+ PGXC_SLICE_INDEX_ID_NBUCKETS},
#endif
+ {SubscriptionRelationId, /* SUBSCRIPTIONNAME */
+ SubscriptionNameIndexId,
+ 2,
+ {Anum_pg_subscription_subdbid, Anum_pg_subscription_subname, 0, 0},
+ 4
+ },
+ {SubscriptionRelationId, /* SUBSCRIPTIONOID */
+ SubscriptionObjectIndexId,
+ 1,
+ {ObjectIdAttributeNumber, 0, 0, 0},
+ 4
+ },
#ifndef ENABLE_MULTIPLE_NODES
{ProcedureRelationId, /* PROCNAMEARGSNSP */
ProcedureNameArgsNspNewIndexId,
@@ -604,7 +613,7 @@ static const struct cachedesc cacheinfo[] = {{AggregateRelationId, /* AGGFNOID *
Anum_pg_statistic_starelkind,
Anum_pg_statistic_staattnum,
Anum_pg_statistic_stainherit},
- 1024},
+ STATISTIC_RELID_KIND_ATTNUM_INH_INDEX_ID_NBUCKETS},
{StatisticExtRelationId, /* STATEXTRELKINDKEYINH (For pg_statistic_ext multi-column stats) */
StatisticExtRelidKindInhKeyIndexId,
4,
@@ -612,57 +621,63 @@ static const struct cachedesc cacheinfo[] = {{AggregateRelationId, /* AGGFNOID *
Anum_pg_statistic_ext_starelkind,
Anum_pg_statistic_ext_stainherit,
Anum_pg_statistic_ext_stakey},
- 1024},
+ STATISTIC_EXT_RELID_KIND_INH_KEY_INDEX_ID_NBUCKETS},
{StreamingContQueryRelationId, /* STREAMCQDEFRELID */
StreamingContQueryDefrelidIndexId,
1,
{Anum_streaming_cont_query_defrelid, 0, 0, 0},
- 2048},
+ STREAMING_CONT_QUERY_DEFRELID_INDEX_ID_NBUCKETS},
{StreamingContQueryRelationId, /* STREAMCQID */
StreamingContQueryIdIndexId,
1,
{Anum_streaming_cont_query_id, 0, 0, 0},
- 2048},
+ STREAMING_CONT_QUERY_ID_INDEX_ID_NBUCKETS},
{StreamingContQueryRelationId, /* STREAMCQLOOKUPID */
StreamingContQueryLookupidxidIndexId,
1,
{Anum_streaming_cont_query_lookupidxid, 0, 0, 0},
- 2048},
+ STREAMING_CONT_QUERY_LOOKUP_ID_XID_INDEX_ID_NBUCKETS},
{StreamingContQueryRelationId, /* STREAMCQMATRELID */
StreamingContQueryMatrelidIndexId,
1,
{Anum_streaming_cont_query_matrelid, 0, 0, 0},
- 2048},
+ STREAMING_CONT_QUERY_MATRELID_INDEX_ID_NBUCKETS},
{StreamingContQueryRelationId, /* STREAMCQOID */
StreamingContQueryOidIndexId,
1,
{ObjectIdAttributeNumber, 0, 0, 0},
- 2048},
+ STREAMING_CONT_QUERY_OID_INDEX_ID_NBUCKETS},
{StreamingContQueryRelationId, /* STREAMCQRELID */
StreamingContQueryRelidIndexId,
1,
{Anum_streaming_cont_query_relid, 0, 0, 0},
- 2048},
+ STREAMING_CONT_QUERY_RELID_INDEX_ID_NBUCKETS},
{StreamingContQueryRelationId, /* STREAMCQSCHEMACHANGE */
StreamingContQuerySchemaChangeIndexId,
2,
{Anum_streaming_cont_query_matrelid, Anum_streaming_cont_query_active, 0, 0},
- 2048},
+ STREAMING_CONT_QUERY_SCHEMA_CHANGE_INDEX_ID_NBUCKETS},
{StreamingStreamRelationId, /* STREAMOID */
StreamingStreamOidIndexId,
1,
{ObjectIdAttributeNumber, 0, 0, 0},
- 2048},
+ STREAMING_STREAM_OID_INDEX_ID_NBUCKETS},
{StreamingStreamRelationId, /* STREAMRELID */
StreamingStreamRelidIndexId,
1,
{Anum_streaming_stream_relid, 0, 0, 0},
- 2048},
+ STREAMING_STREAM_RELID_INDEX_ID_NBUCKETS},
{StreamingReaperStatusRelationId, /* REAPERCQOID */
StreamingReaperStatusOidIndexId,
1,
{Anum_streaming_reaper_status_id, 0, 0, 0},
- 2048},
+ STREAMING_REAPER_STATUS_OID_INDEX_ID_NBUCKETS},
+ {PublicationRelRelationId, /* PUBLICATIONRELMAP */
+ PublicationRelMapIndexId,
+ 2,
+ {Anum_pg_publication_rel_prrelid, Anum_pg_publication_rel_prpubid, 0, 0},
+ 64
+ },
{PgSynonymRelationId, /* SYNOID */
SynonymOidIndexId,
1,
@@ -768,12 +783,12 @@ static const struct cachedesc cacheinfo[] = {{AggregateRelationId, /* AGGFNOID *
PackageOidIndexId,
1,
{ObjectIdAttributeNumber, 0, 0, 0},
- 2048},
+ PACKAGE_OID_INDEX_ID_NBUCKETS},
{PackageRelationId, /* PKGNAMENSP */
PackageNameIndexId,
2,
{Anum_gs_package_pkgname, Anum_gs_package_pkgnamespace, 0, 0},
- 2048},
+ PACKAGE_NAME_INDEX_ID_NBUCKETS},
{PublicationRelationId, /* PUBLICATIONNAME */
PublicationNameIndexId,
1,
@@ -783,8 +798,7 @@ static const struct cachedesc cacheinfo[] = {{AggregateRelationId, /* AGGFNOID *
0,
0
},
- 8
- },
+ 8},
{PublicationRelationId, /* PUBLICATIONOID */
PublicationObjectIndexId,
1,
@@ -794,52 +808,27 @@ static const struct cachedesc cacheinfo[] = {{AggregateRelationId, /* AGGFNOID *
0,
0
},
- 8
- },
- {PublicationRelRelationId, /* PUBLICATIONREL */
- PublicationRelObjectIndexId,
+ 8},
+ {UidRelationId, /* UIDRELID */
+ UidRelidIndexId,
1,
- {
- ObjectIdAttributeNumber,
- 0,
- 0,
- 0
- },
- 64
- },
- {PublicationRelRelationId, /* PUBLICATIONRELMAP */
- PublicationRelMapIndexId,
- 2,
- {
- Anum_pg_publication_rel_prrelid,
- Anum_pg_publication_rel_prpubid,
- 0,
- 0
- },
- 64
- },
- {SubscriptionRelationId, /* SUBSCRIPTIONNAME */
- SubscriptionNameIndexId,
- 2,
- {
- Anum_pg_subscription_subdbid,
- Anum_pg_subscription_subname,
- 0,
- 0
- },
- 4
- },
- {SubscriptionRelationId, /* SUBSCRIPTIONOID */
- SubscriptionObjectIndexId,
+ {Anum_gs_uid_relid, 0, 0, 0},
+ 64},
+ {DbPrivilegeId, /* DBPRIVOID */
+ DbPrivilegeOidIndexId,
1,
- {
- ObjectIdAttributeNumber,
- 0,
- 0,
- 0
- },
- 4
- }
+ {ObjectIdAttributeNumber, 0, 0, 0},
+ 128},
+ {DbPrivilegeId, /* DBPRIVROLE */
+ DbPrivilegeRoleidIndexId,
+ 1,
+ {Anum_gs_db_privilege_roleid, 0, 0, 0},
+ 1024},
+ {DbPrivilegeId, /* DBPRIVROLEPRIV */
+ DbPrivilegeRoleidPrivilegeTypeIndexId,
+ 2,
+ {Anum_gs_db_privilege_roleid, Anum_gs_db_privilege_privilege_type, 0, 0},
+ 128}
};
int SysCacheSize = lengthof(cacheinfo);
@@ -854,6 +843,12 @@ int SysCacheSize = lengthof(cacheinfo);
*/
void InitCatalogCache(void)
{
+ if (EnableLocalSysCache()) {
+ /* use global catcache */
+ Assert(!u_sess->syscache_cxt.CacheInitialized);
+ t_thrd.lsc_cxt.lsc->systabcache.Init();
+ return;
+ }
int cacheId;
Assert(!u_sess->syscache_cxt.CacheInitialized);
@@ -889,6 +884,8 @@ void InitCatalogCache(void)
*/
void InitCatalogCachePhase2(void)
{
+ /* gsc never do this work */
+ Assert(!EnableLocalSysCache());
int cacheId;
Assert(u_sess->syscache_cxt.CacheInitialized);
@@ -925,6 +922,10 @@ void InitCatalogCachePhase2(void)
*/
HeapTuple SearchSysCache(int cacheId, Datum key1, Datum key2, Datum key3, Datum key4, int level)
{
+ if (EnableLocalSysCache()) {
+ HeapTuple tmp = t_thrd.lsc_cxt.lsc->systabcache.SearchTuple(cacheId, key1, key2, key3, key4);
+ return tmp;
+ }
Assert(cacheId >= 0);
Assert(cacheId < SysCacheSize);
Assert(PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId]));
@@ -934,6 +935,10 @@ HeapTuple SearchSysCache(int cacheId, Datum key1, Datum key2, Datum key3, Datum
HeapTuple SearchSysCache1(int cacheId, Datum key1)
{
+ if (EnableLocalSysCache()) {
+ HeapTuple tmp = t_thrd.lsc_cxt.lsc->systabcache.SearchTuple1(cacheId, key1);
+ return tmp;
+ }
Assert(cacheId >= 0);
Assert(cacheId < SysCacheSize);
Assert(PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId]));
@@ -944,6 +949,10 @@ HeapTuple SearchSysCache1(int cacheId, Datum key1)
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
{
+ if (EnableLocalSysCache()) {
+ HeapTuple tmp = t_thrd.lsc_cxt.lsc->systabcache.SearchTuple2(cacheId, key1, key2);
+ return tmp;
+ }
Assert(cacheId >= 0);
Assert(cacheId < SysCacheSize);
Assert(PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId]));
@@ -954,6 +963,10 @@ HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
HeapTuple SearchSysCache3(int cacheId, Datum key1, Datum key2, Datum key3)
{
+ if (EnableLocalSysCache()) {
+ HeapTuple tmp = t_thrd.lsc_cxt.lsc->systabcache.SearchTuple3(cacheId, key1, key2, key3);
+ return tmp;
+ }
Assert(cacheId >= 0);
Assert(cacheId < SysCacheSize);
Assert(PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId]));
@@ -964,10 +977,18 @@ HeapTuple SearchSysCache3(int cacheId, Datum key1, Datum key2, Datum key3)
HeapTuple SearchSysCache4(int cacheId, Datum key1, Datum key2, Datum key3, Datum key4)
{
+ if (EnableLocalSysCache()) {
+ HeapTuple tmp = t_thrd.lsc_cxt.lsc->systabcache.SearchTuple4(cacheId, key1, key2, key3, key4);
+ return tmp;
+ }
Assert(cacheId >= 0);
Assert(cacheId < SysCacheSize);
Assert(PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId]));
Assert(u_sess->syscache_cxt.SysCache[cacheId]->cc_nkeys == 4);
+#ifndef ENABLE_MULTIPLE_NODES
+ /* For PROCALLARGS we have a suit of specific functions! */
+ Assert(cacheId != PROCALLARGS);
+#endif
return SearchCatCache4(u_sess->syscache_cxt.SysCache[cacheId], key1, key2, key3, key4);
}
@@ -978,9 +999,25 @@ HeapTuple SearchSysCache4(int cacheId, Datum key1, Datum key2, Datum key3, Datum
*/
void ReleaseSysCache(HeapTuple tuple)
{
+ if (EnableLocalSysCache()) {
+ LocalCatCTup *ct = ResourceOwnerForgetLocalCatCTup(LOCAL_SYSDB_RESOWNER, tuple);
+ Assert(ct != NULL);
+ ct->Release();
+ return;
+ }
ReleaseCatCache(tuple);
}
+extern void ReleaseSysCacheList(catclist *cl)
+{
+ if (EnableLocalSysCache()) {
+ LocalCatCList *tuples = (LocalCatCList *)cl;
+ ResourceOwnerForgetLocalCatCList(LOCAL_SYSDB_RESOWNER, tuples);
+ tuples->Release();
+ return;
+ }
+ ReleaseCatCacheList(cl);
+}
/*
* SearchSysCacheCopy
*
@@ -1010,6 +1047,11 @@ HeapTuple SearchSysCacheCopy(int cacheId, Datum key1, Datum key2, Datum key3, Da
*/
bool SearchSysCacheExists(int cacheId, Datum key1, Datum key2, Datum key3, Datum key4)
{
+#ifndef ENABLE_MULTIPLE_NODES
+ /* For PROCALLARGS we have a suit of specific functions! */
+ Assert(cacheId != PROCALLARGS);
+#endif
+
HeapTuple tuple;
tuple = SearchSysCache(cacheId, key1, key2, key3, key4);
@@ -1126,15 +1168,25 @@ Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bo
* valid (because the caller recently fetched the tuple via this same
* cache), but there are cases where we have to initialize the cache here.
*/
- if (cacheId < 0 || cacheId >= SysCacheSize || !PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId])) {
- ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid cache ID: %d", cacheId)));
- }
- if (!PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId]->cc_tupdesc)) {
- InitCatCachePhase2(u_sess->syscache_cxt.SysCache[cacheId], false);
- Assert(PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId]->cc_tupdesc));
- }
+ if (EnableLocalSysCache()) {
+ if (cacheId < 0 || cacheId >= SysCacheSize) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid cache ID: %d", cacheId)));
+ }
+ if (!PointerIsValid(t_thrd.lsc_cxt.lsc->systabcache.GetCCTupleDesc(cacheId))) {
+ Assert(PointerIsValid(t_thrd.lsc_cxt.lsc->systabcache.GetCCTupleDesc(cacheId)));
+ }
+ return heap_getattr(tup, attributeNumber, t_thrd.lsc_cxt.lsc->systabcache.GetCCTupleDesc(cacheId), isNull);
+ } else {
+ if (cacheId < 0 || cacheId >= SysCacheSize || !PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId])) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid cache ID: %d", cacheId)));
+ }
+ if (!PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId]->cc_tupdesc)) {
+ InitCatCachePhase2(u_sess->syscache_cxt.SysCache[cacheId], false);
+ Assert(PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId]->cc_tupdesc));
+ }
- return heap_getattr(tup, attributeNumber, u_sess->syscache_cxt.SysCache[cacheId]->cc_tupdesc, isNull);
+ return heap_getattr(tup, attributeNumber, u_sess->syscache_cxt.SysCache[cacheId]->cc_tupdesc, isNull);
+ }
}
/*
@@ -1149,6 +1201,12 @@ Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bo
*/
uint32 GetSysCacheHashValue(int cacheId, Datum key1, Datum key2, Datum key3, Datum key4)
{
+ if (EnableLocalSysCache()) {
+ if (cacheId < 0 || cacheId >= SysCacheSize) {
+ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid cache ID: %d", cacheId)));
+ }
+ return t_thrd.lsc_cxt.lsc->systabcache.GetCatCacheHashValue(cacheId, key1, key2, key3, key4);
+ }
if (cacheId < 0 || cacheId >= SysCacheSize || !PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId])) {
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid cache ID: %d", cacheId)));
}
@@ -1161,10 +1219,27 @@ uint32 GetSysCacheHashValue(int cacheId, Datum key1, Datum key2, Datum key3, Dat
*/
struct catclist* SearchSysCacheList(int cacheId, int nkeys, Datum key1, Datum key2, Datum key3, Datum key4)
{
-
+ if (EnableLocalSysCache()) {
+ catclist *cl = t_thrd.lsc_cxt.lsc->systabcache.SearchCatCList(cacheId, nkeys, key1, key2, key3, key4);
+ return cl;
+ }
if (cacheId < 0 || cacheId >= SysCacheSize || !PointerIsValid(u_sess->syscache_cxt.SysCache[cacheId])) {
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid cache ID: %d", cacheId)));
}
return SearchCatCacheList(u_sess->syscache_cxt.SysCache[cacheId], nkeys, key1, key2, key3, key4);
}
+
+#ifndef ENABLE_MULTIPLE_NODES
+bool SearchSysCacheExistsForProcAllArgs(Datum key1, Datum key2, Datum key3, Datum key4, Datum proArgModes)
+{
+ HeapTuple tuple;
+
+ tuple = SearchSysCacheForProcAllArgs(key1, key2, key3, key4, proArgModes);
+ if (!HeapTupleIsValid(tuple)) {
+ return false;
+ }
+ ReleaseSysCache(tuple);
+ return true;
+}
+#endif
diff --git a/src/common/backend/utils/cache/ts_cache.cpp b/src/common/backend/utils/cache/ts_cache.cpp
index 456473cf6..4091552ab 100644
--- a/src/common/backend/utils/cache/ts_cache.cpp
+++ b/src/common/backend/utils/cache/ts_cache.cpp
@@ -78,8 +78,8 @@ static void InvalidateTSCacheCallBack(Datum arg, int cacheid, uint32 hashvalue)
hash_seq_init(&status, hash);
while ((entry = (TSAnyCacheEntry*)hash_seq_search(&status)) != NULL)
entry->isvalid = false;
-
/* Also invalidate the current-config cache if it's pg_ts_config */
+ /* when detach from thread, mark u_sess->tscache_cxt.TSCurrentConfigCache as invalid */
if (hash == u_sess->tscache_cxt.TSConfigCacheHash)
u_sess->tscache_cxt.TSCurrentConfigCache = InvalidOid;
}
@@ -98,8 +98,7 @@ void init_ts_parser_cache()
ctl.hcxt = u_sess->cache_mem_cxt;
u_sess->tscache_cxt.TSParserCacheHash =
hash_create("Tsearch parser cache", 4, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
- /* Flush cache on pg_ts_parser changes */
- CacheRegisterSyscacheCallback(
+ CacheRegisterSessionSyscacheCallback(
TSPARSEROID, InvalidateTSCacheCallBack, PointerGetDatum(u_sess->tscache_cxt.TSParserCacheHash));
}
@@ -200,10 +199,9 @@ void init_ts_distionary_cache()
ctl.hcxt = u_sess->cache_mem_cxt;
u_sess->tscache_cxt.TSDictionaryCacheHash =
hash_create("Tsearch dictionary cache", 8, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
- /* Flush cache on pg_ts_dict and pg_ts_template changes */
- CacheRegisterSyscacheCallback(
+ CacheRegisterSessionSyscacheCallback(
TSDICTOID, InvalidateTSCacheCallBack, PointerGetDatum(u_sess->tscache_cxt.TSDictionaryCacheHash));
- CacheRegisterSyscacheCallback(
+ CacheRegisterSessionSyscacheCallback(
TSTEMPLATEOID, InvalidateTSCacheCallBack, PointerGetDatum(u_sess->tscache_cxt.TSDictionaryCacheHash));
}
@@ -353,9 +351,9 @@ static void init_ts_config_cache(void)
u_sess->tscache_cxt.TSConfigCacheHash =
hash_create("Tsearch configuration cache", 16, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
/* Flush cache on pg_ts_config and pg_ts_config_map changes */
- CacheRegisterSyscacheCallback(
+ CacheRegisterSessionSyscacheCallback(
TSCONFIGOID, InvalidateTSCacheCallBack, PointerGetDatum(u_sess->tscache_cxt.TSConfigCacheHash));
- CacheRegisterSyscacheCallback(
+ CacheRegisterSessionSyscacheCallback(
TSCONFIGMAP, InvalidateTSCacheCallBack, PointerGetDatum(u_sess->tscache_cxt.TSConfigCacheHash));
}
diff --git a/src/common/backend/utils/cache/typcache.cpp b/src/common/backend/utils/cache/typcache.cpp
index a2968d35c..31ffe9c15 100644
--- a/src/common/backend/utils/cache/typcache.cpp
+++ b/src/common/backend/utils/cache/typcache.cpp
@@ -118,7 +118,6 @@ static void cache_array_element_properties(TypeCacheEntry* typentry);
static bool record_fields_have_equality(TypeCacheEntry* typentry);
static bool record_fields_have_compare(TypeCacheEntry* typentry);
static void cache_record_field_properties(TypeCacheEntry* typentry);
-static void TypeCacheRelCallback(Datum arg, Oid relid);
static void load_enum_cache_data(TypeCacheEntry* tcache);
static EnumItem* find_enumitem(TypeCacheEnumData* enum_data, Oid arg);
static int enum_oid_cmp(const void* left, const void* right);
@@ -135,12 +134,19 @@ void init_type_cache()
ctl.keysize = sizeof(Oid);
ctl.entrysize = sizeof(TypeCacheEntry);
ctl.hash = oid_hash;
- ctl.hcxt = u_sess->cache_mem_cxt;
- u_sess->tycache_cxt.TypeCacheHash =
- hash_create("Type information cache", 64, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
-
- /* Also set up a callback for relcache SI invalidations */
- CacheRegisterRelcacheCallback(TypeCacheRelCallback, (Datum)0);
+ if (EnableLocalSysCache()) {
+ ctl.hcxt = t_thrd.lsc_cxt.lsc->lsc_mydb_memcxt;
+ t_thrd.lsc_cxt.lsc->TypeCacheHash =
+ hash_create("Type information cache", 64, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
+ /* Also set up a callback for relcache SI invalidations */
+ CacheRegisterThreadRelcacheCallback(TypeCacheRelCallback, (Datum)0);
+ } else {
+ ctl.hcxt = u_sess->cache_mem_cxt;
+ u_sess->tycache_cxt.TypeCacheHash =
+ hash_create("Type information cache", 64, &ctl, HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
+ /* Also set up a callback for relcache SI invalidations */
+ CacheRegisterSessionRelcacheCallback(TypeCacheRelCallback, (Datum)0);
+ }
}
/*
* lookup_type_cache
@@ -159,12 +165,12 @@ TypeCacheEntry* lookup_type_cache(Oid type_id, int flags)
bool found = false;
errno_t rc;
- if (u_sess->tycache_cxt.TypeCacheHash == NULL) {
+ if (GetTypeCacheHash() == NULL) {
init_type_cache();
}
/* Try to look up an existing entry */
- typentry = (TypeCacheEntry*)hash_search(u_sess->tycache_cxt.TypeCacheHash, (void*)&type_id, HASH_FIND, NULL);
+ typentry = (TypeCacheEntry*)hash_search(GetTypeCacheHash(), (void*)&type_id, HASH_FIND, NULL);
if (typentry == NULL) {
/*
* If we didn't find one, we want to make one. But first look up the
@@ -187,7 +193,7 @@ TypeCacheEntry* lookup_type_cache(Oid type_id, int flags)
/* Now make the typcache entry */
- typentry = (TypeCacheEntry*)hash_search(u_sess->tycache_cxt.TypeCacheHash, (void*)&type_id, HASH_ENTER, &found);
+ typentry = (TypeCacheEntry*)hash_search(GetTypeCacheHash(), (void*)&type_id, HASH_ENTER, &found);
Assert(!found); /* it wasn't there a moment ago */
rc = memset_s(typentry, sizeof(TypeCacheEntry), 0, sizeof(TypeCacheEntry));
@@ -373,15 +379,15 @@ TypeCacheEntry* lookup_type_cache(Oid type_id, int flags)
eq_opr_func = get_opcode(typentry->eq_opr);
if (eq_opr_func != InvalidOid)
- fmgr_info_cxt(eq_opr_func, &typentry->eq_opr_finfo, u_sess->cache_mem_cxt);
+ fmgr_info_cxt(eq_opr_func, &typentry->eq_opr_finfo, LocalMyDBCacheMemCxt());
}
if ((flags & TYPECACHE_CMP_PROC_FINFO) && typentry->cmp_proc_finfo.fn_oid == InvalidOid &&
typentry->cmp_proc != InvalidOid) {
- fmgr_info_cxt(typentry->cmp_proc, &typentry->cmp_proc_finfo, u_sess->cache_mem_cxt);
+ fmgr_info_cxt(typentry->cmp_proc, &typentry->cmp_proc_finfo, LocalMyDBCacheMemCxt());
}
if ((flags & TYPECACHE_HASH_PROC_FINFO) && typentry->hash_proc_finfo.fn_oid == InvalidOid &&
typentry->hash_proc != InvalidOid) {
- fmgr_info_cxt(typentry->hash_proc, &typentry->hash_proc_finfo, u_sess->cache_mem_cxt);
+ fmgr_info_cxt(typentry->hash_proc, &typentry->hash_proc_finfo, LocalMyDBCacheMemCxt());
}
/*
@@ -478,12 +484,12 @@ static void load_rangetype_info(TypeCacheEntry* typentry)
}
/* set up cached fmgrinfo structs */
- fmgr_info_cxt(cmpFnOid, &typentry->rng_cmp_proc_finfo, u_sess->cache_mem_cxt);
+ fmgr_info_cxt(cmpFnOid, &typentry->rng_cmp_proc_finfo, LocalMyDBCacheMemCxt());
if (OidIsValid(canonicalOid)) {
- fmgr_info_cxt(canonicalOid, &typentry->rng_canonical_finfo, u_sess->cache_mem_cxt);
+ fmgr_info_cxt(canonicalOid, &typentry->rng_canonical_finfo, LocalMyDBCacheMemCxt());
}
if (OidIsValid(subdiffOid)) {
- fmgr_info_cxt(subdiffOid, &typentry->rng_subdiff_finfo, u_sess->cache_mem_cxt);
+ fmgr_info_cxt(subdiffOid, &typentry->rng_subdiff_finfo, LocalMyDBCacheMemCxt());
}
/* Lastly, set up link to the element type --- this marks data valid */
@@ -815,13 +821,13 @@ void assign_record_type_typmod(TupleDesc tupDesc)
* hashtable that indexes composite-type typcache entries by their typrelid.
* But it's still not clear it's worth the trouble.
*/
-static void TypeCacheRelCallback(Datum arg, Oid relid)
+void TypeCacheRelCallback(Datum arg, Oid relid)
{
HASH_SEQ_STATUS status;
TypeCacheEntry* typentry = NULL;
- /* u_sess->tycache_cxt.TypeCacheHash must exist, else this callback wouldn't be registered */
- hash_seq_init(&status, u_sess->tycache_cxt.TypeCacheHash);
+ /* GetTypeCacheHash() must exist, else this callback wouldn't be registered */
+ hash_seq_init(&status, GetTypeCacheHash());
while ((typentry = (TypeCacheEntry*)hash_seq_search(&status)) != NULL) {
if (typentry->typtype != TYPTYPE_COMPOSITE) {
continue; /* skip non-composites */
diff --git a/src/common/backend/utils/errcodes.txt b/src/common/backend/utils/errcodes.txt
index 931158935..f497becd4 100644
--- a/src/common/backend/utils/errcodes.txt
+++ b/src/common/backend/utils/errcodes.txt
@@ -397,7 +397,6 @@ Section: Class 42 - Syntax Error or Access Rule Violation
42705 E ERRCODE_UNDEFINED_KEY undefined_key
42711 E ERRCODE_DUPLICATE_KEY duplicate_key
42713 E ERRCODE_UNDEFINED_CL_COLUMN undefined_cl_column
-42716 E ERRCODE_CL_FUNCTION_UPDATE internal - cl function being updatd
Section: Class 44 - WITH CHECK OPTION Violation
diff --git a/src/common/backend/utils/error/be_module.cpp b/src/common/backend/utils/error/be_module.cpp
index e429edd27..21f0b527a 100755
--- a/src/common/backend/utils/error/be_module.cpp
+++ b/src/common/backend/utils/error/be_module.cpp
@@ -51,6 +51,7 @@ const module_data module_map[] = {{MOD_ALL, "ALL"},
{MOD_EXECUTOR, "EXECUTOR"},
{MOD_OPFUSION, "OPFUSION"},
{MOD_GPC, "GPC"},
+ {MOD_GSC, "GSC"},
{MOD_VEC_EXECUTOR, "VEC_EXECUTOR"},
{MOD_STREAM, "STREAM"},
{MOD_LLVM, "LLVM"},
@@ -122,6 +123,8 @@ const module_data module_map[] = {{MOD_ALL, "ALL"},
{MOD_SPI, "SPI"},
{MOD_NEST_COMPILE, "NEST_COMPILE"},
{MOD_RESOWNER, "RESOWNER"},
+ {MOD_LOGICAL_DECODE, "LOGICAL_DECODE"},
+ {MOD_GPRC, "GPRC"},
/* add your module name above */
{MOD_MAX, "BACKEND"}};
diff --git a/src/common/backend/utils/error/elog.cpp b/src/common/backend/utils/error/elog.cpp
index 509be4319..f517e3500 100644
--- a/src/common/backend/utils/error/elog.cpp
+++ b/src/common/backend/utils/error/elog.cpp
@@ -133,6 +133,8 @@ extern THR_LOCAL char* g_instance.attr.attr_common.event_source;
static void write_eventlog(int level, const char* line, int len);
#endif
+static const int CREATE_ALTER_SUBSCRIPTION = 16;
+
/* Macro for checking t_thrd.log_cxt.errordata_stack_depth is reasonable */
#define CHECK_STACK_DEPTH() \
do { \
@@ -167,6 +169,27 @@ static int output_backtrace_to_log(StringInfoData* pOutBuf);
static void write_asp_chunks(char *data, int len, bool end);
static void write_asplog(char *data, int len, bool end);
+#define MASK_OBS_PATH() \
+ do { \
+ char* childStmt = mask_funcs3_parameters(yylval.str); \
+ if (childStmt != NULL) { \
+ if (mask_string == NULL) { \
+ mask_string = MemoryContextStrdup( \
+ SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_SECURITY), query_string); \
+ } \
+ if (unlikely(yyextra.literallen != (int)strlen(childStmt))) { \
+ ereport(ERROR, \
+ (errcode(ERRCODE_SYNTAX_ERROR), \
+ errmsg("parse error on statement %s.", childStmt))); \
+ } \
+ rc = memcpy_s(mask_string + yylloc + 1, yyextra.literallen, childStmt, yyextra.literallen); \
+ securec_check(rc, "\0", "\0"); \
+ rc = memset_s(childStmt, yyextra.literallen, 0, yyextra.literallen); \
+ securec_check(rc, "", ""); \
+ pfree(childStmt); \
+ } \
+ } while (0)
+
/*
* in_error_recursion_trouble --- are we at risk of infinite error recursion?
*
@@ -2411,6 +2434,11 @@ static void log_line_prefix(StringInfo buf, ErrorData* edata)
(int)u_sess->globalSessionId.nodeId,
u_sess->globalSessionId.sessionId, u_sess->globalSessionId.seq);
break;
+ case 'T':
+ if (u_sess->trace_cxt.trace_id[0]) {
+ appendStringInfo(buf, "%s", u_sess->trace_cxt.trace_id);
+ }
+ break;
case '%':
appendStringInfoChar(buf, '%');
break;
@@ -2719,7 +2747,7 @@ static void write_csvlog(ErrorData* edata)
* Unpack MAKE_SQLSTATE code. Note that this returns a pointer to a
* static THR_LOCAL buffer.
*/
-char* unpack_sql_state(int sql_state)
+const char* unpack_sql_state(int sql_state)
{
char* buf = t_thrd.buf_cxt.unpack_sql_state_buf;
int i;
@@ -2734,7 +2762,7 @@ char* unpack_sql_state(int sql_state)
}
/* if sqlcode is init by the database, it must be positive; if is init by the user, then it must be negative */
-char *plpgsql_get_sqlstate(int sqlcode)
+const char *plpgsql_get_sqlstate(int sqlcode)
{
if (sqlcode >= 0) {
return unpack_sql_state(sqlcode);
@@ -3091,9 +3119,8 @@ static void send_message_to_server_log(ErrorData* edata)
}
/* If in the syslogger process, try to write messages direct to file */
- if (t_thrd.role == SYSLOGGER &&
- t_thrd.log_cxt.Log_destination & LOG_DESTINATION_STDERR &&
- t_thrd.logger.syslogFile != NULL) {
+ FILE* logfile = LOG_DESTINATION_CSVLOG ? t_thrd.logger.csvlogFile : t_thrd.logger.syslogFile;
+ if (t_thrd.role == SYSLOGGER && logfile != NULL) {
write_syslogger_file(buf.data, buf.len, LOG_DESTINATION_STDERR);
}
@@ -4197,6 +4224,14 @@ char* mask_funcs3_parameters(const char* query_string)
return mask_string;
}
+static void inline ClearYylval(const core_YYSTYPE *yylval)
+{
+ int rc = memset_s(yylval->str, strlen(yylval->str), 0, strlen(yylval->str));
+ securec_check(rc, "\0", "\0");
+ rc = memset_s((char*)yylval->keyword, strlen(yylval->keyword), 0, strlen(yylval->keyword));
+ securec_check(rc, "\0", "\0");
+}
+
/*
* Mask the password in statment CREATE ROLE, CREATE USER, ALTER ROLE, ALTER USER, CREATE GROUP
* SET ROLE, CREATE DATABASE LINK, and some function
@@ -4212,7 +4247,8 @@ static char* mask_Password_internal(const char* query_string)
int currToken = 59; /* initialize prevToken as ';' */
bool isPassword = false;
char* mask_string = NULL;
- const char* funcs[] = {"dblink_connect"}; /* the function list need mask */
+ /* the function list need mask */
+ const char* funcs[] = {"dblink_connect", "create_credential", "pg_create_physical_replication_slot_extern"};
int funcNum = sizeof(funcs) / sizeof(funcs[0]);
int position[16] = {0};
int length[16] = {0};
@@ -4221,6 +4257,7 @@ static char* mask_Password_internal(const char* query_string)
bool isChildStmt = false;
errno_t rc = EOK;
int truncateLen = 0; /* accumulate total length for each truncate */
+ YYLTYPE conninfoStartPos = 0; /* connection start postion for CreateSubscriptionStmt */
/* the functions need to mask all contents */
const char* funCrypt[] = {"gs_encrypt_aes128", "gs_decrypt_aes128", "gs_encrypt", "gs_decrypt"};
@@ -4256,6 +4293,7 @@ static char* mask_Password_internal(const char* query_string)
* 13 - for funcs3
* 14 - create/alter text search dictionary
* 15 - for funCrypt
+ * 16 - create/alter subscription(CREATE_ALTER_SUBSCRIPTION)
*/
int curStmtType = 0;
int prevToken[5] = {0};
@@ -4317,7 +4355,30 @@ static char* mask_Password_internal(const char* query_string)
SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_SECURITY), query_string);
}
- rc = memcpy_s(mask_string + yylloc + 1, yyextra.literallen, childStmt, strlen(childStmt));
+ /*
+ * After mask child statement, child statement length maybe be large than origin query
+ * statement length. So we should enlarge buffer size.
+ */
+ int childStmtLen = strlen(childStmt);
+ int subQueryLen = strlen(yylval.str);
+ int maskStringLen = strlen(mask_string);
+ if (subQueryLen < childStmtLen) {
+ /* Need more space, enlarge length is (childStmtLen - subQueryLen) */
+ maskStringLen += (childStmtLen - subQueryLen) + 1;
+ char* maskStrNew = (char*)selfpalloc0(maskStringLen);
+ rc = memcpy_s(maskStrNew, maskStringLen, mask_string, strlen(mask_string));
+ securec_check(rc, "\0", "\0");
+ selfpfree(mask_string);
+ mask_string = maskStrNew;
+ }
+
+ /*
+ * After enlarge buffer size, value of new buffer position is '0', and using strlen() will
+ * get wrong result of buffer length, which is smaller than real length.
+ * So use 'maskStringLen' here to indicate real buffer length.
+ */
+ rc = memcpy_s(mask_string + yylloc + 1, maskStringLen - yylloc,
+ childStmt, strlen(childStmt) + 1);
securec_check(rc, "\0", "\0");
rc = memset_s(childStmt, strlen(childStmt), 0, strlen(childStmt));
securec_check(rc, "", "");
@@ -4344,8 +4405,19 @@ static char* mask_Password_internal(const char* query_string)
if (ch == '\'' || ch == '\"')
++position[idx];
+
+ /* Calcute the difference between origin password length and mask password length */
+ position[idx] -= truncateLen;
+
length[idx] = strlen(yylval.str);
++idx;
+
+ /* record the conninfo start pos, we will use it to calculate the actual length of conninfo */
+ if (curStmtType == CREATE_ALTER_SUBSCRIPTION) {
+ conninfoStartPos = yylloc;
+ /* the yylval store the conninfo, so we clear it here */
+ ClearYylval(&yylval);
+ }
/*
* use a fixed length of masked password.
* For a matched token, position[idx] is query_string's position, but mask_string is truncated,
@@ -4363,18 +4435,31 @@ static char* mask_Password_internal(const char* query_string)
* the len of password may be shorter than actual,
* we need to find the start position of password word by looking forward.
*/
- char wordHead = position[i] > 0 ? query_string[position[i] - 1] : '\0';
+ char wordHead = position[i] > 0 ? mask_string[position[i] - 1] : '\0';
if (isPassword && wordHead != '\0' && wordHead != '\'' && wordHead != '\"') {
while (position[i] > 0 && !isspace(wordHead) && wordHead != '\'' && wordHead != '\"') {
position[i]--;
- wordHead = query_string[position[i] - 1];
+ wordHead = mask_string[position[i] - 1];
}
- length[i] = strlen(query_string + position[i]);
+ length[i] = strlen(mask_string + position[i]);
/* if the last char is ';', we should keep it */
- if (query_string[position[i] + length[i] - 1] == ';') {
+ if (mask_string[position[i] + length[i] - 1] == ';') {
length[i]--;
}
}
+
+ /*
+ * After core_yylex, double quotation marks will be parsed to single quotation mark.
+ * Calcute length of '\'' and double this length.
+ */
+ int lengthOfQuote = 0;
+ for (int len = 0; len < length[i]; len++) {
+ if ((yylval.str != NULL) && (yylval.str[len] == '\'')) {
+ lengthOfQuote++;
+ }
+ }
+ length[i] += lengthOfQuote;
+
if (length[i] < maskLen) {
/* need more space. */
int plen = strlen(mask_string) + maskLen - length[i] + 1;
@@ -4385,23 +4470,23 @@ static char* mask_Password_internal(const char* query_string)
mask_string = maskStrNew;
}
- char* maskBegin = mask_string + position[i] - truncateLen;
- int copySize = strlen(mask_string) - (position[i] - truncateLen) - length[i] + 1;
+ char* maskBegin = mask_string + position[i];
+ int copySize = strlen(mask_string) - position[i] - length[i] + 1;
rc = memmove_s(maskBegin + maskLen, copySize, maskBegin + length[i], copySize);
securec_check(rc, "", "");
- if (length[i] > maskLen) {
- truncateLen += (length[i] - maskLen);
- }
+ /*
+ * After masking password, the origin password had been transformed to '*', which length equals
+ * to u_sess->attr.attr_security.Password_min_length.
+ * So we should record the difference between origin password length and mask password length.
+ */
+ truncateLen = strlen(query_string) - strlen(mask_string);
rc = memset_s(maskBegin, maskLen, '*', maskLen);
securec_check(rc, "", "");
need_clear_yylval = true;
}
if (need_clear_yylval) {
- rc = memset_s(yylval.str, strlen(yylval.str), 0, strlen(yylval.str));
- securec_check(rc, "\0", "\0");
- rc = memset_s((char*)yylval.keyword, strlen(yylval.keyword), 0, strlen(yylval.keyword));
- securec_check(rc, "\0", "\0");
+ ClearYylval(&yylval);
need_clear_yylval = false;
}
idx = 0;
@@ -4701,6 +4786,13 @@ static char* mask_Password_internal(const char* query_string)
}
break;
case IDENT:
+ if (curStmtType == 14) {
+ if (pg_strncasecmp(yylval.str, "obs", strlen("obs")) == 0) {
+ MASK_OBS_PATH();
+ }
+ curStmtType = 0;
+ }
+
if ((prevToken[1] == SERVER && prevToken[2] == OPTIONS) ||
(prevToken[1] == FOREIGN && prevToken[2] == TABLE && prevToken[3] == OPTIONS)) {
if (pg_strcasecmp(yylval.str, "secret_access_key") == 0) {
@@ -4727,6 +4819,15 @@ static char* mask_Password_internal(const char* query_string)
} else {
curStmtType = 0;
}
+ } else if (prevToken[1] == ALTER && prevToken[2] == SUBSCRIPTION) {
+ /*
+ * For SUBSCRIPTION, there are 3 cases need to mask conninfo(which has username and password):
+ * 1. CREATE SUBSCRIPTION name CONNECTION Sconst. Which could be coverd by case CONNECTION.
+ * 2. ALTER SUBSCRIPTION name CONNECTION Sconst. Which could be coverd by case CONNECTION.
+ * 3. ALTER SUBSCRIPTION name SET (conninfo='xx'). Here we deal with this case.
+ */
+ curStmtType = pg_strcasecmp(yylval.str, "conninfo") == 0 ? CREATE_ALTER_SUBSCRIPTION : 0;
+ idx = 0;
}
break;
case SCONST:
@@ -4745,25 +4846,68 @@ static char* mask_Password_internal(const char* query_string)
}
} else if (curStmtType == 14) {
if (pg_strncasecmp(yylval.str, "obs", strlen("obs")) == 0) {
- char* childStmt = mask_funcs3_parameters(yylval.str);
- if (childStmt != NULL) {
- if (mask_string == NULL) {
- mask_string = MemoryContextStrdup(
- SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_SECURITY), query_string);
- }
- if (unlikely(yyextra.literallen != (int)strlen(childStmt))) {
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("parse error on statement %s.", childStmt)));
- }
- rc = memcpy_s(mask_string + yylloc + 1, yyextra.literallen, childStmt, yyextra.literallen);
- securec_check(rc, "\0", "\0");
- rc = memset_s(childStmt, yyextra.literallen, 0, yyextra.literallen);
- securec_check(rc, "", "");
- pfree(childStmt);
- }
+ MASK_OBS_PATH();
}
curStmtType = 0;
+ } else if (curStmtType == CREATE_ALTER_SUBSCRIPTION &&
+ (prevToken[0] == '=' || prevToken[1] == ALTER)) {
+ /*
+ * ALTER SUBSCRIPTION name SET (conninfo='xx')
+ * ALTER SUBSCRIPTION name CONNECTION Sconst
+ * mask connection info
+ */
+ if (mask_string == NULL) {
+ mask_string = MemoryContextStrdup(
+ SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_SECURITY), query_string);
+ }
+ /*
+ * mask to the end of string, cause the length[0] may be shorter than actual.
+ * For example:
+ * ALTER SUBSCRIPTION name SET (conninfo='host=''1.1.1.1'' password=''password_123''');
+ * ALTER SUBSCRIPTION name CONNECTION 'host=''1.1.1.1'' password=''password_123''';
+ */
+ int maskLen = strlen(query_string + position[0]);
+ /* if the last char is ';', we should keep it */
+ if (query_string[position[0] + maskLen - 1] == ';') {
+ maskLen--;
+ }
+ rc = memset_s(mask_string + position[0], maskLen, '*', maskLen);
+ securec_check(rc, "", "");
+ /* the yylval store the conninfo, so we clear it here */
+ ClearYylval(&yylval);
+ idx = 0;
+ curStmtType = 0;
+ }
+ break;
+ case SUBSCRIPTION:
+ if (prevToken[0] == CREATE || prevToken[0] == ALTER) {
+ prevToken[1] = prevToken[0];
+ prevToken[2] = SUBSCRIPTION;
+ }
+ break;
+ case CONNECTION:
+ if (prevToken[2] == SUBSCRIPTION) {
+ curStmtType = CREATE_ALTER_SUBSCRIPTION;
+ prevToken[3] = CONNECTION;
+ }
+ break;
+ case PUBLICATION:
+ if (curStmtType == CREATE_ALTER_SUBSCRIPTION && prevToken[2] == SUBSCRIPTION &&
+ prevToken[3] == CONNECTION) {
+ /*
+ * CREATE SUBSCRIPTION name CONNECTION Sconst PUBLICATION xxx, try to mask Sconst.
+ * it should not happen that conninfoStartPos < 0, if it does, we will mask the
+ * string from the beginning to current pos to ensure all sensetive info is masked.
+ */
+ if (mask_string == NULL) {
+ mask_string = MemoryContextStrdup(
+ SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_SECURITY), query_string);
+ }
+ int maskLen = yylloc - conninfoStartPos;
+ rc = memset_s(mask_string + conninfoStartPos, maskLen, '*', maskLen);
+ securec_check(rc, "", "");
+ idx = 0;
+ curStmtType = 0;
}
break;
default:
diff --git a/src/common/backend/utils/fmgr/fmgr.cpp b/src/common/backend/utils/fmgr/fmgr.cpp
index e07d98dbd..7e1ca35cc 100755
--- a/src/common/backend/utils/fmgr/fmgr.cpp
+++ b/src/common/backend/utils/fmgr/fmgr.cpp
@@ -2515,7 +2515,7 @@ struct varlena* pg_detoast_datum_copy(struct varlena* datum)
}
}
-struct varlena* pg_detoast_datum_slice(struct varlena* datum, int32 first, int32 count)
+struct varlena* pg_detoast_datum_slice(struct varlena* datum, int64 first, int32 count)
{
/* Only get the specified portion from the toast rel */
return heap_tuple_untoast_attr_slice(datum, first, count);
diff --git a/src/common/backend/utils/fmgr/funcapi.cpp b/src/common/backend/utils/fmgr/funcapi.cpp
index ba1959f8e..db0383191 100644
--- a/src/common/backend/utils/fmgr/funcapi.cpp
+++ b/src/common/backend/utils/fmgr/funcapi.cpp
@@ -17,6 +17,7 @@
#include "knl/knl_variable.h"
#include "catalog/gs_encrypted_proc.h"
#include "catalog/namespace.h"
+#include "catalog/pg_language.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_type.h"
#include "funcapi.h"
@@ -173,6 +174,100 @@ static void shutdown_multi_func_call(Datum arg)
MemoryContextDelete(funcctx->multi_call_memory_ctx);
}
+bool is_function_with_plpgsql_language_and_outparam(Oid funcid)
+{
+#ifndef ENABLE_MULTIPLE_NODES
+ if (!enable_out_param_override() || u_sess->attr.attr_sql.sql_compatibility != A_FORMAT || funcid == InvalidOid) {
+ return false;
+ }
+#else
+ return false;
+#endif
+ char* funclang = get_func_langname(funcid);
+ if (strcasecmp(funclang, "plpgsql") != 0) {
+ pfree(funclang);
+ return false;
+ }
+ pfree(funclang);
+
+ HeapTuple tp;
+ bool existOutParam = false;
+ bool isNull = false;
+ tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp)) {
+ ereport(ERROR, (errcode(ERRCODE_CACHE_LOOKUP_FAILED),
+ (errmsg("cache lookup failed for function %u", funcid), errdetail("N/A."),
+ errcause("System error."), erraction("Contact engineer to support."))));
+ }
+ Datum pprokind = SysCacheGetAttr(PROCOID, tp, Anum_pg_proc_prokind, &isNull);
+ if ((!isNull && !PROC_IS_FUNC(pprokind))) {
+ ReleaseSysCache(tp);
+ return false;
+ }
+ isNull = false;
+ (void)SysCacheGetAttr(PROCOID, tp, Anum_pg_proc_proallargtypes, &isNull);
+ if (!isNull) {
+ existOutParam = true;
+ }
+ ReleaseSysCache(tp);
+ return existOutParam;
+}
+
+TupleDesc get_func_param_desc(HeapTuple tp, Oid resultTypeId, int* return_out_args_num)
+{
+ Oid *p_argtypes = NULL;
+ char **p_argnames = NULL;
+ char *p_argmodes = NULL;
+ int p_nargs = get_func_arg_info(tp, &p_argtypes, &p_argnames, &p_argmodes);
+ char* p_name = NameStr(((Form_pg_proc)GETSTRUCT(tp))->proname);
+ int out_args_num = 0;
+ for (int i = 0; i < p_nargs; i++) {
+ if (p_argmodes[i] == 'o' || p_argmodes[i] == 'b') {
+ out_args_num++;
+ }
+ }
+ if (return_out_args_num != NULL) {
+ *return_out_args_num = out_args_num;
+ }
+ /* The return field is in the first column, and the parameter starts in the second column. */
+ TupleDesc resultTupleDesc = CreateTemplateTupleDesc(out_args_num + 1, false);
+ TupleDescInitEntry(resultTupleDesc, (AttrNumber)1, p_name, resultTypeId, -1, 0);
+ int attindex = 2;
+ for (int i = 0; i < p_nargs; i++) {
+ if (p_argmodes[i] == 'o' || p_argmodes[i] == 'b') {
+ TupleDescInitEntry(resultTupleDesc, (AttrNumber)attindex, p_argnames[i], p_argtypes[i], p_argmodes[i],
+ 0);
+ attindex++;
+ }
+ }
+
+ return resultTupleDesc;
+}
+
+void construct_func_param_desc(Oid funcid, TypeFuncClass* typclass, TupleDesc* tupdesc, Oid* resultTypeId)
+{
+ if (tupdesc == NULL || resultTypeId == NULL || typclass == NULL) {
+ return;
+ }
+ Oid paramTypeOid = is_function_with_plpgsql_language_and_outparam(funcid);
+ if (paramTypeOid == InvalidOid) {
+ return;
+ }
+ /* Contruct argument tuple descriptor */
+ HeapTuple tp = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
+ if (!HeapTupleIsValid(tp)) {
+ ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmodule(MOD_PLSQL),
+ errmsg("Cache lookup failed for function %u", funcid),
+ errdetail("Fail to get the function param type oid.")));
+ }
+
+ *tupdesc = get_func_param_desc(tp, *resultTypeId);
+ *resultTypeId = RECORDOID;
+ *typclass = TYPEFUNC_COMPOSITE;
+
+ ReleaseSysCache(tp);
+}
+
/*
* get_call_result_type
* Given a function's call info record, determine the kind of datatype
@@ -215,6 +310,9 @@ TypeFuncClass get_expr_result_type(Node* expr, Oid* resultTypeId, TupleDesc* res
if (expr && IsA(expr, FuncExpr)) {
result = internal_get_result_type(((FuncExpr*)expr)->funcid, expr, NULL, resultTypeId, resultTupleDesc,
resultTypeId_orig);
+
+ /* A_FORMAT return param seperation */
+ construct_func_param_desc(((FuncExpr*)expr)->funcid, &result, resultTupleDesc, resultTypeId);
} else if (expr && IsA(expr, OpExpr)) {
result = internal_get_result_type(get_opcode(((OpExpr*)expr)->opno), expr, NULL, resultTypeId, resultTupleDesc,
NULL);
@@ -732,6 +830,7 @@ static TypeFuncClass get_type_func_class(Oid typid)
case TYPTYPE_DOMAIN:
case TYPTYPE_ENUM:
case TYPTYPE_RANGE:
+ case TYPTYPE_TABLEOF:
return TYPEFUNC_SCALAR;
case TYPTYPE_PSEUDO:
diff --git a/src/common/backend/utils/hash/dynahash.cpp b/src/common/backend/utils/hash/dynahash.cpp
index 0702cc5a6..537a95d20 100644
--- a/src/common/backend/utils/hash/dynahash.cpp
+++ b/src/common/backend/utils/hash/dynahash.cpp
@@ -235,6 +235,8 @@ HTAB* hash_create(const char* tabname, long nelem, HASHCTL* info, int flags)
}
}
+ MemoryContext currentDynaHashCxt = t_thrd.dyhash_cxt.CurrentDynaHashCxt;
+
/* Initialize the hash header, plus a copy of the table name */
hashp = (HTAB*)DynaHashAlloc(sizeof(HTAB) + strlen(tabname) + 1);
MemSet(hashp, 0, sizeof(HTAB));
@@ -318,7 +320,7 @@ HTAB* hash_create(const char* tabname, long nelem, HASHCTL* info, int flags)
/* setup hash table defaults */
hashp->hctl = NULL;
hashp->dir = NULL;
- hashp->hcxt = t_thrd.dyhash_cxt.CurrentDynaHashCxt;
+ hashp->hcxt = currentDynaHashCxt;
hashp->isshared = false;
}
diff --git a/src/common/backend/utils/init/globals.cpp b/src/common/backend/utils/init/globals.cpp
index d08c64d36..95d047e12 100644
--- a/src/common/backend/utils/init/globals.cpp
+++ b/src/common/backend/utils/init/globals.cpp
@@ -59,9 +59,10 @@ bool open_join_children = true;
bool will_shutdown = false;
/* hard-wired binary version number */
-const uint32 GRAND_VERSION_NUM = 92507;
+const uint32 GRAND_VERSION_NUM = 92602;
-const uint32 SUPPORT_HASH_XLOG_VERSION_NUM = 92501;
+const uint32 PREDPUSH_SAME_LEVEL_VERSION_NUM = 92522;
+const uint32 UPSERT_WHERE_VERSION_NUM = 92514;
const uint32 FUNC_PARAM_COL_VERSION_NUM = 92500;
const uint32 SUBPARTITION_VERSION_NUM = 92436;
const uint32 DEFAULT_MAT_CTE_NUM = 92429;
@@ -83,7 +84,7 @@ const uint32 RANGE_LIST_DISTRIBUTION_VERSION_NUM = 92272;
const uint32 BACKUP_SLOT_VERSION_NUM = 92282;
const uint32 ML_OPT_MODEL_VERSION_NUM = 92284;
const uint32 FIX_SQL_ADD_RELATION_REF_COUNT = 92291;
-const uint32 INPLACE_UPDATE_WERSION_NUM = 92350;
+const uint32 INPLACE_UPDATE_VERSION_NUM = 92350;
const uint32 GENERATED_COL_VERSION_NUM = 92355;
const uint32 SEGMENT_PAGE_VERSION_NUM = 92360;
const uint32 COMMENT_PROC_VERSION_NUM = 92372;
@@ -96,25 +97,37 @@ const uint32 SWCB_VERSION_NUM = 92427;
const uint32 COMMENT_ROWTYPE_TABLEOF_VERSION_NUM = 92513;
const uint32 PRIVS_DIRECTORY_VERSION_NUM = 92460;
const uint32 COMMENT_RECORD_PARAM_VERSION_NUM = 92484;
-const uint32 ANALYZER_HOOK_VERSION_NUM = 92502;
-const uint32 PUBLICATION_VERSION_NUM = 92504;
+const uint32 SCAN_BATCH_MODE_VERSION_NUM = 92568;
+const uint32 PUBLICATION_VERSION_NUM = 92580;
/* Version number of the guc parameter backend_version added in V500R001C20 */
const uint32 V5R1C20_BACKEND_VERSION_NUM = 92305;
-/* Version number starting from V500R002C00 */
+/* Version number starting from V500R002C10 */
const uint32 V5R2C00_START_VERSION_NUM = 92350;
-/* Version number of the guc parameter backend_version added in V500R002C00 */
+/* Version number of the guc parameter backend_version added in V500R002C10 */
const uint32 V5R2C00_BACKEND_VERSION_NUM = 92412;
+const uint32 ANALYZER_HOOK_VERSION_NUM = 92592;
+
/* This variable indicates wheather the instance is in progress of upgrade as a whole */
uint32 volatile WorkingGrandVersionNum = GRAND_VERSION_NUM;
-const uint32 ENHANCED_TUPLE_LOCK_VERSION_NUM = 92506;
+const uint32 ENHANCED_TUPLE_LOCK_VERSION_NUM = 92583;
const uint32 TWOPHASE_FILE_VERSION = 92414;
+const uint32 HASUID_VERSION_NUM = 92550;
+const uint32 WAIT_N_TUPLE_LOCK_VERSION_NUM = 92573;
+
+const uint32 PARALLEL_DECODE_VERSION_NUM = 92556;
+
+const uint32 CREATE_INDEX_CONCURRENTLY_DIST_VERSION_NUM = 92569;
+
+const uint32 SUPPORT_DATA_REPAIR = 92579;
bool InplaceUpgradePrecommit = false;
+const uint32 DISASTER_READ_VERSION_NUM = 92592;
+
#ifdef PGXC
bool useLocalXid = false;
#endif
diff --git a/src/common/backend/utils/init/miscinit.cpp b/src/common/backend/utils/init/miscinit.cpp
index c1c09411b..8664009a8 100644
--- a/src/common/backend/utils/init/miscinit.cpp
+++ b/src/common/backend/utils/init/miscinit.cpp
@@ -642,10 +642,12 @@ Oid get_pgxc_logic_groupoid(const char* rolename)
* NodeGroupCallback
* Syscache inval callback function
*/
-static void NodeGroupCallback(Datum arg, int cacheid, uint32 hashvalue)
+static void SessionNodeGroupCallback(Datum arg, int cacheid, uint32 hashvalue)
{
u_sess->misc_cxt.current_nodegroup_mode = NG_UNKNOWN;
- RelationCacheInvalidateBuckets();
+ if (!EnableLocalSysCache()) {
+ RelationCacheInvalidateBuckets();
+ }
}
/*
@@ -655,7 +657,7 @@ static void NodeGroupCallback(Datum arg, int cacheid, uint32 hashvalue)
static void RegisterNodeGroupCacheCallback()
{
if (IS_PGXC_COORDINATOR && !u_sess->misc_cxt.nodegroup_callback_registered) {
- CacheRegisterSyscacheCallback(PGXCGROUPOID, NodeGroupCallback, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(PGXCGROUPOID, SessionNodeGroupCallback, (Datum)0);
u_sess->misc_cxt.nodegroup_callback_registered = true;
}
}
@@ -790,7 +792,7 @@ bool has_rolvcadmin(Oid roleid)
static void DecreaseUserCountReuse(Oid roleid, bool ispoolerreuse)
{
- if (ispoolerreuse == true && ENABLE_THREAD_POOL) {
+ if (ispoolerreuse == true && IS_THREAD_POOL_WORKER) {
DecreaseUserCount(roleid);
}
}
@@ -906,7 +908,7 @@ void InitializeSessionUserId(const char* rolename, bool ispoolerreuse, Oid usero
/* Also mark our PGPROC entry with the authenticated user id */
/* (We assume this is an atomic store so no lock is needed) */
- DecreaseUserCountReuse(roleid, ispoolerreuse);
+ DecreaseUserCountReuse(t_thrd.proc->roleId, ispoolerreuse);
t_thrd.proc->roleId = roleid;
/*
@@ -918,7 +920,7 @@ void InitializeSessionUserId(const char* rolename, bool ispoolerreuse, Oid usero
/*
* Is role allowed to login at all?
*/
- if (ENABLE_THREAD_POOL) {
+ if (IS_THREAD_POOL_WORKER) {
IncreaseUserCount(roleid);
}
@@ -967,11 +969,12 @@ void InitializeSessionUserIdStandalone(void)
#ifdef ENABLE_MULTIPLE_NODES
AssertState(!IsUnderPostmaster || IsAutoVacuumWorkerProcess() || IsJobSchedulerProcess() || IsJobWorkerProcess() ||
AM_WAL_SENDER || IsTxnSnapCapturerProcess() || IsTxnSnapWorkerProcess() || IsUndoWorkerProcess() ||
- CompactionProcess::IsTsCompactionProcess() || IsRbCleanerProcess() || IsRbWorkerProcess());
+ CompactionProcess::IsTsCompactionProcess() || IsRbCleanerProcess() || IsRbWorkerProcess() ||
+ t_thrd.role == PARALLEL_DECODE || t_thrd.role == LOGICAL_READ_RECORD);
#else /* ENABLE_MULTIPLE_NODES */
AssertState(!IsUnderPostmaster || IsAutoVacuumWorkerProcess() || IsJobSchedulerProcess() || IsJobWorkerProcess() ||
AM_WAL_SENDER || IsTxnSnapCapturerProcess() || IsTxnSnapWorkerProcess() || IsUndoWorkerProcess() || IsRbCleanerProcess() ||
- IsRbWorkerProcess());
+ IsRbWorkerProcess() || t_thrd.role == PARALLEL_DECODE || t_thrd.role == LOGICAL_READ_RECORD);
#endif /* ENABLE_MULTIPLE_NODES */
/* In pooler stateless reuse mode, to reset session userid */
@@ -1139,6 +1142,37 @@ static void UnlinkLockFile(int status, Datum filename)
}
}
+/*
+ * proc_exit callback to unlock a lockfile.
+ */
+static void UnLockPidLockFile(int status, Datum fileDes)
+{
+ int fd = DatumGetInt32(fileDes);
+
+ if (fd != -1) {
+ close(fd);
+ }
+}
+
+static void CreatePidLockFile(const char* filename)
+{
+ int fd = -1;
+ char pid_lock_file[MAXPGPATH] = {0};
+ int rc = snprintf_s(pid_lock_file, MAXPGPATH, MAXPGPATH - 1, "%s.lock", filename);
+ securec_check_ss(rc, "", "");
+
+ if ((fd = open(pid_lock_file, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR)) == -1) {
+ ereport(FATAL, (errcode_for_file_access(), errmsg("could not create or open lock file \"%s\": %m", pid_lock_file)));
+ }
+
+ if (flock(fd, LOCK_EX | LOCK_NB) == -1) {
+ close(fd);
+ ereport(FATAL, (errcode_for_file_access(), errmsg("could not lock file \"%s\": %m", pid_lock_file)));
+ }
+
+ on_proc_exit(UnLockPidLockFile, Int32GetDatum(fd));
+}
+
/*
* Create a lockfile.
*
@@ -1157,6 +1191,11 @@ static void CreateLockFile(const char* filename, bool amPostmaster, bool isDDLoc
pid_t my_pid, my_p_pid, my_gp_pid;
const char* envvar = NULL;
+ /* Grab a file lock to establish our priority to process postmaster.pid */
+ if (isDDLock) {
+ CreatePidLockFile(filename);
+ }
+
/*
* If the PID in the lockfile is our own PID or our parent's or
* grandparent's PID, then the file must be stale (probably left over from
@@ -1863,4 +1902,4 @@ bool contain_backend_version(uint32 version_number) {
return ((version_number >= V5R1C20_BACKEND_VERSION_NUM &&
version_number < V5R2C00_START_VERSION_NUM) ||
(version_number >= V5R2C00_BACKEND_VERSION_NUM));
-}
\ No newline at end of file
+}
diff --git a/src/common/backend/utils/init/postinit.cpp b/src/common/backend/utils/init/postinit.cpp
index c4e7b212e..f448b775a 100644
--- a/src/common/backend/utils/init/postinit.cpp
+++ b/src/common/backend/utils/init/postinit.cpp
@@ -59,6 +59,7 @@
#include "postmaster/snapcapturer.h"
#include "postmaster/rbcleaner.h"
#include "replication/catchup.h"
+#include "replication/logicalfuncs.h"
#include "replication/walsender.h"
#include "storage/buf/bufmgr.h"
#include "storage/smgr/fd.h"
@@ -92,6 +93,7 @@
#include "instruments/percentile.h"
#include "instruments/instr_workload.h"
#include "gs_policy/policy_common.h"
+#include "utils/knl_relcache.h"
#ifndef WIN32_ONLY_COMPILER
#include "dynloader.h"
#else
@@ -223,7 +225,7 @@ static HeapTuple GetDatabaseTuple(const char* dbname)
*/
relation = heap_open(DatabaseRelationId, AccessShareLock);
scan = systable_beginscan(
- relation, DatabaseNameIndexId, u_sess->relcache_cxt.criticalSharedRelcachesBuilt, NULL, 1, key);
+ relation, DatabaseNameIndexId, LocalRelCacheCriticalSharedRelcachesBuilt(), NULL, 1, key);
tuple = systable_getnext(scan);
@@ -260,7 +262,7 @@ static HeapTuple GetDatabaseTupleByOid(Oid dboid)
*/
relation = heap_open(DatabaseRelationId, AccessShareLock);
scan = systable_beginscan(
- relation, DatabaseOidIndexId, u_sess->relcache_cxt.criticalSharedRelcachesBuilt, NULL, 1, key);
+ relation, DatabaseOidIndexId, LocalRelCacheCriticalSharedRelcachesBuilt(), NULL, 1, key);
tuple = systable_getnext(scan);
@@ -324,6 +326,10 @@ static void PerformAuthentication(Port* port)
else
ereport(LOG, (errmsg("connection authorized: user=%s database=%s", port->user_name, port->database_name)));
}
+ if (AM_WAL_DB_SENDER) {
+ Oid userId = get_role_oid(port->user_name, false);
+ CheckLogicalPremissions(userId);
+ }
/* INSTR: update user login counter */
if (IsUnderPostmaster && !IsBootstrapProcessingMode() && !dummyStandbyMode)
@@ -784,9 +790,9 @@ static void process_startup_options(Port* port, bool am_superuser)
}
/* check 2 -- forbid non-initial users, except gs_roach and during cluster resizing with gs_redis */
- if (!dummyStandbyMode && GetRoleOid(port->user_name) != INITIAL_USER_ID &&
+ if (!dummyStandbyMode && GetRoleOid(port->user_name) != INITIAL_USER_ID && !AM_WAL_HADR_SENDER &&
!(ClusterResizingInProgress() && u_sess->proc_cxt.clientIsGsredis) && !u_sess->proc_cxt.clientIsGsroach &&
- !AM_WAL_HADR_SENDER) {
+ !AM_WAL_HADR_CN_SENDER) {
ereport(FATAL,
(errcode(ERRCODE_INVALID_OPERATION), errmsg("Inner maintenance tools only for the initial user.")));
}
@@ -1151,12 +1157,10 @@ void PostgresInitializer::SetDatabaseAndUser(const char* in_dbname, Oid dboid, c
void PostgresInitializer::InitFencedSysCache()
{
+ m_dboid = u_sess->proc_cxt.MyDatabaseId;
InitSysCache();
-
u_sess->proc_cxt.MyDatabaseTableSpace = DEFAULTTABLESPACE_OID;
-
SetFencedMasterDatabase();
-
LoadSysCache();
}
@@ -1371,6 +1375,42 @@ void PostgresInitializer::InitStatementWorker()
FinishInit();
}
+void PostgresInitializer::InitParallelDecode()
+{
+ /* Check replication permissions needed for walsender processes. */
+ Assert(!IsBootstrapProcessingMode());
+
+ InitThread();
+
+ InitSysCache();
+
+ /* Initialize stats collection --- must happen before first xact */
+ pgstat_initialize();
+
+ SetProcessExitCallback();
+
+ StartXact();
+
+ SetSuperUserStandalone();
+
+ if (!AM_WAL_DB_SENDER && !AM_PARALLEL_DECODE && !AM_LOGICAL_READ_RECORD) {
+ InitPlainWalSender();
+ return;
+ }
+
+ SetDatabase();
+
+ LoadSysCache();
+
+ InitDatabase();
+
+ InitPGXCPort();
+
+ InitSettings();
+
+ FinishInit();
+}
+
void PostgresInitializer::InitPercentileWorker()
{
InitThread();
@@ -1701,8 +1741,6 @@ void PostgresInitializer::InitTxnSnapWorker()
InitSettings();
- InitExtensionVariable();
-
FinishInit();
AuditUserLogin();
@@ -1954,7 +1992,12 @@ void PostgresInitializer::InitThread()
*/
t_thrd.proc_cxt.MyBackendId = InvalidBackendId;
- SharedInvalBackendInit(IS_THREAD_POOL_WORKER, false);
+ if (EnableLocalSysCache()) {
+ SharedInvalBackendInit(false, false);
+ } else {
+ /* init invalid msg slot */
+ SharedInvalBackendInit(IS_THREAD_POOL_WORKER, false);
+ }
if (t_thrd.proc_cxt.MyBackendId > g_instance.shmem_cxt.MaxBackends || t_thrd.proc_cxt.MyBackendId <= 0)
ereport(FATAL, (errmsg("bad backend ID: %d", t_thrd.proc_cxt.MyBackendId)));
@@ -1989,6 +2032,56 @@ void PostgresInitializer::InitThread()
}
}
+void PostgresInitializer::InitLoadLocalSysCache(Oid db_oid, const char *db_name)
+{
+ if(!EnableLocalSysCache()) {
+ return;
+ }
+ ResourceOwner currentOwner = t_thrd.utils_cxt.CurrentResourceOwner;
+ PG_TRY();
+ {
+ /* local_sysdb_resowner never be freed until proc exit */
+ t_thrd.utils_cxt.CurrentResourceOwner = t_thrd.lsc_cxt.lsc->local_sysdb_resowner;
+ Assert(u_sess->proc_cxt.MyDatabaseId != InvalidOid);
+ t_thrd.lsc_cxt.lsc->ClearSysCacheIfNecessary(db_oid, db_name);
+ InitFileAccess();
+
+ /* Do local initialization of file, storage and buffer managers */
+ t_thrd.lsc_cxt.lsc->InitThreadDatabase(db_oid, db_name, u_sess->proc_cxt.MyDatabaseTableSpace);
+ t_thrd.lsc_cxt.lsc->InitDatabasePath(u_sess->proc_cxt.DatabasePath);
+
+ /* init syscache which is mounted on thread */
+ Assert(t_thrd.lsc_cxt.lsc != NULL);
+ /* this function is called by threadworker, since we have inited u_sess, we can find the db_id */
+ Assert(u_sess->proc_cxt.MyDatabaseId != InvalidOid);
+ t_thrd.lsc_cxt.lsc->tabdefcache.Init();
+ t_thrd.lsc_cxt.lsc->tabdefcache.InitPhase2();
+
+ t_thrd.lsc_cxt.lsc->partdefcache.Init();
+ t_thrd.lsc_cxt.lsc->systabcache.Init();
+ t_thrd.lsc_cxt.lsc->tabdefcache.InitPhase3();
+ }
+ PG_CATCH();
+ {
+ /* loadsyscache failed, there is noway to recovery, release resource here */
+ ResourceOwnerRelease(t_thrd.lsc_cxt.lsc->local_sysdb_resowner, RESOURCE_RELEASE_BEFORE_LOCKS, false, true);
+ ResourceOwnerRelease(t_thrd.lsc_cxt.lsc->local_sysdb_resowner, RESOURCE_RELEASE_LOCKS, false, true);
+ ResourceOwnerRelease(t_thrd.lsc_cxt.lsc->local_sysdb_resowner, RESOURCE_RELEASE_AFTER_LOCKS, false, true);
+
+ /* lwlocks arre released at sigsetjmp */
+
+ /* recovery CurrentResourceOwner */
+ t_thrd.utils_cxt.CurrentResourceOwner = currentOwner;
+ PG_RE_THROW();
+ }
+ PG_END_TRY();
+ /* local_sysdb_resowner should be empty */
+ Assert(CurrentResourceOwnerIsEmpty(t_thrd.lsc_cxt.lsc->local_sysdb_resowner));
+
+ /* recovery CurrentResourceOwner */
+ t_thrd.utils_cxt.CurrentResourceOwner = currentOwner;
+}
+
void PostgresInitializer::InitSession()
{
/* Init rel cache for new session. */
@@ -2046,6 +2139,11 @@ void PostgresInitializer::InitStreamSession()
void PostgresInitializer::InitSysCache()
{
+ if (EnableLocalSysCache()) {
+ Assert(u_sess->proc_cxt.MyDatabaseId == InvalidOid);
+ t_thrd.lsc_cxt.lsc->ClearSysCacheIfNecessary(m_dboid, m_indbname);
+ InitFileAccess();
+ }
/*
* Initialize the relation cache and the system catalog caches. Note that
* no catalog access happens here; we only set up the hashtable structure.
@@ -2059,12 +2157,13 @@ void PostgresInitializer::InitSysCache()
*/
RelationCacheInitializePhase2();
- PartitionCacheInitialize();
-
BucketCacheInitialize();
InitCatalogCache();
InitPlanCache();
+ if (!EnableLocalSysCache()) {
+ PartitionCacheInitialize();
+ }
}
void PostgresInitializer::SetProcessExitCallback()
@@ -2298,6 +2397,10 @@ void PostgresInitializer::SetDefaultDatabase()
Assert(!u_sess->proc_cxt.DatabasePath);
u_sess->proc_cxt.DatabasePath =
MemoryContextStrdup(SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_EXECUTOR), m_fullpath);
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->InitSessionDatabase(TemplateDbOid, m_dbname, DEFAULTTABLESPACE_OID);
+ t_thrd.lsc_cxt.lsc->InitDatabasePath(m_fullpath);
+ }
}
@@ -2307,6 +2410,11 @@ void PostgresInitializer::SetFencedMasterDatabase()
u_sess->utils_cxt.RecentGlobalXmin = FirstNormalTransactionId;
u_sess->proc_cxt.DatabasePath =
MemoryContextStrdup(SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_EXECUTOR), m_fullpath);
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->InitSessionDatabase(u_sess->proc_cxt.MyDatabaseId,
+ NULL, u_sess->proc_cxt.MyDatabaseTableSpace);
+ t_thrd.lsc_cxt.lsc->InitDatabasePath(m_fullpath);
+ }
}
void PostgresInitializer::SetDatabase()
@@ -2352,7 +2460,11 @@ void PostgresInitializer::SetDatabaseByName()
u_sess->proc_cxt.MyDatabaseId = HeapTupleGetOid(tuple);
u_sess->proc_cxt.MyDatabaseTableSpace = dbform->dattablespace;
/* take database name from the caller, just for paranoia */
+ m_dboid = u_sess->proc_cxt.MyDatabaseId;
strlcpy(m_dbname, m_indbname, sizeof(m_dbname));
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->InitSessionDatabase(m_dboid, m_dbname, dbform->dattablespace);
+ }
}
void PostgresInitializer::SetDatabaseByOid()
@@ -2377,6 +2489,9 @@ void PostgresInitializer::SetDatabaseByOid()
u_sess->proc_cxt.MyDatabaseTableSpace = dbform->dattablespace;
Assert(u_sess->proc_cxt.MyDatabaseId == m_dboid);
strlcpy(m_dbname, NameStr(dbform->datname), sizeof(m_dbname));
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->InitSessionDatabase(m_dboid, m_dbname, dbform->dattablespace);
+ }
}
void PostgresInitializer::LockDatabase()
@@ -2402,6 +2517,7 @@ void PostgresInitializer::LockDatabase()
* AccessShareLock for such sessions and thereby not conflict against
* CREATE DATABASE.
*/
+
LockSharedObject(DatabaseRelationId, u_sess->proc_cxt.MyDatabaseId, 0, RowExclusiveLock);
/*
* Now we can mark our PGPROC entry with the database ID.
@@ -2478,10 +2594,16 @@ void PostgresInitializer::SetDatabasePath()
Assert(!u_sess->proc_cxt.DatabasePath);
u_sess->proc_cxt.DatabasePath = MemoryContextStrdup(
SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_EXECUTOR), m_fullpath);
+ if (EnableLocalSysCache()) {
+ t_thrd.lsc_cxt.lsc->InitDatabasePath(m_fullpath);
+ }
}
void PostgresInitializer::LoadSysCache()
{
+ if (EnableLocalSysCache()) {
+ PartitionCacheInitialize();
+ }
/*
* It's now possible to do real access to the system catalogs.
*
@@ -2644,7 +2766,12 @@ void PostgresInitializer::InitCompactionThread()
*/
t_thrd.proc_cxt.MyBackendId = InvalidBackendId;
- SharedInvalBackendInit(IS_THREAD_POOL_WORKER, false);
+ if (EnableLocalSysCache()) {
+ SharedInvalBackendInit(false, false);
+ } else {
+ /* init invalid msg slot */
+ SharedInvalBackendInit(IS_THREAD_POOL_WORKER, false);
+ }
if (t_thrd.proc_cxt.MyBackendId > g_instance.shmem_cxt.MaxBackends || t_thrd.proc_cxt.MyBackendId <= 0)
ereport(FATAL, (errmsg("bad backend ID: %d", t_thrd.proc_cxt.MyBackendId)));
@@ -2694,6 +2821,8 @@ void PostgresInitializer::InitBarrierCreator()
InitPGXCPort();
+ FinishInit();
+
return;
}
diff --git a/src/common/backend/utils/mb/Unicode/ISO10646-GB18030.TXT b/src/common/backend/utils/mb/Unicode/ISO10646-GB18030.TXT
deleted file mode 100644
index a26bab48a..000000000
--- a/src/common/backend/utils/mb/Unicode/ISO10646-GB18030.TXT
+++ /dev/null
@@ -1,63488 +0,0 @@
-0000 00
-0001 01
-0002 02
-0003 03
-0004 04
-0005 05
-0006 06
-0007 07
-0008 08
-0009 09
-000A 0A
-000B 0B
-000C 0C
-000D 0D
-000E 0E
-000F 0F
-0010 10
-0011 11
-0012 12
-0013 13
-0014 14
-0015 15
-0016 16
-0017 17
-0018 18
-0019 19
-001A 1A
-001B 1B
-001C 1C
-001D 1D
-001E 1E
-001F 1F
-0020 20
-0021 21
-0022 22
-0023 23
-0024 24
-0025 25
-0026 26
-0027 27
-0028 28
-0029 29
-002A 2A
-002B 2B
-002C 2C
-002D 2D
-002E 2E
-002F 2F
-0030 30
-0031 31
-0032 32
-0033 33
-0034 34
-0035 35
-0036 36
-0037 37
-0038 38
-0039 39
-003A 3A
-003B 3B
-003C 3C
-003D 3D
-003E 3E
-003F 3F
-0040 40
-0041 41
-0042 42
-0043 43
-0044 44
-0045 45
-0046 46
-0047 47
-0048 48
-0049 49
-004A 4A
-004B 4B
-004C 4C
-004D 4D
-004E 4E
-004F 4F
-0050 50
-0051 51
-0052 52
-0053 53
-0054 54
-0055 55
-0056 56
-0057 57
-0058 58
-0059 59
-005A 5A
-005B 5B
-005C 5C
-005D 5D
-005E 5E
-005F 5F
-0060 60
-0061 61
-0062 62
-0063 63
-0064 64
-0065 65
-0066 66
-0067 67
-0068 68
-0069 69
-006A 6A
-006B 6B
-006C 6C
-006D 6D
-006E 6E
-006F 6F
-0070 70
-0071 71
-0072 72
-0073 73
-0074 74
-0075 75
-0076 76
-0077 77
-0078 78
-0079 79
-007A 7A
-007B 7B
-007C 7C
-007D 7D
-007E 7E
-007F 7F
-0080 81308130
-0081 81308131
-0082 81308132
-0083 81308133
-0084 81308134
-0085 81308135
-0086 81308136
-0087 81308137
-0088 81308138
-0089 81308139
-008A 81308230
-008B 81308231
-008C 81308232
-008D 81308233
-008E 81308234
-008F 81308235
-0090 81308236
-0091 81308237
-0092 81308238
-0093 81308239
-0094 81308330
-0095 81308331
-0096 81308332
-0097 81308333
-0098 81308334
-0099 81308335
-009A 81308336
-009B 81308337
-009C 81308338
-009D 81308339
-009E 81308430
-009F 81308431
-00A0 81308432
-00A1 81308433
-00A2 81308434
-00A3 81308435
-00A4 A1E8
-00A5 81308436
-00A6 81308437
-00A7 A1EC
-00A8 A1A7
-00A9 81308438
-00AA 81308439
-00AB 81308530
-00AC 81308531
-00AD 81308532
-00AE 81308533
-00AF 81308534
-00B0 A1E3
-00B1 A1C0
-00B2 81308535
-00B3 81308536
-00B4 81308537
-00B5 81308538
-00B6 81308539
-00B7 A1A4
-00B8 81308630
-00B9 81308631
-00BA 81308632
-00BB 81308633
-00BC 81308634
-00BD 81308635
-00BE 81308636
-00BF 81308637
-00C0 81308638
-00C1 81308639
-00C2 81308730
-00C3 81308731
-00C4 81308732
-00C5 81308733
-00C6 81308734
-00C7 81308735
-00C8 81308736
-00C9 81308737
-00CA 81308738
-00CB 81308739
-00CC 81308830
-00CD 81308831
-00CE 81308832
-00CF 81308833
-00D0 81308834
-00D1 81308835
-00D2 81308836
-00D3 81308837
-00D4 81308838
-00D5 81308839
-00D6 81308930
-00D7 A1C1
-00D8 81308931
-00D9 81308932
-00DA 81308933
-00DB 81308934
-00DC 81308935
-00DD 81308936
-00DE 81308937
-00DF 81308938
-00E0 A8A4
-00E1 A8A2
-00E2 81308939
-00E3 81308A30
-00E4 81308A31
-00E5 81308A32
-00E6 81308A33
-00E7 81308A34
-00E8 A8A8
-00E9 A8A6
-00EA A8BA
-00EB 81308A35
-00EC A8AC
-00ED A8AA
-00EE 81308A36
-00EF 81308A37
-00F0 81308A38
-00F1 81308A39
-00F2 A8B0
-00F3 A8AE
-00F4 81308B30
-00F5 81308B31
-00F6 81308B32
-00F7 A1C2
-00F8 81308B33
-00F9 A8B4
-00FA A8B2
-00FB 81308B34
-00FC A8B9
-00FD 81308B35
-00FE 81308B36
-00FF 81308B37
-0100 81308B38
-0101 A8A1
-0102 81308B39
-0103 81308C30
-0104 81308C31
-0105 81308C32
-0106 81308C33
-0107 81308C34
-0108 81308C35
-0109 81308C36
-010A 81308C37
-010B 81308C38
-010C 81308C39
-010D 81308D30
-010E 81308D31
-010F 81308D32
-0110 81308D33
-0111 81308D34
-0112 81308D35
-0113 A8A5
-0114 81308D36
-0115 81308D37
-0116 81308D38
-0117 81308D39
-0118 81308E30
-0119 81308E31
-011A 81308E32
-011B A8A7
-011C 81308E33
-011D 81308E34
-011E 81308E35
-011F 81308E36
-0120 81308E37
-0121 81308E38
-0122 81308E39
-0123 81308F30
-0124 81308F31
-0125 81308F32
-0126 81308F33
-0127 81308F34
-0128 81308F35
-0129 81308F36
-012A 81308F37
-012B A8A9
-012C 81308F38
-012D 81308F39
-012E 81309030
-012F 81309031
-0130 81309032
-0131 81309033
-0132 81309034
-0133 81309035
-0134 81309036
-0135 81309037
-0136 81309038
-0137 81309039
-0138 81309130
-0139 81309131
-013A 81309132
-013B 81309133
-013C 81309134
-013D 81309135
-013E 81309136
-013F 81309137
-0140 81309138
-0141 81309139
-0142 81309230
-0143 81309231
-0144 A8BD
-0145 81309232
-0146 81309233
-0147 81309234
-0148 A8BE
-0149 81309235
-014A 81309236
-014B 81309237
-014C 81309238
-014D A8AD
-014E 81309239
-014F 81309330
-0150 81309331
-0151 81309332
-0152 81309333
-0153 81309334
-0154 81309335
-0155 81309336
-0156 81309337
-0157 81309338
-0158 81309339
-0159 81309430
-015A 81309431
-015B 81309432
-015C 81309433
-015D 81309434
-015E 81309435
-015F 81309436
-0160 81309437
-0161 81309438
-0162 81309439
-0163 81309530
-0164 81309531
-0165 81309532
-0166 81309533
-0167 81309534
-0168 81309535
-0169 81309536
-016A 81309537
-016B A8B1
-016C 81309538
-016D 81309539
-016E 81309630
-016F 81309631
-0170 81309632
-0171 81309633
-0172 81309634
-0173 81309635
-0174 81309636
-0175 81309637
-0176 81309638
-0177 81309639
-0178 81309730
-0179 81309731
-017A 81309732
-017B 81309733
-017C 81309734
-017D 81309735
-017E 81309736
-017F 81309737
-0180 81309738
-0181 81309739
-0182 81309830
-0183 81309831
-0184 81309832
-0185 81309833
-0186 81309834
-0187 81309835
-0188 81309836
-0189 81309837
-018A 81309838
-018B 81309839
-018C 81309930
-018D 81309931
-018E 81309932
-018F 81309933
-0190 81309934
-0191 81309935
-0192 81309936
-0193 81309937
-0194 81309938
-0195 81309939
-0196 81309A30
-0197 81309A31
-0198 81309A32
-0199 81309A33
-019A 81309A34
-019B 81309A35
-019C 81309A36
-019D 81309A37
-019E 81309A38
-019F 81309A39
-01A0 81309B30
-01A1 81309B31
-01A2 81309B32
-01A3 81309B33
-01A4 81309B34
-01A5 81309B35
-01A6 81309B36
-01A7 81309B37
-01A8 81309B38
-01A9 81309B39
-01AA 81309C30
-01AB 81309C31
-01AC 81309C32
-01AD 81309C33
-01AE 81309C34
-01AF 81309C35
-01B0 81309C36
-01B1 81309C37
-01B2 81309C38
-01B3 81309C39
-01B4 81309D30
-01B5 81309D31
-01B6 81309D32
-01B7 81309D33
-01B8 81309D34
-01B9 81309D35
-01BA 81309D36
-01BB 81309D37
-01BC 81309D38
-01BD 81309D39
-01BE 81309E30
-01BF 81309E31
-01C0 81309E32
-01C1 81309E33
-01C2 81309E34
-01C3 81309E35
-01C4 81309E36
-01C5 81309E37
-01C6 81309E38
-01C7 81309E39
-01C8 81309F30
-01C9 81309F31
-01CA 81309F32
-01CB 81309F33
-01CC 81309F34
-01CD 81309F35
-01CE A8A3
-01CF 81309F36
-01D0 A8AB
-01D1 81309F37
-01D2 A8AF
-01D3 81309F38
-01D4 A8B3
-01D5 81309F39
-01D6 A8B5
-01D7 8130A030
-01D8 A8B6
-01D9 8130A031
-01DA A8B7
-01DB 8130A032
-01DC A8B8
-01DD 8130A033
-01DE 8130A034
-01DF 8130A035
-01E0 8130A036
-01E1 8130A037
-01E2 8130A038
-01E3 8130A039
-01E4 8130A130
-01E5 8130A131
-01E6 8130A132
-01E7 8130A133
-01E8 8130A134
-01E9 8130A135
-01EA 8130A136
-01EB 8130A137
-01EC 8130A138
-01ED 8130A139
-01EE 8130A230
-01EF 8130A231
-01F0 8130A232
-01F1 8130A233
-01F2 8130A234
-01F3 8130A235
-01F4 8130A236
-01F5 8130A237
-01F6 8130A238
-01F7 8130A239
-01F8 8130A330
-01F9 A8BF
-01FA 8130A331
-01FB 8130A332
-01FC 8130A333
-01FD 8130A334
-01FE 8130A335
-01FF 8130A336
-0200 8130A337
-0201 8130A338
-0202 8130A339
-0203 8130A430
-0204 8130A431
-0205 8130A432
-0206 8130A433
-0207 8130A434
-0208 8130A435
-0209 8130A436
-020A 8130A437
-020B 8130A438
-020C 8130A439
-020D 8130A530
-020E 8130A531
-020F 8130A532
-0210 8130A533
-0211 8130A534
-0212 8130A535
-0213 8130A536
-0214 8130A537
-0215 8130A538
-0216 8130A539
-0217 8130A630
-0218 8130A631
-0219 8130A632
-021A 8130A633
-021B 8130A634
-021C 8130A635
-021D 8130A636
-021E 8130A637
-021F 8130A638
-0220 8130A639
-0221 8130A730
-0222 8130A731
-0223 8130A732
-0224 8130A733
-0225 8130A734
-0226 8130A735
-0227 8130A736
-0228 8130A737
-0229 8130A738
-022A 8130A739
-022B 8130A830
-022C 8130A831
-022D 8130A832
-022E 8130A833
-022F 8130A834
-0230 8130A835
-0231 8130A836
-0232 8130A837
-0233 8130A838
-0234 8130A839
-0235 8130A930
-0236 8130A931
-0237 8130A932
-0238 8130A933
-0239 8130A934
-023A 8130A935
-023B 8130A936
-023C 8130A937
-023D 8130A938
-023E 8130A939
-023F 8130AA30
-0240 8130AA31
-0241 8130AA32
-0242 8130AA33
-0243 8130AA34
-0244 8130AA35
-0245 8130AA36
-0246 8130AA37
-0247 8130AA38
-0248 8130AA39
-0249 8130AB30
-024A 8130AB31
-024B 8130AB32
-024C 8130AB33
-024D 8130AB34
-024E 8130AB35
-024F 8130AB36
-0250 8130AB37
-0251 A8BB
-0252 8130AB38
-0253 8130AB39
-0254 8130AC30
-0255 8130AC31
-0256 8130AC32
-0257 8130AC33
-0258 8130AC34
-0259 8130AC35
-025A 8130AC36
-025B 8130AC37
-025C 8130AC38
-025D 8130AC39
-025E 8130AD30
-025F 8130AD31
-0260 8130AD32
-0261 A8C0
-0262 8130AD33
-0263 8130AD34
-0264 8130AD35
-0265 8130AD36
-0266 8130AD37
-0267 8130AD38
-0268 8130AD39
-0269 8130AE30
-026A 8130AE31
-026B 8130AE32
-026C 8130AE33
-026D 8130AE34
-026E 8130AE35
-026F 8130AE36
-0270 8130AE37
-0271 8130AE38
-0272 8130AE39
-0273 8130AF30
-0274 8130AF31
-0275 8130AF32
-0276 8130AF33
-0277 8130AF34
-0278 8130AF35
-0279 8130AF36
-027A 8130AF37
-027B 8130AF38
-027C 8130AF39
-027D 8130B030
-027E 8130B031
-027F 8130B032
-0280 8130B033
-0281 8130B034
-0282 8130B035
-0283 8130B036
-0284 8130B037
-0285 8130B038
-0286 8130B039
-0287 8130B130
-0288 8130B131
-0289 8130B132
-028A 8130B133
-028B 8130B134
-028C 8130B135
-028D 8130B136
-028E 8130B137
-028F 8130B138
-0290 8130B139
-0291 8130B230
-0292 8130B231
-0293 8130B232
-0294 8130B233
-0295 8130B234
-0296 8130B235
-0297 8130B236
-0298 8130B237
-0299 8130B238
-029A 8130B239
-029B 8130B330
-029C 8130B331
-029D 8130B332
-029E 8130B333
-029F 8130B334
-02A0 8130B335
-02A1 8130B336
-02A2 8130B337
-02A3 8130B338
-02A4 8130B339
-02A5 8130B430
-02A6 8130B431
-02A7 8130B432
-02A8 8130B433
-02A9 8130B434
-02AA 8130B435
-02AB 8130B436
-02AC 8130B437
-02AD 8130B438
-02AE 8130B439
-02AF 8130B530
-02B0 8130B531
-02B1 8130B532
-02B2 8130B533
-02B3 8130B534
-02B4 8130B535
-02B5 8130B536
-02B6 8130B537
-02B7 8130B538
-02B8 8130B539
-02B9 8130B630
-02BA 8130B631
-02BB 8130B632
-02BC 8130B633
-02BD 8130B634
-02BE 8130B635
-02BF 8130B636
-02C0 8130B637
-02C1 8130B638
-02C2 8130B639
-02C3 8130B730
-02C4 8130B731
-02C5 8130B732
-02C6 8130B733
-02C7 A1A6
-02C8 8130B734
-02C9 A1A5
-02CA A840
-02CB A841
-02CC 8130B735
-02CD 8130B736
-02CE 8130B737
-02CF 8130B738
-02D0 8130B739
-02D1 8130B830
-02D2 8130B831
-02D3 8130B832
-02D4 8130B833
-02D5 8130B834
-02D6 8130B835
-02D7 8130B836
-02D8 8130B837
-02D9 A842
-02DA 8130B838
-02DB 8130B839
-02DC 8130B930
-02DD 8130B931
-02DE 8130B932
-02DF 8130B933
-02E0 8130B934
-02E1 8130B935
-02E2 8130B936
-02E3 8130B937
-02E4 8130B938
-02E5 8130B939
-02E6 8130BA30
-02E7 8130BA31
-02E8 8130BA32
-02E9 8130BA33
-02EA 8130BA34
-02EB 8130BA35
-02EC 8130BA36
-02ED 8130BA37
-02EE 8130BA38
-02EF 8130BA39
-02F0 8130BB30
-02F1 8130BB31
-02F2 8130BB32
-02F3 8130BB33
-02F4 8130BB34
-02F5 8130BB35
-02F6 8130BB36
-02F7 8130BB37
-02F8 8130BB38
-02F9 8130BB39
-02FA 8130BC30
-02FB 8130BC31
-02FC 8130BC32
-02FD 8130BC33
-02FE 8130BC34
-02FF 8130BC35
-0300 8130BC36
-0301 8130BC37
-0302 8130BC38
-0303 8130BC39
-0304 8130BD30
-0305 8130BD31
-0306 8130BD32
-0307 8130BD33
-0308 8130BD34
-0309 8130BD35
-030A 8130BD36
-030B 8130BD37
-030C 8130BD38
-030D 8130BD39
-030E 8130BE30
-030F 8130BE31
-0310 8130BE32
-0311 8130BE33
-0312 8130BE34
-0313 8130BE35
-0314 8130BE36
-0315 8130BE37
-0316 8130BE38
-0317 8130BE39
-0318 8130BF30
-0319 8130BF31
-031A 8130BF32
-031B 8130BF33
-031C 8130BF34
-031D 8130BF35
-031E 8130BF36
-031F 8130BF37
-0320 8130BF38
-0321 8130BF39
-0322 8130C030
-0323 8130C031
-0324 8130C032
-0325 8130C033
-0326 8130C034
-0327 8130C035
-0328 8130C036
-0329 8130C037
-032A 8130C038
-032B 8130C039
-032C 8130C130
-032D 8130C131
-032E 8130C132
-032F 8130C133
-0330 8130C134
-0331 8130C135
-0332 8130C136
-0333 8130C137
-0334 8130C138
-0335 8130C139
-0336 8130C230
-0337 8130C231
-0338 8130C232
-0339 8130C233
-033A 8130C234
-033B 8130C235
-033C 8130C236
-033D 8130C237
-033E 8130C238
-033F 8130C239
-0340 8130C330
-0341 8130C331
-0342 8130C332
-0343 8130C333
-0344 8130C334
-0345 8130C335
-0346 8130C336
-0347 8130C337
-0348 8130C338
-0349 8130C339
-034A 8130C430
-034B 8130C431
-034C 8130C432
-034D 8130C433
-034E 8130C434
-034F 8130C435
-0350 8130C436
-0351 8130C437
-0352 8130C438
-0353 8130C439
-0354 8130C530
-0355 8130C531
-0356 8130C532
-0357 8130C533
-0358 8130C534
-0359 8130C535
-035A 8130C536
-035B 8130C537
-035C 8130C538
-035D 8130C539
-035E 8130C630
-035F 8130C631
-0360 8130C632
-0361 8130C633
-0362 8130C634
-0363 8130C635
-0364 8130C636
-0365 8130C637
-0366 8130C638
-0367 8130C639
-0368 8130C730
-0369 8130C731
-036A 8130C732
-036B 8130C733
-036C 8130C734
-036D 8130C735
-036E 8130C736
-036F 8130C737
-0370 8130C738
-0371 8130C739
-0372 8130C830
-0373 8130C831
-0374 8130C832
-0375 8130C833
-0376 8130C834
-0377 8130C835
-0378 8130C836
-0379 8130C837
-037A 8130C838
-037B 8130C839
-037C 8130C930
-037D 8130C931
-037E 8130C932
-037F 8130C933
-0380 8130C934
-0381 8130C935
-0382 8130C936
-0383 8130C937
-0384 8130C938
-0385 8130C939
-0386 8130CA30
-0387 8130CA31
-0388 8130CA32
-0389 8130CA33
-038A 8130CA34
-038B 8130CA35
-038C 8130CA36
-038D 8130CA37
-038E 8130CA38
-038F 8130CA39
-0390 8130CB30
-0391 A6A1
-0392 A6A2
-0393 A6A3
-0394 A6A4
-0395 A6A5
-0396 A6A6
-0397 A6A7
-0398 A6A8
-0399 A6A9
-039A A6AA
-039B A6AB
-039C A6AC
-039D A6AD
-039E A6AE
-039F A6AF
-03A0 A6B0
-03A1 A6B1
-03A2 8130CB31
-03A3 A6B2
-03A4 A6B3
-03A5 A6B4
-03A6 A6B5
-03A7 A6B6
-03A8 A6B7
-03A9 A6B8
-03AA 8130CB32
-03AB 8130CB33
-03AC 8130CB34
-03AD 8130CB35
-03AE 8130CB36
-03AF 8130CB37
-03B0 8130CB38
-03B1 A6C1
-03B2 A6C2
-03B3 A6C3
-03B4 A6C4
-03B5 A6C5
-03B6 A6C6
-03B7 A6C7
-03B8 A6C8
-03B9 A6C9
-03BA A6CA
-03BB A6CB
-03BC A6CC
-03BD A6CD
-03BE A6CE
-03BF A6CF
-03C0 A6D0
-03C1 A6D1
-03C2 8130CB39
-03C3 A6D2
-03C4 A6D3
-03C5 A6D4
-03C6 A6D5
-03C7 A6D6
-03C8 A6D7
-03C9 A6D8
-03CA 8130CC30
-03CB 8130CC31
-03CC 8130CC32
-03CD 8130CC33
-03CE 8130CC34
-03CF 8130CC35
-03D0 8130CC36
-03D1 8130CC37
-03D2 8130CC38
-03D3 8130CC39
-03D4 8130CD30
-03D5 8130CD31
-03D6 8130CD32
-03D7 8130CD33
-03D8 8130CD34
-03D9 8130CD35
-03DA 8130CD36
-03DB 8130CD37
-03DC 8130CD38
-03DD 8130CD39
-03DE 8130CE30
-03DF 8130CE31
-03E0 8130CE32
-03E1 8130CE33
-03E2 8130CE34
-03E3 8130CE35
-03E4 8130CE36
-03E5 8130CE37
-03E6 8130CE38
-03E7 8130CE39
-03E8 8130CF30
-03E9 8130CF31
-03EA 8130CF32
-03EB 8130CF33
-03EC 8130CF34
-03ED 8130CF35
-03EE 8130CF36
-03EF 8130CF37
-03F0 8130CF38
-03F1 8130CF39
-03F2 8130D030
-03F3 8130D031
-03F4 8130D032
-03F5 8130D033
-03F6 8130D034
-03F7 8130D035
-03F8 8130D036
-03F9 8130D037
-03FA 8130D038
-03FB 8130D039
-03FC 8130D130
-03FD 8130D131
-03FE 8130D132
-03FF 8130D133
-0400 8130D134
-0401 A7A7
-0402 8130D135
-0403 8130D136
-0404 8130D137
-0405 8130D138
-0406 8130D139
-0407 8130D230
-0408 8130D231
-0409 8130D232
-040A 8130D233
-040B 8130D234
-040C 8130D235
-040D 8130D236
-040E 8130D237
-040F 8130D238
-0410 A7A1
-0411 A7A2
-0412 A7A3
-0413 A7A4
-0414 A7A5
-0415 A7A6
-0416 A7A8
-0417 A7A9
-0418 A7AA
-0419 A7AB
-041A A7AC
-041B A7AD
-041C A7AE
-041D A7AF
-041E A7B0
-041F A7B1
-0420 A7B2
-0421 A7B3
-0422 A7B4
-0423 A7B5
-0424 A7B6
-0425 A7B7
-0426 A7B8
-0427 A7B9
-0428 A7BA
-0429 A7BB
-042A A7BC
-042B A7BD
-042C A7BE
-042D A7BF
-042E A7C0
-042F A7C1
-0430 A7D1
-0431 A7D2
-0432 A7D3
-0433 A7D4
-0434 A7D5
-0435 A7D6
-0436 A7D8
-0437 A7D9
-0438 A7DA
-0439 A7DB
-043A A7DC
-043B A7DD
-043C A7DE
-043D A7DF
-043E A7E0
-043F A7E1
-0440 A7E2
-0441 A7E3
-0442 A7E4
-0443 A7E5
-0444 A7E6
-0445 A7E7
-0446 A7E8
-0447 A7E9
-0448 A7EA
-0449 A7EB
-044A A7EC
-044B A7ED
-044C A7EE
-044D A7EF
-044E A7F0
-044F A7F1
-0450 8130D239
-0451 A7D7
-0452 8130D330
-0453 8130D331
-0454 8130D332
-0455 8130D333
-0456 8130D334
-0457 8130D335
-0458 8130D336
-0459 8130D337
-045A 8130D338
-045B 8130D339
-045C 8130D430
-045D 8130D431
-045E 8130D432
-045F 8130D433
-0460 8130D434
-0461 8130D435
-0462 8130D436
-0463 8130D437
-0464 8130D438
-0465 8130D439
-0466 8130D530
-0467 8130D531
-0468 8130D532
-0469 8130D533
-046A 8130D534
-046B 8130D535
-046C 8130D536
-046D 8130D537
-046E 8130D538
-046F 8130D539
-0470 8130D630
-0471 8130D631
-0472 8130D632
-0473 8130D633
-0474 8130D634
-0475 8130D635
-0476 8130D636
-0477 8130D637
-0478 8130D638
-0479 8130D639
-047A 8130D730
-047B 8130D731
-047C 8130D732
-047D 8130D733
-047E 8130D734
-047F 8130D735
-0480 8130D736
-0481 8130D737
-0482 8130D738
-0483 8130D739
-0484 8130D830
-0485 8130D831
-0486 8130D832
-0487 8130D833
-0488 8130D834
-0489 8130D835
-048A 8130D836
-048B 8130D837
-048C 8130D838
-048D 8130D839
-048E 8130D930
-048F 8130D931
-0490 8130D932
-0491 8130D933
-0492 8130D934
-0493 8130D935
-0494 8130D936
-0495 8130D937
-0496 8130D938
-0497 8130D939
-0498 8130DA30
-0499 8130DA31
-049A 8130DA32
-049B 8130DA33
-049C 8130DA34
-049D 8130DA35
-049E 8130DA36
-049F 8130DA37
-04A0 8130DA38
-04A1 8130DA39
-04A2 8130DB30
-04A3 8130DB31
-04A4 8130DB32
-04A5 8130DB33
-04A6 8130DB34
-04A7 8130DB35
-04A8 8130DB36
-04A9 8130DB37
-04AA 8130DB38
-04AB 8130DB39
-04AC 8130DC30
-04AD 8130DC31
-04AE 8130DC32
-04AF 8130DC33
-04B0 8130DC34
-04B1 8130DC35
-04B2 8130DC36
-04B3 8130DC37
-04B4 8130DC38
-04B5 8130DC39
-04B6 8130DD30
-04B7 8130DD31
-04B8 8130DD32
-04B9 8130DD33
-04BA 8130DD34
-04BB 8130DD35
-04BC 8130DD36
-04BD 8130DD37
-04BE 8130DD38
-04BF 8130DD39
-04C0 8130DE30
-04C1 8130DE31
-04C2 8130DE32
-04C3 8130DE33
-04C4 8130DE34
-04C5 8130DE35
-04C6 8130DE36
-04C7 8130DE37
-04C8 8130DE38
-04C9 8130DE39
-04CA 8130DF30
-04CB 8130DF31
-04CC 8130DF32
-04CD 8130DF33
-04CE 8130DF34
-04CF 8130DF35
-04D0 8130DF36
-04D1 8130DF37
-04D2 8130DF38
-04D3 8130DF39
-04D4 8130E030
-04D5 8130E031
-04D6 8130E032
-04D7 8130E033
-04D8 8130E034
-04D9 8130E035
-04DA 8130E036
-04DB 8130E037
-04DC 8130E038
-04DD 8130E039
-04DE 8130E130
-04DF 8130E131
-04E0 8130E132
-04E1 8130E133
-04E2 8130E134
-04E3 8130E135
-04E4 8130E136
-04E5 8130E137
-04E6 8130E138
-04E7 8130E139
-04E8 8130E230
-04E9 8130E231
-04EA 8130E232
-04EB 8130E233
-04EC 8130E234
-04ED 8130E235
-04EE 8130E236
-04EF 8130E237
-04F0 8130E238
-04F1 8130E239
-04F2 8130E330
-04F3 8130E331
-04F4 8130E332
-04F5 8130E333
-04F6 8130E334
-04F7 8130E335
-04F8 8130E336
-04F9 8130E337
-04FA 8130E338
-04FB 8130E339
-04FC 8130E430
-04FD 8130E431
-04FE 8130E432
-04FF 8130E433
-0500 8130E434
-0501 8130E435
-0502 8130E436
-0503 8130E437
-0504 8130E438
-0505 8130E439
-0506 8130E530
-0507 8130E531
-0508 8130E532
-0509 8130E533
-050A 8130E534
-050B 8130E535
-050C 8130E536
-050D 8130E537
-050E 8130E538
-050F 8130E539
-0510 8130E630
-0511 8130E631
-0512 8130E632
-0513 8130E633
-0514 8130E634
-0515 8130E635
-0516 8130E636
-0517 8130E637
-0518 8130E638
-0519 8130E639
-051A 8130E730
-051B 8130E731
-051C 8130E732
-051D 8130E733
-051E 8130E734
-051F 8130E735
-0520 8130E736
-0521 8130E737
-0522 8130E738
-0523 8130E739
-0524 8130E830
-0525 8130E831
-0526 8130E832
-0527 8130E833
-0528 8130E834
-0529 8130E835
-052A 8130E836
-052B 8130E837
-052C 8130E838
-052D 8130E839
-052E 8130E930
-052F 8130E931
-0530 8130E932
-0531 8130E933
-0532 8130E934
-0533 8130E935
-0534 8130E936
-0535 8130E937
-0536 8130E938
-0537 8130E939
-0538 8130EA30
-0539 8130EA31
-053A 8130EA32
-053B 8130EA33
-053C 8130EA34
-053D 8130EA35
-053E 8130EA36
-053F 8130EA37
-0540 8130EA38
-0541 8130EA39
-0542 8130EB30
-0543 8130EB31
-0544 8130EB32
-0545 8130EB33
-0546 8130EB34
-0547 8130EB35
-0548 8130EB36
-0549 8130EB37
-054A 8130EB38
-054B 8130EB39
-054C 8130EC30
-054D 8130EC31
-054E 8130EC32
-054F 8130EC33
-0550 8130EC34
-0551 8130EC35
-0552 8130EC36
-0553 8130EC37
-0554 8130EC38
-0555 8130EC39
-0556 8130ED30
-0557 8130ED31
-0558 8130ED32
-0559 8130ED33
-055A 8130ED34
-055B 8130ED35
-055C 8130ED36
-055D 8130ED37
-055E 8130ED38
-055F 8130ED39
-0560 8130EE30
-0561 8130EE31
-0562 8130EE32
-0563 8130EE33
-0564 8130EE34
-0565 8130EE35
-0566 8130EE36
-0567 8130EE37
-0568 8130EE38
-0569 8130EE39
-056A 8130EF30
-056B 8130EF31
-056C 8130EF32
-056D 8130EF33
-056E 8130EF34
-056F 8130EF35
-0570 8130EF36
-0571 8130EF37
-0572 8130EF38
-0573 8130EF39
-0574 8130F030
-0575 8130F031
-0576 8130F032
-0577 8130F033
-0578 8130F034
-0579 8130F035
-057A 8130F036
-057B 8130F037
-057C 8130F038
-057D 8130F039
-057E 8130F130
-057F 8130F131
-0580 8130F132
-0581 8130F133
-0582 8130F134
-0583 8130F135
-0584 8130F136
-0585 8130F137
-0586 8130F138
-0587 8130F139
-0588 8130F230
-0589 8130F231
-058A 8130F232
-058B 8130F233
-058C 8130F234
-058D 8130F235
-058E 8130F236
-058F 8130F237
-0590 8130F238
-0591 8130F239
-0592 8130F330
-0593 8130F331
-0594 8130F332
-0595 8130F333
-0596 8130F334
-0597 8130F335
-0598 8130F336
-0599 8130F337
-059A 8130F338
-059B 8130F339
-059C 8130F430
-059D 8130F431
-059E 8130F432
-059F 8130F433
-05A0 8130F434
-05A1 8130F435
-05A2 8130F436
-05A3 8130F437
-05A4 8130F438
-05A5 8130F439
-05A6 8130F530
-05A7 8130F531
-05A8 8130F532
-05A9 8130F533
-05AA 8130F534
-05AB 8130F535
-05AC 8130F536
-05AD 8130F537
-05AE 8130F538
-05AF 8130F539
-05B0 8130F630
-05B1 8130F631
-05B2 8130F632
-05B3 8130F633
-05B4 8130F634
-05B5 8130F635
-05B6 8130F636
-05B7 8130F637
-05B8 8130F638
-05B9 8130F639
-05BA 8130F730
-05BB 8130F731
-05BC 8130F732
-05BD 8130F733
-05BE 8130F734
-05BF 8130F735
-05C0 8130F736
-05C1 8130F737
-05C2 8130F738
-05C3 8130F739
-05C4 8130F830
-05C5 8130F831
-05C6 8130F832
-05C7 8130F833
-05C8 8130F834
-05C9 8130F835
-05CA 8130F836
-05CB 8130F837
-05CC 8130F838
-05CD 8130F839
-05CE 8130F930
-05CF 8130F931
-05D0 8130F932
-05D1 8130F933
-05D2 8130F934
-05D3 8130F935
-05D4 8130F936
-05D5 8130F937
-05D6 8130F938
-05D7 8130F939
-05D8 8130FA30
-05D9 8130FA31
-05DA 8130FA32
-05DB 8130FA33
-05DC 8130FA34
-05DD 8130FA35
-05DE 8130FA36
-05DF 8130FA37
-05E0 8130FA38
-05E1 8130FA39
-05E2 8130FB30
-05E3 8130FB31
-05E4 8130FB32
-05E5 8130FB33
-05E6 8130FB34
-05E7 8130FB35
-05E8 8130FB36
-05E9 8130FB37
-05EA 8130FB38
-05EB 8130FB39
-05EC 8130FC30
-05ED 8130FC31
-05EE 8130FC32
-05EF 8130FC33
-05F0 8130FC34
-05F1 8130FC35
-05F2 8130FC36
-05F3 8130FC37
-05F4 8130FC38
-05F5 8130FC39
-05F6 8130FD30
-05F7 8130FD31
-05F8 8130FD32
-05F9 8130FD33
-05FA 8130FD34
-05FB 8130FD35
-05FC 8130FD36
-05FD 8130FD37
-05FE 8130FD38
-05FF 8130FD39
-0600 8130FE30
-0601 8130FE31
-0602 8130FE32
-0603 8130FE33
-0604 8130FE34
-0605 8130FE35
-0606 8130FE36
-0607 8130FE37
-0608 8130FE38
-0609 8130FE39
-060A 81318130
-060B 81318131
-060C 81318132
-060D 81318133
-060E 81318134
-060F 81318135
-0610 81318136
-0611 81318137
-0612 81318138
-0613 81318139
-0614 81318230
-0615 81318231
-0616 81318232
-0617 81318233
-0618 81318234
-0619 81318235
-061A 81318236
-061B 81318237
-061C 81318238
-061D 81318239
-061E 81318330
-061F 81318331
-0620 81318332
-0621 81318333
-0622 81318334
-0623 81318335
-0624 81318336
-0625 81318337
-0626 81318338
-0627 81318339
-0628 81318430
-0629 81318431
-062A 81318432
-062B 81318433
-062C 81318434
-062D 81318435
-062E 81318436
-062F 81318437
-0630 81318438
-0631 81318439
-0632 81318530
-0633 81318531
-0634 81318532
-0635 81318533
-0636 81318534
-0637 81318535
-0638 81318536
-0639 81318537
-063A 81318538
-063B 81318539
-063C 81318630
-063D 81318631
-063E 81318632
-063F 81318633
-0640 81318634
-0641 81318635
-0642 81318636
-0643 81318637
-0644 81318638
-0645 81318639
-0646 81318730
-0647 81318731
-0648 81318732
-0649 81318733
-064A 81318734
-064B 81318735
-064C 81318736
-064D 81318737
-064E 81318738
-064F 81318739
-0650 81318830
-0651 81318831
-0652 81318832
-0653 81318833
-0654 81318834
-0655 81318835
-0656 81318836
-0657 81318837
-0658 81318838
-0659 81318839
-065A 81318930
-065B 81318931
-065C 81318932
-065D 81318933
-065E 81318934
-065F 81318935
-0660 81318936
-0661 81318937
-0662 81318938
-0663 81318939
-0664 81318A30
-0665 81318A31
-0666 81318A32
-0667 81318A33
-0668 81318A34
-0669 81318A35
-066A 81318A36
-066B 81318A37
-066C 81318A38
-066D 81318A39
-066E 81318B30
-066F 81318B31
-0670 81318B32
-0671 81318B33
-0672 81318B34
-0673 81318B35
-0674 81318B36
-0675 81318B37
-0676 81318B38
-0677 81318B39
-0678 81318C30
-0679 81318C31
-067A 81318C32
-067B 81318C33
-067C 81318C34
-067D 81318C35
-067E 81318C36
-067F 81318C37
-0680 81318C38
-0681 81318C39
-0682 81318D30
-0683 81318D31
-0684 81318D32
-0685 81318D33
-0686 81318D34
-0687 81318D35
-0688 81318D36
-0689 81318D37
-068A 81318D38
-068B 81318D39
-068C 81318E30
-068D 81318E31
-068E 81318E32
-068F 81318E33
-0690 81318E34
-0691 81318E35
-0692 81318E36
-0693 81318E37
-0694 81318E38
-0695 81318E39
-0696 81318F30
-0697 81318F31
-0698 81318F32
-0699 81318F33
-069A 81318F34
-069B 81318F35
-069C 81318F36
-069D 81318F37
-069E 81318F38
-069F 81318F39
-06A0 81319030
-06A1 81319031
-06A2 81319032
-06A3 81319033
-06A4 81319034
-06A5 81319035
-06A6 81319036
-06A7 81319037
-06A8 81319038
-06A9 81319039
-06AA 81319130
-06AB 81319131
-06AC 81319132
-06AD 81319133
-06AE 81319134
-06AF 81319135
-06B0 81319136
-06B1 81319137
-06B2 81319138
-06B3 81319139
-06B4 81319230
-06B5 81319231
-06B6 81319232
-06B7 81319233
-06B8 81319234
-06B9 81319235
-06BA 81319236
-06BB 81319237
-06BC 81319238
-06BD 81319239
-06BE 81319330
-06BF 81319331
-06C0 81319332
-06C1 81319333
-06C2 81319334
-06C3 81319335
-06C4 81319336
-06C5 81319337
-06C6 81319338
-06C7 81319339
-06C8 81319430
-06C9 81319431
-06CA 81319432
-06CB 81319433
-06CC 81319434
-06CD 81319435
-06CE 81319436
-06CF 81319437
-06D0 81319438
-06D1 81319439
-06D2 81319530
-06D3 81319531
-06D4 81319532
-06D5 81319533
-06D6 81319534
-06D7 81319535
-06D8 81319536
-06D9 81319537
-06DA 81319538
-06DB 81319539
-06DC 81319630
-06DD 81319631
-06DE 81319632
-06DF 81319633
-06E0 81319634
-06E1 81319635
-06E2 81319636
-06E3 81319637
-06E4 81319638
-06E5 81319639
-06E6 81319730
-06E7 81319731
-06E8 81319732
-06E9 81319733
-06EA 81319734
-06EB 81319735
-06EC 81319736
-06ED 81319737
-06EE 81319738
-06EF 81319739
-06F0 81319830
-06F1 81319831
-06F2 81319832
-06F3 81319833
-06F4 81319834
-06F5 81319835
-06F6 81319836
-06F7 81319837
-06F8 81319838
-06F9 81319839
-06FA 81319930
-06FB 81319931
-06FC 81319932
-06FD 81319933
-06FE 81319934
-06FF 81319935
-0700 81319936
-0701 81319937
-0702 81319938
-0703 81319939
-0704 81319A30
-0705 81319A31
-0706 81319A32
-0707 81319A33
-0708 81319A34
-0709 81319A35
-070A 81319A36
-070B 81319A37
-070C 81319A38
-070D 81319A39
-070E 81319B30
-070F 81319B31
-0710 81319B32
-0711 81319B33
-0712 81319B34
-0713 81319B35
-0714 81319B36
-0715 81319B37
-0716 81319B38
-0717 81319B39
-0718 81319C30
-0719 81319C31
-071A 81319C32
-071B 81319C33
-071C 81319C34
-071D 81319C35
-071E 81319C36
-071F 81319C37
-0720 81319C38
-0721 81319C39
-0722 81319D30
-0723 81319D31
-0724 81319D32
-0725 81319D33
-0726 81319D34
-0727 81319D35
-0728 81319D36
-0729 81319D37
-072A 81319D38
-072B 81319D39
-072C 81319E30
-072D 81319E31
-072E 81319E32
-072F 81319E33
-0730 81319E34
-0731 81319E35
-0732 81319E36
-0733 81319E37
-0734 81319E38
-0735 81319E39
-0736 81319F30
-0737 81319F31
-0738 81319F32
-0739 81319F33
-073A 81319F34
-073B 81319F35
-073C 81319F36
-073D 81319F37
-073E 81319F38
-073F 81319F39
-0740 8131A030
-0741 8131A031
-0742 8131A032
-0743 8131A033
-0744 8131A034
-0745 8131A035
-0746 8131A036
-0747 8131A037
-0748 8131A038
-0749 8131A039
-074A 8131A130
-074B 8131A131
-074C 8131A132
-074D 8131A133
-074E 8131A134
-074F 8131A135
-0750 8131A136
-0751 8131A137
-0752 8131A138
-0753 8131A139
-0754 8131A230
-0755 8131A231
-0756 8131A232
-0757 8131A233
-0758 8131A234
-0759 8131A235
-075A 8131A236
-075B 8131A237
-075C 8131A238
-075D 8131A239
-075E 8131A330
-075F 8131A331
-0760 8131A332
-0761 8131A333
-0762 8131A334
-0763 8131A335
-0764 8131A336
-0765 8131A337
-0766 8131A338
-0767 8131A339
-0768 8131A430
-0769 8131A431
-076A 8131A432
-076B 8131A433
-076C 8131A434
-076D 8131A435
-076E 8131A436
-076F 8131A437
-0770 8131A438
-0771 8131A439
-0772 8131A530
-0773 8131A531
-0774 8131A532
-0775 8131A533
-0776 8131A534
-0777 8131A535
-0778 8131A536
-0779 8131A537
-077A 8131A538
-077B 8131A539
-077C 8131A630
-077D 8131A631
-077E 8131A632
-077F 8131A633
-0780 8131A634
-0781 8131A635
-0782 8131A636
-0783 8131A637
-0784 8131A638
-0785 8131A639
-0786 8131A730
-0787 8131A731
-0788 8131A732
-0789 8131A733
-078A 8131A734
-078B 8131A735
-078C 8131A736
-078D 8131A737
-078E 8131A738
-078F 8131A739
-0790 8131A830
-0791 8131A831
-0792 8131A832
-0793 8131A833
-0794 8131A834
-0795 8131A835
-0796 8131A836
-0797 8131A837
-0798 8131A838
-0799 8131A839
-079A 8131A930
-079B 8131A931
-079C 8131A932
-079D 8131A933
-079E 8131A934
-079F 8131A935
-07A0 8131A936
-07A1 8131A937
-07A2 8131A938
-07A3 8131A939
-07A4 8131AA30
-07A5 8131AA31
-07A6 8131AA32
-07A7 8131AA33
-07A8 8131AA34
-07A9 8131AA35
-07AA 8131AA36
-07AB 8131AA37
-07AC 8131AA38
-07AD 8131AA39
-07AE 8131AB30
-07AF 8131AB31
-07B0 8131AB32
-07B1 8131AB33
-07B2 8131AB34
-07B3 8131AB35
-07B4 8131AB36
-07B5 8131AB37
-07B6 8131AB38
-07B7 8131AB39
-07B8 8131AC30
-07B9 8131AC31
-07BA 8131AC32
-07BB 8131AC33
-07BC 8131AC34
-07BD 8131AC35
-07BE 8131AC36
-07BF 8131AC37
-07C0 8131AC38
-07C1 8131AC39
-07C2 8131AD30
-07C3 8131AD31
-07C4 8131AD32
-07C5 8131AD33
-07C6 8131AD34
-07C7 8131AD35
-07C8 8131AD36
-07C9 8131AD37
-07CA 8131AD38
-07CB 8131AD39
-07CC 8131AE30
-07CD 8131AE31
-07CE 8131AE32
-07CF 8131AE33
-07D0 8131AE34
-07D1 8131AE35
-07D2 8131AE36
-07D3 8131AE37
-07D4 8131AE38
-07D5 8131AE39
-07D6 8131AF30
-07D7 8131AF31
-07D8 8131AF32
-07D9 8131AF33
-07DA 8131AF34
-07DB 8131AF35
-07DC 8131AF36
-07DD 8131AF37
-07DE 8131AF38
-07DF 8131AF39
-07E0 8131B030
-07E1 8131B031
-07E2 8131B032
-07E3 8131B033
-07E4 8131B034
-07E5 8131B035
-07E6 8131B036
-07E7 8131B037
-07E8 8131B038
-07E9 8131B039
-07EA 8131B130
-07EB 8131B131
-07EC 8131B132
-07ED 8131B133
-07EE 8131B134
-07EF 8131B135
-07F0 8131B136
-07F1 8131B137
-07F2 8131B138
-07F3 8131B139
-07F4 8131B230
-07F5 8131B231
-07F6 8131B232
-07F7 8131B233
-07F8 8131B234
-07F9 8131B235
-07FA 8131B236
-07FB 8131B237
-07FC 8131B238
-07FD 8131B239
-07FE 8131B330
-07FF 8131B331
-0800 8131B332
-0801 8131B333
-0802 8131B334
-0803 8131B335
-0804 8131B336
-0805 8131B337
-0806 8131B338
-0807 8131B339
-0808 8131B430
-0809 8131B431
-080A 8131B432
-080B 8131B433
-080C 8131B434
-080D 8131B435
-080E 8131B436
-080F 8131B437
-0810 8131B438
-0811 8131B439
-0812 8131B530
-0813 8131B531
-0814 8131B532
-0815 8131B533
-0816 8131B534
-0817 8131B535
-0818 8131B536
-0819 8131B537
-081A 8131B538
-081B 8131B539
-081C 8131B630
-081D 8131B631
-081E 8131B632
-081F 8131B633
-0820 8131B634
-0821 8131B635
-0822 8131B636
-0823 8131B637
-0824 8131B638
-0825 8131B639
-0826 8131B730
-0827 8131B731
-0828 8131B732
-0829 8131B733
-082A 8131B734
-082B 8131B735
-082C 8131B736
-082D 8131B737
-082E 8131B738
-082F 8131B739
-0830 8131B830
-0831 8131B831
-0832 8131B832
-0833 8131B833
-0834 8131B834
-0835 8131B835
-0836 8131B836
-0837 8131B837
-0838 8131B838
-0839 8131B839
-083A 8131B930
-083B 8131B931
-083C 8131B932
-083D 8131B933
-083E 8131B934
-083F 8131B935
-0840 8131B936
-0841 8131B937
-0842 8131B938
-0843 8131B939
-0844 8131BA30
-0845 8131BA31
-0846 8131BA32
-0847 8131BA33
-0848 8131BA34
-0849 8131BA35
-084A 8131BA36
-084B 8131BA37
-084C 8131BA38
-084D 8131BA39
-084E 8131BB30
-084F 8131BB31
-0850 8131BB32
-0851 8131BB33
-0852 8131BB34
-0853 8131BB35
-0854 8131BB36
-0855 8131BB37
-0856 8131BB38
-0857 8131BB39
-0858 8131BC30
-0859 8131BC31
-085A 8131BC32
-085B 8131BC33
-085C 8131BC34
-085D 8131BC35
-085E 8131BC36
-085F 8131BC37
-0860 8131BC38
-0861 8131BC39
-0862 8131BD30
-0863 8131BD31
-0864 8131BD32
-0865 8131BD33
-0866 8131BD34
-0867 8131BD35
-0868 8131BD36
-0869 8131BD37
-086A 8131BD38
-086B 8131BD39
-086C 8131BE30
-086D 8131BE31
-086E 8131BE32
-086F 8131BE33
-0870 8131BE34
-0871 8131BE35
-0872 8131BE36
-0873 8131BE37
-0874 8131BE38
-0875 8131BE39
-0876 8131BF30
-0877 8131BF31
-0878 8131BF32
-0879 8131BF33
-087A 8131BF34
-087B 8131BF35
-087C 8131BF36
-087D 8131BF37
-087E 8131BF38
-087F 8131BF39
-0880 8131C030
-0881 8131C031
-0882 8131C032
-0883 8131C033
-0884 8131C034
-0885 8131C035
-0886 8131C036
-0887 8131C037
-0888 8131C038
-0889 8131C039
-088A 8131C130
-088B 8131C131
-088C 8131C132
-088D 8131C133
-088E 8131C134
-088F 8131C135
-0890 8131C136
-0891 8131C137
-0892 8131C138
-0893 8131C139
-0894 8131C230
-0895 8131C231
-0896 8131C232
-0897 8131C233
-0898 8131C234
-0899 8131C235
-089A 8131C236
-089B 8131C237
-089C 8131C238
-089D 8131C239
-089E 8131C330
-089F 8131C331
-08A0 8131C332
-08A1 8131C333
-08A2 8131C334
-08A3 8131C335
-08A4 8131C336
-08A5 8131C337
-08A6 8131C338
-08A7 8131C339
-08A8 8131C430
-08A9 8131C431
-08AA 8131C432
-08AB 8131C433
-08AC 8131C434
-08AD 8131C435
-08AE 8131C436
-08AF 8131C437
-08B0 8131C438
-08B1 8131C439
-08B2 8131C530
-08B3 8131C531
-08B4 8131C532
-08B5 8131C533
-08B6 8131C534
-08B7 8131C535
-08B8 8131C536
-08B9 8131C537
-08BA 8131C538
-08BB 8131C539
-08BC 8131C630
-08BD 8131C631
-08BE 8131C632
-08BF 8131C633
-08C0 8131C634
-08C1 8131C635
-08C2 8131C636
-08C3 8131C637
-08C4 8131C638
-08C5 8131C639
-08C6 8131C730
-08C7 8131C731
-08C8 8131C732
-08C9 8131C733
-08CA 8131C734
-08CB 8131C735
-08CC 8131C736
-08CD 8131C737
-08CE 8131C738
-08CF 8131C739
-08D0 8131C830
-08D1 8131C831
-08D2 8131C832
-08D3 8131C833
-08D4 8131C834
-08D5 8131C835
-08D6 8131C836
-08D7 8131C837
-08D8 8131C838
-08D9 8131C839
-08DA 8131C930
-08DB 8131C931
-08DC 8131C932
-08DD 8131C933
-08DE 8131C934
-08DF 8131C935
-08E0 8131C936
-08E1 8131C937
-08E2 8131C938
-08E3 8131C939
-08E4 8131CA30
-08E5 8131CA31
-08E6 8131CA32
-08E7 8131CA33
-08E8 8131CA34
-08E9 8131CA35
-08EA 8131CA36
-08EB 8131CA37
-08EC 8131CA38
-08ED 8131CA39
-08EE 8131CB30
-08EF 8131CB31
-08F0 8131CB32
-08F1 8131CB33
-08F2 8131CB34
-08F3 8131CB35
-08F4 8131CB36
-08F5 8131CB37
-08F6 8131CB38
-08F7 8131CB39
-08F8 8131CC30
-08F9 8131CC31
-08FA 8131CC32
-08FB 8131CC33
-08FC 8131CC34
-08FD 8131CC35
-08FE 8131CC36
-08FF 8131CC37
-0900 8131CC38
-0901 8131CC39
-0902 8131CD30
-0903 8131CD31
-0904 8131CD32
-0905 8131CD33
-0906 8131CD34
-0907 8131CD35
-0908 8131CD36
-0909 8131CD37
-090A 8131CD38
-090B 8131CD39
-090C 8131CE30
-090D 8131CE31
-090E 8131CE32
-090F 8131CE33
-0910 8131CE34
-0911 8131CE35
-0912 8131CE36
-0913 8131CE37
-0914 8131CE38
-0915 8131CE39
-0916 8131CF30
-0917 8131CF31
-0918 8131CF32
-0919 8131CF33
-091A 8131CF34
-091B 8131CF35
-091C 8131CF36
-091D 8131CF37
-091E 8131CF38
-091F 8131CF39
-0920 8131D030
-0921 8131D031
-0922 8131D032
-0923 8131D033
-0924 8131D034
-0925 8131D035
-0926 8131D036
-0927 8131D037
-0928 8131D038
-0929 8131D039
-092A 8131D130
-092B 8131D131
-092C 8131D132
-092D 8131D133
-092E 8131D134
-092F 8131D135
-0930 8131D136
-0931 8131D137
-0932 8131D138
-0933 8131D139
-0934 8131D230
-0935 8131D231
-0936 8131D232
-0937 8131D233
-0938 8131D234
-0939 8131D235
-093A 8131D236
-093B 8131D237
-093C 8131D238
-093D 8131D239
-093E 8131D330
-093F 8131D331
-0940 8131D332
-0941 8131D333
-0942 8131D334
-0943 8131D335
-0944 8131D336
-0945 8131D337
-0946 8131D338
-0947 8131D339
-0948 8131D430
-0949 8131D431
-094A 8131D432
-094B 8131D433
-094C 8131D434
-094D 8131D435
-094E 8131D436
-094F 8131D437
-0950 8131D438
-0951 8131D439
-0952 8131D530
-0953 8131D531
-0954 8131D532
-0955 8131D533
-0956 8131D534
-0957 8131D535
-0958 8131D536
-0959 8131D537
-095A 8131D538
-095B 8131D539
-095C 8131D630
-095D 8131D631
-095E 8131D632
-095F 8131D633
-0960 8131D634
-0961 8131D635
-0962 8131D636
-0963 8131D637
-0964 8131D638
-0965 8131D639
-0966 8131D730
-0967 8131D731
-0968 8131D732
-0969 8131D733
-096A 8131D734
-096B 8131D735
-096C 8131D736
-096D 8131D737
-096E 8131D738
-096F 8131D739
-0970 8131D830
-0971 8131D831
-0972 8131D832
-0973 8131D833
-0974 8131D834
-0975 8131D835
-0976 8131D836
-0977 8131D837
-0978 8131D838
-0979 8131D839
-097A 8131D930
-097B 8131D931
-097C 8131D932
-097D 8131D933
-097E 8131D934
-097F 8131D935
-0980 8131D936
-0981 8131D937
-0982 8131D938
-0983 8131D939
-0984 8131DA30
-0985 8131DA31
-0986 8131DA32
-0987 8131DA33
-0988 8131DA34
-0989 8131DA35
-098A 8131DA36
-098B 8131DA37
-098C 8131DA38
-098D 8131DA39
-098E 8131DB30
-098F 8131DB31
-0990 8131DB32
-0991 8131DB33
-0992 8131DB34
-0993 8131DB35
-0994 8131DB36
-0995 8131DB37
-0996 8131DB38
-0997 8131DB39
-0998 8131DC30
-0999 8131DC31
-099A 8131DC32
-099B 8131DC33
-099C 8131DC34
-099D 8131DC35
-099E 8131DC36
-099F 8131DC37
-09A0 8131DC38
-09A1 8131DC39
-09A2 8131DD30
-09A3 8131DD31
-09A4 8131DD32
-09A5 8131DD33
-09A6 8131DD34
-09A7 8131DD35
-09A8 8131DD36
-09A9 8131DD37
-09AA 8131DD38
-09AB 8131DD39
-09AC 8131DE30
-09AD 8131DE31
-09AE 8131DE32
-09AF 8131DE33
-09B0 8131DE34
-09B1 8131DE35
-09B2 8131DE36
-09B3 8131DE37
-09B4 8131DE38
-09B5 8131DE39
-09B6 8131DF30
-09B7 8131DF31
-09B8 8131DF32
-09B9 8131DF33
-09BA 8131DF34
-09BB 8131DF35
-09BC 8131DF36
-09BD 8131DF37
-09BE 8131DF38
-09BF 8131DF39
-09C0 8131E030
-09C1 8131E031
-09C2 8131E032
-09C3 8131E033
-09C4 8131E034
-09C5 8131E035
-09C6 8131E036
-09C7 8131E037
-09C8 8131E038
-09C9 8131E039
-09CA 8131E130
-09CB 8131E131
-09CC 8131E132
-09CD 8131E133
-09CE 8131E134
-09CF 8131E135
-09D0 8131E136
-09D1 8131E137
-09D2 8131E138
-09D3 8131E139
-09D4 8131E230
-09D5 8131E231
-09D6 8131E232
-09D7 8131E233
-09D8 8131E234
-09D9 8131E235
-09DA 8131E236
-09DB 8131E237
-09DC 8131E238
-09DD 8131E239
-09DE 8131E330
-09DF 8131E331
-09E0 8131E332
-09E1 8131E333
-09E2 8131E334
-09E3 8131E335
-09E4 8131E336
-09E5 8131E337
-09E6 8131E338
-09E7 8131E339
-09E8 8131E430
-09E9 8131E431
-09EA 8131E432
-09EB 8131E433
-09EC 8131E434
-09ED 8131E435
-09EE 8131E436
-09EF 8131E437
-09F0 8131E438
-09F1 8131E439
-09F2 8131E530
-09F3 8131E531
-09F4 8131E532
-09F5 8131E533
-09F6 8131E534
-09F7 8131E535
-09F8 8131E536
-09F9 8131E537
-09FA 8131E538
-09FB 8131E539
-09FC 8131E630
-09FD 8131E631
-09FE 8131E632
-09FF 8131E633
-0A00 8131E634
-0A01 8131E635
-0A02 8131E636
-0A03 8131E637
-0A04 8131E638
-0A05 8131E639
-0A06 8131E730
-0A07 8131E731
-0A08 8131E732
-0A09 8131E733
-0A0A 8131E734
-0A0B 8131E735
-0A0C 8131E736
-0A0D 8131E737
-0A0E 8131E738
-0A0F 8131E739
-0A10 8131E830
-0A11 8131E831
-0A12 8131E832
-0A13 8131E833
-0A14 8131E834
-0A15 8131E835
-0A16 8131E836
-0A17 8131E837
-0A18 8131E838
-0A19 8131E839
-0A1A 8131E930
-0A1B 8131E931
-0A1C 8131E932
-0A1D 8131E933
-0A1E 8131E934
-0A1F 8131E935
-0A20 8131E936
-0A21 8131E937
-0A22 8131E938
-0A23 8131E939
-0A24 8131EA30
-0A25 8131EA31
-0A26 8131EA32
-0A27 8131EA33
-0A28 8131EA34
-0A29 8131EA35
-0A2A 8131EA36
-0A2B 8131EA37
-0A2C 8131EA38
-0A2D 8131EA39
-0A2E 8131EB30
-0A2F 8131EB31
-0A30 8131EB32
-0A31 8131EB33
-0A32 8131EB34
-0A33 8131EB35
-0A34 8131EB36
-0A35 8131EB37
-0A36 8131EB38
-0A37 8131EB39
-0A38 8131EC30
-0A39 8131EC31
-0A3A 8131EC32
-0A3B 8131EC33
-0A3C 8131EC34
-0A3D 8131EC35
-0A3E 8131EC36
-0A3F 8131EC37
-0A40 8131EC38
-0A41 8131EC39
-0A42 8131ED30
-0A43 8131ED31
-0A44 8131ED32
-0A45 8131ED33
-0A46 8131ED34
-0A47 8131ED35
-0A48 8131ED36
-0A49 8131ED37
-0A4A 8131ED38
-0A4B 8131ED39
-0A4C 8131EE30
-0A4D 8131EE31
-0A4E 8131EE32
-0A4F 8131EE33
-0A50 8131EE34
-0A51 8131EE35
-0A52 8131EE36
-0A53 8131EE37
-0A54 8131EE38
-0A55 8131EE39
-0A56 8131EF30
-0A57 8131EF31
-0A58 8131EF32
-0A59 8131EF33
-0A5A 8131EF34
-0A5B 8131EF35
-0A5C 8131EF36
-0A5D 8131EF37
-0A5E 8131EF38
-0A5F 8131EF39
-0A60 8131F030
-0A61 8131F031
-0A62 8131F032
-0A63 8131F033
-0A64 8131F034
-0A65 8131F035
-0A66 8131F036
-0A67 8131F037
-0A68 8131F038
-0A69 8131F039
-0A6A 8131F130
-0A6B 8131F131
-0A6C 8131F132
-0A6D 8131F133
-0A6E 8131F134
-0A6F 8131F135
-0A70 8131F136
-0A71 8131F137
-0A72 8131F138
-0A73 8131F139
-0A74 8131F230
-0A75 8131F231
-0A76 8131F232
-0A77 8131F233
-0A78 8131F234
-0A79 8131F235
-0A7A 8131F236
-0A7B 8131F237
-0A7C 8131F238
-0A7D 8131F239
-0A7E 8131F330
-0A7F 8131F331
-0A80 8131F332
-0A81 8131F333
-0A82 8131F334
-0A83 8131F335
-0A84 8131F336
-0A85 8131F337
-0A86 8131F338
-0A87 8131F339
-0A88 8131F430
-0A89 8131F431
-0A8A 8131F432
-0A8B 8131F433
-0A8C 8131F434
-0A8D 8131F435
-0A8E 8131F436
-0A8F 8131F437
-0A90 8131F438
-0A91 8131F439
-0A92 8131F530
-0A93 8131F531
-0A94 8131F532
-0A95 8131F533
-0A96 8131F534
-0A97 8131F535
-0A98 8131F536
-0A99 8131F537
-0A9A 8131F538
-0A9B 8131F539
-0A9C 8131F630
-0A9D 8131F631
-0A9E 8131F632
-0A9F 8131F633
-0AA0 8131F634
-0AA1 8131F635
-0AA2 8131F636
-0AA3 8131F637
-0AA4 8131F638
-0AA5 8131F639
-0AA6 8131F730
-0AA7 8131F731
-0AA8 8131F732
-0AA9 8131F733
-0AAA 8131F734
-0AAB 8131F735
-0AAC 8131F736
-0AAD 8131F737
-0AAE 8131F738
-0AAF 8131F739
-0AB0 8131F830
-0AB1 8131F831
-0AB2 8131F832
-0AB3 8131F833
-0AB4 8131F834
-0AB5 8131F835
-0AB6 8131F836
-0AB7 8131F837
-0AB8 8131F838
-0AB9 8131F839
-0ABA 8131F930
-0ABB 8131F931
-0ABC 8131F932
-0ABD 8131F933
-0ABE 8131F934
-0ABF 8131F935
-0AC0 8131F936
-0AC1 8131F937
-0AC2 8131F938
-0AC3 8131F939
-0AC4 8131FA30
-0AC5 8131FA31
-0AC6 8131FA32
-0AC7 8131FA33
-0AC8 8131FA34
-0AC9 8131FA35
-0ACA 8131FA36
-0ACB 8131FA37
-0ACC 8131FA38
-0ACD 8131FA39
-0ACE 8131FB30
-0ACF 8131FB31
-0AD0 8131FB32
-0AD1 8131FB33
-0AD2 8131FB34
-0AD3 8131FB35
-0AD4 8131FB36
-0AD5 8131FB37
-0AD6 8131FB38
-0AD7 8131FB39
-0AD8 8131FC30
-0AD9 8131FC31
-0ADA 8131FC32
-0ADB 8131FC33
-0ADC 8131FC34
-0ADD 8131FC35
-0ADE 8131FC36
-0ADF 8131FC37
-0AE0 8131FC38
-0AE1 8131FC39
-0AE2 8131FD30
-0AE3 8131FD31
-0AE4 8131FD32
-0AE5 8131FD33
-0AE6 8131FD34
-0AE7 8131FD35
-0AE8 8131FD36
-0AE9 8131FD37
-0AEA 8131FD38
-0AEB 8131FD39
-0AEC 8131FE30
-0AED 8131FE31
-0AEE 8131FE32
-0AEF 8131FE33
-0AF0 8131FE34
-0AF1 8131FE35
-0AF2 8131FE36
-0AF3 8131FE37
-0AF4 8131FE38
-0AF5 8131FE39
-0AF6 81328130
-0AF7 81328131
-0AF8 81328132
-0AF9 81328133
-0AFA 81328134
-0AFB 81328135
-0AFC 81328136
-0AFD 81328137
-0AFE 81328138
-0AFF 81328139
-0B00 81328230
-0B01 81328231
-0B02 81328232
-0B03 81328233
-0B04 81328234
-0B05 81328235
-0B06 81328236
-0B07 81328237
-0B08 81328238
-0B09 81328239
-0B0A 81328330
-0B0B 81328331
-0B0C 81328332
-0B0D 81328333
-0B0E 81328334
-0B0F 81328335
-0B10 81328336
-0B11 81328337
-0B12 81328338
-0B13 81328339
-0B14 81328430
-0B15 81328431
-0B16 81328432
-0B17 81328433
-0B18 81328434
-0B19 81328435
-0B1A 81328436
-0B1B 81328437
-0B1C 81328438
-0B1D 81328439
-0B1E 81328530
-0B1F 81328531
-0B20 81328532
-0B21 81328533
-0B22 81328534
-0B23 81328535
-0B24 81328536
-0B25 81328537
-0B26 81328538
-0B27 81328539
-0B28 81328630
-0B29 81328631
-0B2A 81328632
-0B2B 81328633
-0B2C 81328634
-0B2D 81328635
-0B2E 81328636
-0B2F 81328637
-0B30 81328638
-0B31 81328639
-0B32 81328730
-0B33 81328731
-0B34 81328732
-0B35 81328733
-0B36 81328734
-0B37 81328735
-0B38 81328736
-0B39 81328737
-0B3A 81328738
-0B3B 81328739
-0B3C 81328830
-0B3D 81328831
-0B3E 81328832
-0B3F 81328833
-0B40 81328834
-0B41 81328835
-0B42 81328836
-0B43 81328837
-0B44 81328838
-0B45 81328839
-0B46 81328930
-0B47 81328931
-0B48 81328932
-0B49 81328933
-0B4A 81328934
-0B4B 81328935
-0B4C 81328936
-0B4D 81328937
-0B4E 81328938
-0B4F 81328939
-0B50 81328A30
-0B51 81328A31
-0B52 81328A32
-0B53 81328A33
-0B54 81328A34
-0B55 81328A35
-0B56 81328A36
-0B57 81328A37
-0B58 81328A38
-0B59 81328A39
-0B5A 81328B30
-0B5B 81328B31
-0B5C 81328B32
-0B5D 81328B33
-0B5E 81328B34
-0B5F 81328B35
-0B60 81328B36
-0B61 81328B37
-0B62 81328B38
-0B63 81328B39
-0B64 81328C30
-0B65 81328C31
-0B66 81328C32
-0B67 81328C33
-0B68 81328C34
-0B69 81328C35
-0B6A 81328C36
-0B6B 81328C37
-0B6C 81328C38
-0B6D 81328C39
-0B6E 81328D30
-0B6F 81328D31
-0B70 81328D32
-0B71 81328D33
-0B72 81328D34
-0B73 81328D35
-0B74 81328D36
-0B75 81328D37
-0B76 81328D38
-0B77 81328D39
-0B78 81328E30
-0B79 81328E31
-0B7A 81328E32
-0B7B 81328E33
-0B7C 81328E34
-0B7D 81328E35
-0B7E 81328E36
-0B7F 81328E37
-0B80 81328E38
-0B81 81328E39
-0B82 81328F30
-0B83 81328F31
-0B84 81328F32
-0B85 81328F33
-0B86 81328F34
-0B87 81328F35
-0B88 81328F36
-0B89 81328F37
-0B8A 81328F38
-0B8B 81328F39
-0B8C 81329030
-0B8D 81329031
-0B8E 81329032
-0B8F 81329033
-0B90 81329034
-0B91 81329035
-0B92 81329036
-0B93 81329037
-0B94 81329038
-0B95 81329039
-0B96 81329130
-0B97 81329131
-0B98 81329132
-0B99 81329133
-0B9A 81329134
-0B9B 81329135
-0B9C 81329136
-0B9D 81329137
-0B9E 81329138
-0B9F 81329139
-0BA0 81329230
-0BA1 81329231
-0BA2 81329232
-0BA3 81329233
-0BA4 81329234
-0BA5 81329235
-0BA6 81329236
-0BA7 81329237
-0BA8 81329238
-0BA9 81329239
-0BAA 81329330
-0BAB 81329331
-0BAC 81329332
-0BAD 81329333
-0BAE 81329334
-0BAF 81329335
-0BB0 81329336
-0BB1 81329337
-0BB2 81329338
-0BB3 81329339
-0BB4 81329430
-0BB5 81329431
-0BB6 81329432
-0BB7 81329433
-0BB8 81329434
-0BB9 81329435
-0BBA 81329436
-0BBB 81329437
-0BBC 81329438
-0BBD 81329439
-0BBE 81329530
-0BBF 81329531
-0BC0 81329532
-0BC1 81329533
-0BC2 81329534
-0BC3 81329535
-0BC4 81329536
-0BC5 81329537
-0BC6 81329538
-0BC7 81329539
-0BC8 81329630
-0BC9 81329631
-0BCA 81329632
-0BCB 81329633
-0BCC 81329634
-0BCD 81329635
-0BCE 81329636
-0BCF 81329637
-0BD0 81329638
-0BD1 81329639
-0BD2 81329730
-0BD3 81329731
-0BD4 81329732
-0BD5 81329733
-0BD6 81329734
-0BD7 81329735
-0BD8 81329736
-0BD9 81329737
-0BDA 81329738
-0BDB 81329739
-0BDC 81329830
-0BDD 81329831
-0BDE 81329832
-0BDF 81329833
-0BE0 81329834
-0BE1 81329835
-0BE2 81329836
-0BE3 81329837
-0BE4 81329838
-0BE5 81329839
-0BE6 81329930
-0BE7 81329931
-0BE8 81329932
-0BE9 81329933
-0BEA 81329934
-0BEB 81329935
-0BEC 81329936
-0BED 81329937
-0BEE 81329938
-0BEF 81329939
-0BF0 81329A30
-0BF1 81329A31
-0BF2 81329A32
-0BF3 81329A33
-0BF4 81329A34
-0BF5 81329A35
-0BF6 81329A36
-0BF7 81329A37
-0BF8 81329A38
-0BF9 81329A39
-0BFA 81329B30
-0BFB 81329B31
-0BFC 81329B32
-0BFD 81329B33
-0BFE 81329B34
-0BFF 81329B35
-0C00 81329B36
-0C01 81329B37
-0C02 81329B38
-0C03 81329B39
-0C04 81329C30
-0C05 81329C31
-0C06 81329C32
-0C07 81329C33
-0C08 81329C34
-0C09 81329C35
-0C0A 81329C36
-0C0B 81329C37
-0C0C 81329C38
-0C0D 81329C39
-0C0E 81329D30
-0C0F 81329D31
-0C10 81329D32
-0C11 81329D33
-0C12 81329D34
-0C13 81329D35
-0C14 81329D36
-0C15 81329D37
-0C16 81329D38
-0C17 81329D39
-0C18 81329E30
-0C19 81329E31
-0C1A 81329E32
-0C1B 81329E33
-0C1C 81329E34
-0C1D 81329E35
-0C1E 81329E36
-0C1F 81329E37
-0C20 81329E38
-0C21 81329E39
-0C22 81329F30
-0C23 81329F31
-0C24 81329F32
-0C25 81329F33
-0C26 81329F34
-0C27 81329F35
-0C28 81329F36
-0C29 81329F37
-0C2A 81329F38
-0C2B 81329F39
-0C2C 8132A030
-0C2D 8132A031
-0C2E 8132A032
-0C2F 8132A033
-0C30 8132A034
-0C31 8132A035
-0C32 8132A036
-0C33 8132A037
-0C34 8132A038
-0C35 8132A039
-0C36 8132A130
-0C37 8132A131
-0C38 8132A132
-0C39 8132A133
-0C3A 8132A134
-0C3B 8132A135
-0C3C 8132A136
-0C3D 8132A137
-0C3E 8132A138
-0C3F 8132A139
-0C40 8132A230
-0C41 8132A231
-0C42 8132A232
-0C43 8132A233
-0C44 8132A234
-0C45 8132A235
-0C46 8132A236
-0C47 8132A237
-0C48 8132A238
-0C49 8132A239
-0C4A 8132A330
-0C4B 8132A331
-0C4C 8132A332
-0C4D 8132A333
-0C4E 8132A334
-0C4F 8132A335
-0C50 8132A336
-0C51 8132A337
-0C52 8132A338
-0C53 8132A339
-0C54 8132A430
-0C55 8132A431
-0C56 8132A432
-0C57 8132A433
-0C58 8132A434
-0C59 8132A435
-0C5A 8132A436
-0C5B 8132A437
-0C5C 8132A438
-0C5D 8132A439
-0C5E 8132A530
-0C5F 8132A531
-0C60 8132A532
-0C61 8132A533
-0C62 8132A534
-0C63 8132A535
-0C64 8132A536
-0C65 8132A537
-0C66 8132A538
-0C67 8132A539
-0C68 8132A630
-0C69 8132A631
-0C6A 8132A632
-0C6B 8132A633
-0C6C 8132A634
-0C6D 8132A635
-0C6E 8132A636
-0C6F 8132A637
-0C70 8132A638
-0C71 8132A639
-0C72 8132A730
-0C73 8132A731
-0C74 8132A732
-0C75 8132A733
-0C76 8132A734
-0C77 8132A735
-0C78 8132A736
-0C79 8132A737
-0C7A 8132A738
-0C7B 8132A739
-0C7C 8132A830
-0C7D 8132A831
-0C7E 8132A832
-0C7F 8132A833
-0C80 8132A834
-0C81 8132A835
-0C82 8132A836
-0C83 8132A837
-0C84 8132A838
-0C85 8132A839
-0C86 8132A930
-0C87 8132A931
-0C88 8132A932
-0C89 8132A933
-0C8A 8132A934
-0C8B 8132A935
-0C8C 8132A936
-0C8D 8132A937
-0C8E 8132A938
-0C8F 8132A939
-0C90 8132AA30
-0C91 8132AA31
-0C92 8132AA32
-0C93 8132AA33
-0C94 8132AA34
-0C95 8132AA35
-0C96 8132AA36
-0C97 8132AA37
-0C98 8132AA38
-0C99 8132AA39
-0C9A 8132AB30
-0C9B 8132AB31
-0C9C 8132AB32
-0C9D 8132AB33
-0C9E 8132AB34
-0C9F 8132AB35
-0CA0 8132AB36
-0CA1 8132AB37
-0CA2 8132AB38
-0CA3 8132AB39
-0CA4 8132AC30
-0CA5 8132AC31
-0CA6 8132AC32
-0CA7 8132AC33
-0CA8 8132AC34
-0CA9 8132AC35
-0CAA 8132AC36
-0CAB 8132AC37
-0CAC 8132AC38
-0CAD 8132AC39
-0CAE 8132AD30
-0CAF 8132AD31
-0CB0 8132AD32
-0CB1 8132AD33
-0CB2 8132AD34
-0CB3 8132AD35
-0CB4 8132AD36
-0CB5 8132AD37
-0CB6 8132AD38
-0CB7 8132AD39
-0CB8 8132AE30
-0CB9 8132AE31
-0CBA 8132AE32
-0CBB 8132AE33
-0CBC 8132AE34
-0CBD 8132AE35
-0CBE 8132AE36
-0CBF 8132AE37
-0CC0 8132AE38
-0CC1 8132AE39
-0CC2 8132AF30
-0CC3 8132AF31
-0CC4 8132AF32
-0CC5 8132AF33
-0CC6 8132AF34
-0CC7 8132AF35
-0CC8 8132AF36
-0CC9 8132AF37
-0CCA 8132AF38
-0CCB 8132AF39
-0CCC 8132B030
-0CCD 8132B031
-0CCE 8132B032
-0CCF 8132B033
-0CD0 8132B034
-0CD1 8132B035
-0CD2 8132B036
-0CD3 8132B037
-0CD4 8132B038
-0CD5 8132B039
-0CD6 8132B130
-0CD7 8132B131
-0CD8 8132B132
-0CD9 8132B133
-0CDA 8132B134
-0CDB 8132B135
-0CDC 8132B136
-0CDD 8132B137
-0CDE 8132B138
-0CDF 8132B139
-0CE0 8132B230
-0CE1 8132B231
-0CE2 8132B232
-0CE3 8132B233
-0CE4 8132B234
-0CE5 8132B235
-0CE6 8132B236
-0CE7 8132B237
-0CE8 8132B238
-0CE9 8132B239
-0CEA 8132B330
-0CEB 8132B331
-0CEC 8132B332
-0CED 8132B333
-0CEE 8132B334
-0CEF 8132B335
-0CF0 8132B336
-0CF1 8132B337
-0CF2 8132B338
-0CF3 8132B339
-0CF4 8132B430
-0CF5 8132B431
-0CF6 8132B432
-0CF7 8132B433
-0CF8 8132B434
-0CF9 8132B435
-0CFA 8132B436
-0CFB 8132B437
-0CFC 8132B438
-0CFD 8132B439
-0CFE 8132B530
-0CFF 8132B531
-0D00 8132B532
-0D01 8132B533
-0D02 8132B534
-0D03 8132B535
-0D04 8132B536
-0D05 8132B537
-0D06 8132B538
-0D07 8132B539
-0D08 8132B630
-0D09 8132B631
-0D0A 8132B632
-0D0B 8132B633
-0D0C 8132B634
-0D0D 8132B635
-0D0E 8132B636
-0D0F 8132B637
-0D10 8132B638
-0D11 8132B639
-0D12 8132B730
-0D13 8132B731
-0D14 8132B732
-0D15 8132B733
-0D16 8132B734
-0D17 8132B735
-0D18 8132B736
-0D19 8132B737
-0D1A 8132B738
-0D1B 8132B739
-0D1C 8132B830
-0D1D 8132B831
-0D1E 8132B832
-0D1F 8132B833
-0D20 8132B834
-0D21 8132B835
-0D22 8132B836
-0D23 8132B837
-0D24 8132B838
-0D25 8132B839
-0D26 8132B930
-0D27 8132B931
-0D28 8132B932
-0D29 8132B933
-0D2A 8132B934
-0D2B 8132B935
-0D2C 8132B936
-0D2D 8132B937
-0D2E 8132B938
-0D2F 8132B939
-0D30 8132BA30
-0D31 8132BA31
-0D32 8132BA32
-0D33 8132BA33
-0D34 8132BA34
-0D35 8132BA35
-0D36 8132BA36
-0D37 8132BA37
-0D38 8132BA38
-0D39 8132BA39
-0D3A 8132BB30
-0D3B 8132BB31
-0D3C 8132BB32
-0D3D 8132BB33
-0D3E 8132BB34
-0D3F 8132BB35
-0D40 8132BB36
-0D41 8132BB37
-0D42 8132BB38
-0D43 8132BB39
-0D44 8132BC30
-0D45 8132BC31
-0D46 8132BC32
-0D47 8132BC33
-0D48 8132BC34
-0D49 8132BC35
-0D4A 8132BC36
-0D4B 8132BC37
-0D4C 8132BC38
-0D4D 8132BC39
-0D4E 8132BD30
-0D4F 8132BD31
-0D50 8132BD32
-0D51 8132BD33
-0D52 8132BD34
-0D53 8132BD35
-0D54 8132BD36
-0D55 8132BD37
-0D56 8132BD38
-0D57 8132BD39
-0D58 8132BE30
-0D59 8132BE31
-0D5A 8132BE32
-0D5B 8132BE33
-0D5C 8132BE34
-0D5D 8132BE35
-0D5E 8132BE36
-0D5F 8132BE37
-0D60 8132BE38
-0D61 8132BE39
-0D62 8132BF30
-0D63 8132BF31
-0D64 8132BF32
-0D65 8132BF33
-0D66 8132BF34
-0D67 8132BF35
-0D68 8132BF36
-0D69 8132BF37
-0D6A 8132BF38
-0D6B 8132BF39
-0D6C 8132C030
-0D6D 8132C031
-0D6E 8132C032
-0D6F 8132C033
-0D70 8132C034
-0D71 8132C035
-0D72 8132C036
-0D73 8132C037
-0D74 8132C038
-0D75 8132C039
-0D76 8132C130
-0D77 8132C131
-0D78 8132C132
-0D79 8132C133
-0D7A 8132C134
-0D7B 8132C135
-0D7C 8132C136
-0D7D 8132C137
-0D7E 8132C138
-0D7F 8132C139
-0D80 8132C230
-0D81 8132C231
-0D82 8132C232
-0D83 8132C233
-0D84 8132C234
-0D85 8132C235
-0D86 8132C236
-0D87 8132C237
-0D88 8132C238
-0D89 8132C239
-0D8A 8132C330
-0D8B 8132C331
-0D8C 8132C332
-0D8D 8132C333
-0D8E 8132C334
-0D8F 8132C335
-0D90 8132C336
-0D91 8132C337
-0D92 8132C338
-0D93 8132C339
-0D94 8132C430
-0D95 8132C431
-0D96 8132C432
-0D97 8132C433
-0D98 8132C434
-0D99 8132C435
-0D9A 8132C436
-0D9B 8132C437
-0D9C 8132C438
-0D9D 8132C439
-0D9E 8132C530
-0D9F 8132C531
-0DA0 8132C532
-0DA1 8132C533
-0DA2 8132C534
-0DA3 8132C535
-0DA4 8132C536
-0DA5 8132C537
-0DA6 8132C538
-0DA7 8132C539
-0DA8 8132C630
-0DA9 8132C631
-0DAA 8132C632
-0DAB 8132C633
-0DAC 8132C634
-0DAD 8132C635
-0DAE 8132C636
-0DAF 8132C637
-0DB0 8132C638
-0DB1 8132C639
-0DB2 8132C730
-0DB3 8132C731
-0DB4 8132C732
-0DB5 8132C733
-0DB6 8132C734
-0DB7 8132C735
-0DB8 8132C736
-0DB9 8132C737
-0DBA 8132C738
-0DBB 8132C739
-0DBC 8132C830
-0DBD 8132C831
-0DBE 8132C832
-0DBF 8132C833
-0DC0 8132C834
-0DC1 8132C835
-0DC2 8132C836
-0DC3 8132C837
-0DC4 8132C838
-0DC5 8132C839
-0DC6 8132C930
-0DC7 8132C931
-0DC8 8132C932
-0DC9 8132C933
-0DCA 8132C934
-0DCB 8132C935
-0DCC 8132C936
-0DCD 8132C937
-0DCE 8132C938
-0DCF 8132C939
-0DD0 8132CA30
-0DD1 8132CA31
-0DD2 8132CA32
-0DD3 8132CA33
-0DD4 8132CA34
-0DD5 8132CA35
-0DD6 8132CA36
-0DD7 8132CA37
-0DD8 8132CA38
-0DD9 8132CA39
-0DDA 8132CB30
-0DDB 8132CB31
-0DDC 8132CB32
-0DDD 8132CB33
-0DDE 8132CB34
-0DDF 8132CB35
-0DE0 8132CB36
-0DE1 8132CB37
-0DE2 8132CB38
-0DE3 8132CB39
-0DE4 8132CC30
-0DE5 8132CC31
-0DE6 8132CC32
-0DE7 8132CC33
-0DE8 8132CC34
-0DE9 8132CC35
-0DEA 8132CC36
-0DEB 8132CC37
-0DEC 8132CC38
-0DED 8132CC39
-0DEE 8132CD30
-0DEF 8132CD31
-0DF0 8132CD32
-0DF1 8132CD33
-0DF2 8132CD34
-0DF3 8132CD35
-0DF4 8132CD36
-0DF5 8132CD37
-0DF6 8132CD38
-0DF7 8132CD39
-0DF8 8132CE30
-0DF9 8132CE31
-0DFA 8132CE32
-0DFB 8132CE33
-0DFC 8132CE34
-0DFD 8132CE35
-0DFE 8132CE36
-0DFF 8132CE37
-0E00 8132CE38
-0E01 8132CE39
-0E02 8132CF30
-0E03 8132CF31
-0E04 8132CF32
-0E05 8132CF33
-0E06 8132CF34
-0E07 8132CF35
-0E08 8132CF36
-0E09 8132CF37
-0E0A 8132CF38
-0E0B 8132CF39
-0E0C 8132D030
-0E0D 8132D031
-0E0E 8132D032
-0E0F 8132D033
-0E10 8132D034
-0E11 8132D035
-0E12 8132D036
-0E13 8132D037
-0E14 8132D038
-0E15 8132D039
-0E16 8132D130
-0E17 8132D131
-0E18 8132D132
-0E19 8132D133
-0E1A 8132D134
-0E1B 8132D135
-0E1C 8132D136
-0E1D 8132D137
-0E1E 8132D138
-0E1F 8132D139
-0E20 8132D230
-0E21 8132D231
-0E22 8132D232
-0E23 8132D233
-0E24 8132D234
-0E25 8132D235
-0E26 8132D236
-0E27 8132D237
-0E28 8132D238
-0E29 8132D239
-0E2A 8132D330
-0E2B 8132D331
-0E2C 8132D332
-0E2D 8132D333
-0E2E 8132D334
-0E2F 8132D335
-0E30 8132D336
-0E31 8132D337
-0E32 8132D338
-0E33 8132D339
-0E34 8132D430
-0E35 8132D431
-0E36 8132D432
-0E37 8132D433
-0E38 8132D434
-0E39 8132D435
-0E3A 8132D436
-0E3B 8132D437
-0E3C 8132D438
-0E3D 8132D439
-0E3E 8132D530
-0E3F 8132D531
-0E40 8132D532
-0E41 8132D533
-0E42 8132D534
-0E43 8132D535
-0E44 8132D536
-0E45 8132D537
-0E46 8132D538
-0E47 8132D539
-0E48 8132D630
-0E49 8132D631
-0E4A 8132D632
-0E4B 8132D633
-0E4C 8132D634
-0E4D 8132D635
-0E4E 8132D636
-0E4F 8132D637
-0E50 8132D638
-0E51 8132D639
-0E52 8132D730
-0E53 8132D731
-0E54 8132D732
-0E55 8132D733
-0E56 8132D734
-0E57 8132D735
-0E58 8132D736
-0E59 8132D737
-0E5A 8132D738
-0E5B 8132D739
-0E5C 8132D830
-0E5D 8132D831
-0E5E 8132D832
-0E5F 8132D833
-0E60 8132D834
-0E61 8132D835
-0E62 8132D836
-0E63 8132D837
-0E64 8132D838
-0E65 8132D839
-0E66 8132D930
-0E67 8132D931
-0E68 8132D932
-0E69 8132D933
-0E6A 8132D934
-0E6B 8132D935
-0E6C 8132D936
-0E6D 8132D937
-0E6E 8132D938
-0E6F 8132D939
-0E70 8132DA30
-0E71 8132DA31
-0E72 8132DA32
-0E73 8132DA33
-0E74 8132DA34
-0E75 8132DA35
-0E76 8132DA36
-0E77 8132DA37
-0E78 8132DA38
-0E79 8132DA39
-0E7A 8132DB30
-0E7B 8132DB31
-0E7C 8132DB32
-0E7D 8132DB33
-0E7E 8132DB34
-0E7F 8132DB35
-0E80 8132DB36
-0E81 8132DB37
-0E82 8132DB38
-0E83 8132DB39
-0E84 8132DC30
-0E85 8132DC31
-0E86 8132DC32
-0E87 8132DC33
-0E88 8132DC34
-0E89 8132DC35
-0E8A 8132DC36
-0E8B 8132DC37
-0E8C 8132DC38
-0E8D 8132DC39
-0E8E 8132DD30
-0E8F 8132DD31
-0E90 8132DD32
-0E91 8132DD33
-0E92 8132DD34
-0E93 8132DD35
-0E94 8132DD36
-0E95 8132DD37
-0E96 8132DD38
-0E97 8132DD39
-0E98 8132DE30
-0E99 8132DE31
-0E9A 8132DE32
-0E9B 8132DE33
-0E9C 8132DE34
-0E9D 8132DE35
-0E9E 8132DE36
-0E9F 8132DE37
-0EA0 8132DE38
-0EA1 8132DE39
-0EA2 8132DF30
-0EA3 8132DF31
-0EA4 8132DF32
-0EA5 8132DF33
-0EA6 8132DF34
-0EA7 8132DF35
-0EA8 8132DF36
-0EA9 8132DF37
-0EAA 8132DF38
-0EAB 8132DF39
-0EAC 8132E030
-0EAD 8132E031
-0EAE 8132E032
-0EAF 8132E033
-0EB0 8132E034
-0EB1 8132E035
-0EB2 8132E036
-0EB3 8132E037
-0EB4 8132E038
-0EB5 8132E039
-0EB6 8132E130
-0EB7 8132E131
-0EB8 8132E132
-0EB9 8132E133
-0EBA 8132E134
-0EBB 8132E135
-0EBC 8132E136
-0EBD 8132E137
-0EBE 8132E138
-0EBF 8132E139
-0EC0 8132E230
-0EC1 8132E231
-0EC2 8132E232
-0EC3 8132E233
-0EC4 8132E234
-0EC5 8132E235
-0EC6 8132E236
-0EC7 8132E237
-0EC8 8132E238
-0EC9 8132E239
-0ECA 8132E330
-0ECB 8132E331
-0ECC 8132E332
-0ECD 8132E333
-0ECE 8132E334
-0ECF 8132E335
-0ED0 8132E336
-0ED1 8132E337
-0ED2 8132E338
-0ED3 8132E339
-0ED4 8132E430
-0ED5 8132E431
-0ED6 8132E432
-0ED7 8132E433
-0ED8 8132E434
-0ED9 8132E435
-0EDA 8132E436
-0EDB 8132E437
-0EDC 8132E438
-0EDD 8132E439
-0EDE 8132E530
-0EDF 8132E531
-0EE0 8132E532
-0EE1 8132E533
-0EE2 8132E534
-0EE3 8132E535
-0EE4 8132E536
-0EE5 8132E537
-0EE6 8132E538
-0EE7 8132E539
-0EE8 8132E630
-0EE9 8132E631
-0EEA 8132E632
-0EEB 8132E633
-0EEC 8132E634
-0EED 8132E635
-0EEE 8132E636
-0EEF 8132E637
-0EF0 8132E638
-0EF1 8132E639
-0EF2 8132E730
-0EF3 8132E731
-0EF4 8132E732
-0EF5 8132E733
-0EF6 8132E734
-0EF7 8132E735
-0EF8 8132E736
-0EF9 8132E737
-0EFA 8132E738
-0EFB 8132E739
-0EFC 8132E830
-0EFD 8132E831
-0EFE 8132E832
-0EFF 8132E833
-0F00 8132E834
-0F01 8132E835
-0F02 8132E836
-0F03 8132E837
-0F04 8132E838
-0F05 8132E839
-0F06 8132E930
-0F07 8132E931
-0F08 8132E932
-0F09 8132E933
-0F0A 8132E934
-0F0B 8132E935
-0F0C 8132E936
-0F0D 8132E937
-0F0E 8132E938
-0F0F 8132E939
-0F10 8132EA30
-0F11 8132EA31
-0F12 8132EA32
-0F13 8132EA33
-0F14 8132EA34
-0F15 8132EA35
-0F16 8132EA36
-0F17 8132EA37
-0F18 8132EA38
-0F19 8132EA39
-0F1A 8132EB30
-0F1B 8132EB31
-0F1C 8132EB32
-0F1D 8132EB33
-0F1E 8132EB34
-0F1F 8132EB35
-0F20 8132EB36
-0F21 8132EB37
-0F22 8132EB38
-0F23 8132EB39
-0F24 8132EC30
-0F25 8132EC31
-0F26 8132EC32
-0F27 8132EC33
-0F28 8132EC34
-0F29 8132EC35
-0F2A 8132EC36
-0F2B 8132EC37
-0F2C 8132EC38
-0F2D 8132EC39
-0F2E 8132ED30
-0F2F 8132ED31
-0F30 8132ED32
-0F31 8132ED33
-0F32 8132ED34
-0F33 8132ED35
-0F34 8132ED36
-0F35 8132ED37
-0F36 8132ED38
-0F37 8132ED39
-0F38 8132EE30
-0F39 8132EE31
-0F3A 8132EE32
-0F3B 8132EE33
-0F3C 8132EE34
-0F3D 8132EE35
-0F3E 8132EE36
-0F3F 8132EE37
-0F40 8132EE38
-0F41 8132EE39
-0F42 8132EF30
-0F43 8132EF31
-0F44 8132EF32
-0F45 8132EF33
-0F46 8132EF34
-0F47 8132EF35
-0F48 8132EF36
-0F49 8132EF37
-0F4A 8132EF38
-0F4B 8132EF39
-0F4C 8132F030
-0F4D 8132F031
-0F4E 8132F032
-0F4F 8132F033
-0F50 8132F034
-0F51 8132F035
-0F52 8132F036
-0F53 8132F037
-0F54 8132F038
-0F55 8132F039
-0F56 8132F130
-0F57 8132F131
-0F58 8132F132
-0F59 8132F133
-0F5A 8132F134
-0F5B 8132F135
-0F5C 8132F136
-0F5D 8132F137
-0F5E 8132F138
-0F5F 8132F139
-0F60 8132F230
-0F61 8132F231
-0F62 8132F232
-0F63 8132F233
-0F64 8132F234
-0F65 8132F235
-0F66 8132F236
-0F67 8132F237
-0F68 8132F238
-0F69 8132F239
-0F6A 8132F330
-0F6B 8132F331
-0F6C 8132F332
-0F6D 8132F333
-0F6E 8132F334
-0F6F 8132F335
-0F70 8132F336
-0F71 8132F337
-0F72 8132F338
-0F73 8132F339
-0F74 8132F430
-0F75 8132F431
-0F76 8132F432
-0F77 8132F433
-0F78 8132F434
-0F79 8132F435
-0F7A 8132F436
-0F7B 8132F437
-0F7C 8132F438
-0F7D 8132F439
-0F7E 8132F530
-0F7F 8132F531
-0F80 8132F532
-0F81 8132F533
-0F82 8132F534
-0F83 8132F535
-0F84 8132F536
-0F85 8132F537
-0F86 8132F538
-0F87 8132F539
-0F88 8132F630
-0F89 8132F631
-0F8A 8132F632
-0F8B 8132F633
-0F8C 8132F634
-0F8D 8132F635
-0F8E 8132F636
-0F8F 8132F637
-0F90 8132F638
-0F91 8132F639
-0F92 8132F730
-0F93 8132F731
-0F94 8132F732
-0F95 8132F733
-0F96 8132F734
-0F97 8132F735
-0F98 8132F736
-0F99 8132F737
-0F9A 8132F738
-0F9B 8132F739
-0F9C 8132F830
-0F9D 8132F831
-0F9E 8132F832
-0F9F 8132F833
-0FA0 8132F834
-0FA1 8132F835
-0FA2 8132F836
-0FA3 8132F837
-0FA4 8132F838
-0FA5 8132F839
-0FA6 8132F930
-0FA7 8132F931
-0FA8 8132F932
-0FA9 8132F933
-0FAA 8132F934
-0FAB 8132F935
-0FAC 8132F936
-0FAD 8132F937
-0FAE 8132F938
-0FAF 8132F939
-0FB0 8132FA30
-0FB1 8132FA31
-0FB2 8132FA32
-0FB3 8132FA33
-0FB4 8132FA34
-0FB5 8132FA35
-0FB6 8132FA36
-0FB7 8132FA37
-0FB8 8132FA38
-0FB9 8132FA39
-0FBA 8132FB30
-0FBB 8132FB31
-0FBC 8132FB32
-0FBD 8132FB33
-0FBE 8132FB34
-0FBF 8132FB35
-0FC0 8132FB36
-0FC1 8132FB37
-0FC2 8132FB38
-0FC3 8132FB39
-0FC4 8132FC30
-0FC5 8132FC31
-0FC6 8132FC32
-0FC7 8132FC33
-0FC8 8132FC34
-0FC9 8132FC35
-0FCA 8132FC36
-0FCB 8132FC37
-0FCC 8132FC38
-0FCD 8132FC39
-0FCE 8132FD30
-0FCF 8132FD31
-0FD0 8132FD32
-0FD1 8132FD33
-0FD2 8132FD34
-0FD3 8132FD35
-0FD4 8132FD36
-0FD5 8132FD37
-0FD6 8132FD38
-0FD7 8132FD39
-0FD8 8132FE30
-0FD9 8132FE31
-0FDA 8132FE32
-0FDB 8132FE33
-0FDC 8132FE34
-0FDD 8132FE35
-0FDE 8132FE36
-0FDF 8132FE37
-0FE0 8132FE38
-0FE1 8132FE39
-0FE2 81338130
-0FE3 81338131
-0FE4 81338132
-0FE5 81338133
-0FE6 81338134
-0FE7 81338135
-0FE8 81338136
-0FE9 81338137
-0FEA 81338138
-0FEB 81338139
-0FEC 81338230
-0FED 81338231
-0FEE 81338232
-0FEF 81338233
-0FF0 81338234
-0FF1 81338235
-0FF2 81338236
-0FF3 81338237
-0FF4 81338238
-0FF5 81338239
-0FF6 81338330
-0FF7 81338331
-0FF8 81338332
-0FF9 81338333
-0FFA 81338334
-0FFB 81338335
-0FFC 81338336
-0FFD 81338337
-0FFE 81338338
-0FFF 81338339
-1000 81338430
-1001 81338431
-1002 81338432
-1003 81338433
-1004 81338434
-1005 81338435
-1006 81338436
-1007 81338437
-1008 81338438
-1009 81338439
-100A 81338530
-100B 81338531
-100C 81338532
-100D 81338533
-100E 81338534
-100F 81338535
-1010 81338536
-1011 81338537
-1012 81338538
-1013 81338539
-1014 81338630
-1015 81338631
-1016 81338632
-1017 81338633
-1018 81338634
-1019 81338635
-101A 81338636
-101B 81338637
-101C 81338638
-101D 81338639
-101E 81338730
-101F 81338731
-1020 81338732
-1021 81338733
-1022 81338734
-1023 81338735
-1024 81338736
-1025 81338737
-1026 81338738
-1027 81338739
-1028 81338830
-1029 81338831
-102A 81338832
-102B 81338833
-102C 81338834
-102D 81338835
-102E 81338836
-102F 81338837
-1030 81338838
-1031 81338839
-1032 81338930
-1033 81338931
-1034 81338932
-1035 81338933
-1036 81338934
-1037 81338935
-1038 81338936
-1039 81338937
-103A 81338938
-103B 81338939
-103C 81338A30
-103D 81338A31
-103E 81338A32
-103F 81338A33
-1040 81338A34
-1041 81338A35
-1042 81338A36
-1043 81338A37
-1044 81338A38
-1045 81338A39
-1046 81338B30
-1047 81338B31
-1048 81338B32
-1049 81338B33
-104A 81338B34
-104B 81338B35
-104C 81338B36
-104D 81338B37
-104E 81338B38
-104F 81338B39
-1050 81338C30
-1051 81338C31
-1052 81338C32
-1053 81338C33
-1054 81338C34
-1055 81338C35
-1056 81338C36
-1057 81338C37
-1058 81338C38
-1059 81338C39
-105A 81338D30
-105B 81338D31
-105C 81338D32
-105D 81338D33
-105E 81338D34
-105F 81338D35
-1060 81338D36
-1061 81338D37
-1062 81338D38
-1063 81338D39
-1064 81338E30
-1065 81338E31
-1066 81338E32
-1067 81338E33
-1068 81338E34
-1069 81338E35
-106A 81338E36
-106B 81338E37
-106C 81338E38
-106D 81338E39
-106E 81338F30
-106F 81338F31
-1070 81338F32
-1071 81338F33
-1072 81338F34
-1073 81338F35
-1074 81338F36
-1075 81338F37
-1076 81338F38
-1077 81338F39
-1078 81339030
-1079 81339031
-107A 81339032
-107B 81339033
-107C 81339034
-107D 81339035
-107E 81339036
-107F 81339037
-1080 81339038
-1081 81339039
-1082 81339130
-1083 81339131
-1084 81339132
-1085 81339133
-1086 81339134
-1087 81339135
-1088 81339136
-1089 81339137
-108A 81339138
-108B 81339139
-108C 81339230
-108D 81339231
-108E 81339232
-108F 81339233
-1090 81339234
-1091 81339235
-1092 81339236
-1093 81339237
-1094 81339238
-1095 81339239
-1096 81339330
-1097 81339331
-1098 81339332
-1099 81339333
-109A 81339334
-109B 81339335
-109C 81339336
-109D 81339337
-109E 81339338
-109F 81339339
-10A0 81339430
-10A1 81339431
-10A2 81339432
-10A3 81339433
-10A4 81339434
-10A5 81339435
-10A6 81339436
-10A7 81339437
-10A8 81339438
-10A9 81339439
-10AA 81339530
-10AB 81339531
-10AC 81339532
-10AD 81339533
-10AE 81339534
-10AF 81339535
-10B0 81339536
-10B1 81339537
-10B2 81339538
-10B3 81339539
-10B4 81339630
-10B5 81339631
-10B6 81339632
-10B7 81339633
-10B8 81339634
-10B9 81339635
-10BA 81339636
-10BB 81339637
-10BC 81339638
-10BD 81339639
-10BE 81339730
-10BF 81339731
-10C0 81339732
-10C1 81339733
-10C2 81339734
-10C3 81339735
-10C4 81339736
-10C5 81339737
-10C6 81339738
-10C7 81339739
-10C8 81339830
-10C9 81339831
-10CA 81339832
-10CB 81339833
-10CC 81339834
-10CD 81339835
-10CE 81339836
-10CF 81339837
-10D0 81339838
-10D1 81339839
-10D2 81339930
-10D3 81339931
-10D4 81339932
-10D5 81339933
-10D6 81339934
-10D7 81339935
-10D8 81339936
-10D9 81339937
-10DA 81339938
-10DB 81339939
-10DC 81339A30
-10DD 81339A31
-10DE 81339A32
-10DF 81339A33
-10E0 81339A34
-10E1 81339A35
-10E2 81339A36
-10E3 81339A37
-10E4 81339A38
-10E5 81339A39
-10E6 81339B30
-10E7 81339B31
-10E8 81339B32
-10E9 81339B33
-10EA 81339B34
-10EB 81339B35
-10EC 81339B36
-10ED 81339B37
-10EE 81339B38
-10EF 81339B39
-10F0 81339C30
-10F1 81339C31
-10F2 81339C32
-10F3 81339C33
-10F4 81339C34
-10F5 81339C35
-10F6 81339C36
-10F7 81339C37
-10F8 81339C38
-10F9 81339C39
-10FA 81339D30
-10FB 81339D31
-10FC 81339D32
-10FD 81339D33
-10FE 81339D34
-10FF 81339D35
-1100 81339D36
-1101 81339D37
-1102 81339D38
-1103 81339D39
-1104 81339E30
-1105 81339E31
-1106 81339E32
-1107 81339E33
-1108 81339E34
-1109 81339E35
-110A 81339E36
-110B 81339E37
-110C 81339E38
-110D 81339E39
-110E 81339F30
-110F 81339F31
-1110 81339F32
-1111 81339F33
-1112 81339F34
-1113 81339F35
-1114 81339F36
-1115 81339F37
-1116 81339F38
-1117 81339F39
-1118 8133A030
-1119 8133A031
-111A 8133A032
-111B 8133A033
-111C 8133A034
-111D 8133A035
-111E 8133A036
-111F 8133A037
-1120 8133A038
-1121 8133A039
-1122 8133A130
-1123 8133A131
-1124 8133A132
-1125 8133A133
-1126 8133A134
-1127 8133A135
-1128 8133A136
-1129 8133A137
-112A 8133A138
-112B 8133A139
-112C 8133A230
-112D 8133A231
-112E 8133A232
-112F 8133A233
-1130 8133A234
-1131 8133A235
-1132 8133A236
-1133 8133A237
-1134 8133A238
-1135 8133A239
-1136 8133A330
-1137 8133A331
-1138 8133A332
-1139 8133A333
-113A 8133A334
-113B 8133A335
-113C 8133A336
-113D 8133A337
-113E 8133A338
-113F 8133A339
-1140 8133A430
-1141 8133A431
-1142 8133A432
-1143 8133A433
-1144 8133A434
-1145 8133A435
-1146 8133A436
-1147 8133A437
-1148 8133A438
-1149 8133A439
-114A 8133A530
-114B 8133A531
-114C 8133A532
-114D 8133A533
-114E 8133A534
-114F 8133A535
-1150 8133A536
-1151 8133A537
-1152 8133A538
-1153 8133A539
-1154 8133A630
-1155 8133A631
-1156 8133A632
-1157 8133A633
-1158 8133A634
-1159 8133A635
-115A 8133A636
-115B 8133A637
-115C 8133A638
-115D 8133A639
-115E 8133A730
-115F 8133A731
-1160 8133A732
-1161 8133A733
-1162 8133A734
-1163 8133A735
-1164 8133A736
-1165 8133A737
-1166 8133A738
-1167 8133A739
-1168 8133A830
-1169 8133A831
-116A 8133A832
-116B 8133A833
-116C 8133A834
-116D 8133A835
-116E 8133A836
-116F 8133A837
-1170 8133A838
-1171 8133A839
-1172 8133A930
-1173 8133A931
-1174 8133A932
-1175 8133A933
-1176 8133A934
-1177 8133A935
-1178 8133A936
-1179 8133A937
-117A 8133A938
-117B 8133A939
-117C 8133AA30
-117D 8133AA31
-117E 8133AA32
-117F 8133AA33
-1180 8133AA34
-1181 8133AA35
-1182 8133AA36
-1183 8133AA37
-1184 8133AA38
-1185 8133AA39
-1186 8133AB30
-1187 8133AB31
-1188 8133AB32
-1189 8133AB33
-118A 8133AB34
-118B 8133AB35
-118C 8133AB36
-118D 8133AB37
-118E 8133AB38
-118F 8133AB39
-1190 8133AC30
-1191 8133AC31
-1192 8133AC32
-1193 8133AC33
-1194 8133AC34
-1195 8133AC35
-1196 8133AC36
-1197 8133AC37
-1198 8133AC38
-1199 8133AC39
-119A 8133AD30
-119B 8133AD31
-119C 8133AD32
-119D 8133AD33
-119E 8133AD34
-119F 8133AD35
-11A0 8133AD36
-11A1 8133AD37
-11A2 8133AD38
-11A3 8133AD39
-11A4 8133AE30
-11A5 8133AE31
-11A6 8133AE32
-11A7 8133AE33
-11A8 8133AE34
-11A9 8133AE35
-11AA 8133AE36
-11AB 8133AE37
-11AC 8133AE38
-11AD 8133AE39
-11AE 8133AF30
-11AF 8133AF31
-11B0 8133AF32
-11B1 8133AF33
-11B2 8133AF34
-11B3 8133AF35
-11B4 8133AF36
-11B5 8133AF37
-11B6 8133AF38
-11B7 8133AF39
-11B8 8133B030
-11B9 8133B031
-11BA 8133B032
-11BB 8133B033
-11BC 8133B034
-11BD 8133B035
-11BE 8133B036
-11BF 8133B037
-11C0 8133B038
-11C1 8133B039
-11C2 8133B130
-11C3 8133B131
-11C4 8133B132
-11C5 8133B133
-11C6 8133B134
-11C7 8133B135
-11C8 8133B136
-11C9 8133B137
-11CA 8133B138
-11CB 8133B139
-11CC 8133B230
-11CD 8133B231
-11CE 8133B232
-11CF 8133B233
-11D0 8133B234
-11D1 8133B235
-11D2 8133B236
-11D3 8133B237
-11D4 8133B238
-11D5 8133B239
-11D6 8133B330
-11D7 8133B331
-11D8 8133B332
-11D9 8133B333
-11DA 8133B334
-11DB 8133B335
-11DC 8133B336
-11DD 8133B337
-11DE 8133B338
-11DF 8133B339
-11E0 8133B430
-11E1 8133B431
-11E2 8133B432
-11E3 8133B433
-11E4 8133B434
-11E5 8133B435
-11E6 8133B436
-11E7 8133B437
-11E8 8133B438
-11E9 8133B439
-11EA 8133B530
-11EB 8133B531
-11EC 8133B532
-11ED 8133B533
-11EE 8133B534
-11EF 8133B535
-11F0 8133B536
-11F1 8133B537
-11F2 8133B538
-11F3 8133B539
-11F4 8133B630
-11F5 8133B631
-11F6 8133B632
-11F7 8133B633
-11F8 8133B634
-11F9 8133B635
-11FA 8133B636
-11FB 8133B637
-11FC 8133B638
-11FD 8133B639
-11FE 8133B730
-11FF 8133B731
-1200 8133B732
-1201 8133B733
-1202 8133B734
-1203 8133B735
-1204 8133B736
-1205 8133B737
-1206 8133B738
-1207 8133B739
-1208 8133B830
-1209 8133B831
-120A 8133B832
-120B 8133B833
-120C 8133B834
-120D 8133B835
-120E 8133B836
-120F 8133B837
-1210 8133B838
-1211 8133B839
-1212 8133B930
-1213 8133B931
-1214 8133B932
-1215 8133B933
-1216 8133B934
-1217 8133B935
-1218 8133B936
-1219 8133B937
-121A 8133B938
-121B 8133B939
-121C 8133BA30
-121D 8133BA31
-121E 8133BA32
-121F 8133BA33
-1220 8133BA34
-1221 8133BA35
-1222 8133BA36
-1223 8133BA37
-1224 8133BA38
-1225 8133BA39
-1226 8133BB30
-1227 8133BB31
-1228 8133BB32
-1229 8133BB33
-122A 8133BB34
-122B 8133BB35
-122C 8133BB36
-122D 8133BB37
-122E 8133BB38
-122F 8133BB39
-1230 8133BC30
-1231 8133BC31
-1232 8133BC32
-1233 8133BC33
-1234 8133BC34
-1235 8133BC35
-1236 8133BC36
-1237 8133BC37
-1238 8133BC38
-1239 8133BC39
-123A 8133BD30
-123B 8133BD31
-123C 8133BD32
-123D 8133BD33
-123E 8133BD34
-123F 8133BD35
-1240 8133BD36
-1241 8133BD37
-1242 8133BD38
-1243 8133BD39
-1244 8133BE30
-1245 8133BE31
-1246 8133BE32
-1247 8133BE33
-1248 8133BE34
-1249 8133BE35
-124A 8133BE36
-124B 8133BE37
-124C 8133BE38
-124D 8133BE39
-124E 8133BF30
-124F 8133BF31
-1250 8133BF32
-1251 8133BF33
-1252 8133BF34
-1253 8133BF35
-1254 8133BF36
-1255 8133BF37
-1256 8133BF38
-1257 8133BF39
-1258 8133C030
-1259 8133C031
-125A 8133C032
-125B 8133C033
-125C 8133C034
-125D 8133C035
-125E 8133C036
-125F 8133C037
-1260 8133C038
-1261 8133C039
-1262 8133C130
-1263 8133C131
-1264 8133C132
-1265 8133C133
-1266 8133C134
-1267 8133C135
-1268 8133C136
-1269 8133C137
-126A 8133C138
-126B 8133C139
-126C 8133C230
-126D 8133C231
-126E 8133C232
-126F 8133C233
-1270 8133C234
-1271 8133C235
-1272 8133C236
-1273 8133C237
-1274 8133C238
-1275 8133C239
-1276 8133C330
-1277 8133C331
-1278 8133C332
-1279 8133C333
-127A 8133C334
-127B 8133C335
-127C 8133C336
-127D 8133C337
-127E 8133C338
-127F 8133C339
-1280 8133C430
-1281 8133C431
-1282 8133C432
-1283 8133C433
-1284 8133C434
-1285 8133C435
-1286 8133C436
-1287 8133C437
-1288 8133C438
-1289 8133C439
-128A 8133C530
-128B 8133C531
-128C 8133C532
-128D 8133C533
-128E 8133C534
-128F 8133C535
-1290 8133C536
-1291 8133C537
-1292 8133C538
-1293 8133C539
-1294 8133C630
-1295 8133C631
-1296 8133C632
-1297 8133C633
-1298 8133C634
-1299 8133C635
-129A 8133C636
-129B 8133C637
-129C 8133C638
-129D 8133C639
-129E 8133C730
-129F 8133C731
-12A0 8133C732
-12A1 8133C733
-12A2 8133C734
-12A3 8133C735
-12A4 8133C736
-12A5 8133C737
-12A6 8133C738
-12A7 8133C739
-12A8 8133C830
-12A9 8133C831
-12AA 8133C832
-12AB 8133C833
-12AC 8133C834
-12AD 8133C835
-12AE 8133C836
-12AF 8133C837
-12B0 8133C838
-12B1 8133C839
-12B2 8133C930
-12B3 8133C931
-12B4 8133C932
-12B5 8133C933
-12B6 8133C934
-12B7 8133C935
-12B8 8133C936
-12B9 8133C937
-12BA 8133C938
-12BB 8133C939
-12BC 8133CA30
-12BD 8133CA31
-12BE 8133CA32
-12BF 8133CA33
-12C0 8133CA34
-12C1 8133CA35
-12C2 8133CA36
-12C3 8133CA37
-12C4 8133CA38
-12C5 8133CA39
-12C6 8133CB30
-12C7 8133CB31
-12C8 8133CB32
-12C9 8133CB33
-12CA 8133CB34
-12CB 8133CB35
-12CC 8133CB36
-12CD 8133CB37
-12CE 8133CB38
-12CF 8133CB39
-12D0 8133CC30
-12D1 8133CC31
-12D2 8133CC32
-12D3 8133CC33
-12D4 8133CC34
-12D5 8133CC35
-12D6 8133CC36
-12D7 8133CC37
-12D8 8133CC38
-12D9 8133CC39
-12DA 8133CD30
-12DB 8133CD31
-12DC 8133CD32
-12DD 8133CD33
-12DE 8133CD34
-12DF 8133CD35
-12E0 8133CD36
-12E1 8133CD37
-12E2 8133CD38
-12E3 8133CD39
-12E4 8133CE30
-12E5 8133CE31
-12E6 8133CE32
-12E7 8133CE33
-12E8 8133CE34
-12E9 8133CE35
-12EA 8133CE36
-12EB 8133CE37
-12EC 8133CE38
-12ED 8133CE39
-12EE 8133CF30
-12EF 8133CF31
-12F0 8133CF32
-12F1 8133CF33
-12F2 8133CF34
-12F3 8133CF35
-12F4 8133CF36
-12F5 8133CF37
-12F6 8133CF38
-12F7 8133CF39
-12F8 8133D030
-12F9 8133D031
-12FA 8133D032
-12FB 8133D033
-12FC 8133D034
-12FD 8133D035
-12FE 8133D036
-12FF 8133D037
-1300 8133D038
-1301 8133D039
-1302 8133D130
-1303 8133D131
-1304 8133D132
-1305 8133D133
-1306 8133D134
-1307 8133D135
-1308 8133D136
-1309 8133D137
-130A 8133D138
-130B 8133D139
-130C 8133D230
-130D 8133D231
-130E 8133D232
-130F 8133D233
-1310 8133D234
-1311 8133D235
-1312 8133D236
-1313 8133D237
-1314 8133D238
-1315 8133D239
-1316 8133D330
-1317 8133D331
-1318 8133D332
-1319 8133D333
-131A 8133D334
-131B 8133D335
-131C 8133D336
-131D 8133D337
-131E 8133D338
-131F 8133D339
-1320 8133D430
-1321 8133D431
-1322 8133D432
-1323 8133D433
-1324 8133D434
-1325 8133D435
-1326 8133D436
-1327 8133D437
-1328 8133D438
-1329 8133D439
-132A 8133D530
-132B 8133D531
-132C 8133D532
-132D 8133D533
-132E 8133D534
-132F 8133D535
-1330 8133D536
-1331 8133D537
-1332 8133D538
-1333 8133D539
-1334 8133D630
-1335 8133D631
-1336 8133D632
-1337 8133D633
-1338 8133D634
-1339 8133D635
-133A 8133D636
-133B 8133D637
-133C 8133D638
-133D 8133D639
-133E 8133D730
-133F 8133D731
-1340 8133D732
-1341 8133D733
-1342 8133D734
-1343 8133D735
-1344 8133D736
-1345 8133D737
-1346 8133D738
-1347 8133D739
-1348 8133D830
-1349 8133D831
-134A 8133D832
-134B 8133D833
-134C 8133D834
-134D 8133D835
-134E 8133D836
-134F 8133D837
-1350 8133D838
-1351 8133D839
-1352 8133D930
-1353 8133D931
-1354 8133D932
-1355 8133D933
-1356 8133D934
-1357 8133D935
-1358 8133D936
-1359 8133D937
-135A 8133D938
-135B 8133D939
-135C 8133DA30
-135D 8133DA31
-135E 8133DA32
-135F 8133DA33
-1360 8133DA34
-1361 8133DA35
-1362 8133DA36
-1363 8133DA37
-1364 8133DA38
-1365 8133DA39
-1366 8133DB30
-1367 8133DB31
-1368 8133DB32
-1369 8133DB33
-136A 8133DB34
-136B 8133DB35
-136C 8133DB36
-136D 8133DB37
-136E 8133DB38
-136F 8133DB39
-1370 8133DC30
-1371 8133DC31
-1372 8133DC32
-1373 8133DC33
-1374 8133DC34
-1375 8133DC35
-1376 8133DC36
-1377 8133DC37
-1378 8133DC38
-1379 8133DC39
-137A 8133DD30
-137B 8133DD31
-137C 8133DD32
-137D 8133DD33
-137E 8133DD34
-137F 8133DD35
-1380 8133DD36
-1381 8133DD37
-1382 8133DD38
-1383 8133DD39
-1384 8133DE30
-1385 8133DE31
-1386 8133DE32
-1387 8133DE33
-1388 8133DE34
-1389 8133DE35
-138A 8133DE36
-138B 8133DE37
-138C 8133DE38
-138D 8133DE39
-138E 8133DF30
-138F 8133DF31
-1390 8133DF32
-1391 8133DF33
-1392 8133DF34
-1393 8133DF35
-1394 8133DF36
-1395 8133DF37
-1396 8133DF38
-1397 8133DF39
-1398 8133E030
-1399 8133E031
-139A 8133E032
-139B 8133E033
-139C 8133E034
-139D 8133E035
-139E 8133E036
-139F 8133E037
-13A0 8133E038
-13A1 8133E039
-13A2 8133E130
-13A3 8133E131
-13A4 8133E132
-13A5 8133E133
-13A6 8133E134
-13A7 8133E135
-13A8 8133E136
-13A9 8133E137
-13AA 8133E138
-13AB 8133E139
-13AC 8133E230
-13AD 8133E231
-13AE 8133E232
-13AF 8133E233
-13B0 8133E234
-13B1 8133E235
-13B2 8133E236
-13B3 8133E237
-13B4 8133E238
-13B5 8133E239
-13B6 8133E330
-13B7 8133E331
-13B8 8133E332
-13B9 8133E333
-13BA 8133E334
-13BB 8133E335
-13BC 8133E336
-13BD 8133E337
-13BE 8133E338
-13BF 8133E339
-13C0 8133E430
-13C1 8133E431
-13C2 8133E432
-13C3 8133E433
-13C4 8133E434
-13C5 8133E435
-13C6 8133E436
-13C7 8133E437
-13C8 8133E438
-13C9 8133E439
-13CA 8133E530
-13CB 8133E531
-13CC 8133E532
-13CD 8133E533
-13CE 8133E534
-13CF 8133E535
-13D0 8133E536
-13D1 8133E537
-13D2 8133E538
-13D3 8133E539
-13D4 8133E630
-13D5 8133E631
-13D6 8133E632
-13D7 8133E633
-13D8 8133E634
-13D9 8133E635
-13DA 8133E636
-13DB 8133E637
-13DC 8133E638
-13DD 8133E639
-13DE 8133E730
-13DF 8133E731
-13E0 8133E732
-13E1 8133E733
-13E2 8133E734
-13E3 8133E735
-13E4 8133E736
-13E5 8133E737
-13E6 8133E738
-13E7 8133E739
-13E8 8133E830
-13E9 8133E831
-13EA 8133E832
-13EB 8133E833
-13EC 8133E834
-13ED 8133E835
-13EE 8133E836
-13EF 8133E837
-13F0 8133E838
-13F1 8133E839
-13F2 8133E930
-13F3 8133E931
-13F4 8133E932
-13F5 8133E933
-13F6 8133E934
-13F7 8133E935
-13F8 8133E936
-13F9 8133E937
-13FA 8133E938
-13FB 8133E939
-13FC 8133EA30
-13FD 8133EA31
-13FE 8133EA32
-13FF 8133EA33
-1400 8133EA34
-1401 8133EA35
-1402 8133EA36
-1403 8133EA37
-1404 8133EA38
-1405 8133EA39
-1406 8133EB30
-1407 8133EB31
-1408 8133EB32
-1409 8133EB33
-140A 8133EB34
-140B 8133EB35
-140C 8133EB36
-140D 8133EB37
-140E 8133EB38
-140F 8133EB39
-1410 8133EC30
-1411 8133EC31
-1412 8133EC32
-1413 8133EC33
-1414 8133EC34
-1415 8133EC35
-1416 8133EC36
-1417 8133EC37
-1418 8133EC38
-1419 8133EC39
-141A 8133ED30
-141B 8133ED31
-141C 8133ED32
-141D 8133ED33
-141E 8133ED34
-141F 8133ED35
-1420 8133ED36
-1421 8133ED37
-1422 8133ED38
-1423 8133ED39
-1424 8133EE30
-1425 8133EE31
-1426 8133EE32
-1427 8133EE33
-1428 8133EE34
-1429 8133EE35
-142A 8133EE36
-142B 8133EE37
-142C 8133EE38
-142D 8133EE39
-142E 8133EF30
-142F 8133EF31
-1430 8133EF32
-1431 8133EF33
-1432 8133EF34
-1433 8133EF35
-1434 8133EF36
-1435 8133EF37
-1436 8133EF38
-1437 8133EF39
-1438 8133F030
-1439 8133F031
-143A 8133F032
-143B 8133F033
-143C 8133F034
-143D 8133F035
-143E 8133F036
-143F 8133F037
-1440 8133F038
-1441 8133F039
-1442 8133F130
-1443 8133F131
-1444 8133F132
-1445 8133F133
-1446 8133F134
-1447 8133F135
-1448 8133F136
-1449 8133F137
-144A 8133F138
-144B 8133F139
-144C 8133F230
-144D 8133F231
-144E 8133F232
-144F 8133F233
-1450 8133F234
-1451 8133F235
-1452 8133F236
-1453 8133F237
-1454 8133F238
-1455 8133F239
-1456 8133F330
-1457 8133F331
-1458 8133F332
-1459 8133F333
-145A 8133F334
-145B 8133F335
-145C 8133F336
-145D 8133F337
-145E 8133F338
-145F 8133F339
-1460 8133F430
-1461 8133F431
-1462 8133F432
-1463 8133F433
-1464 8133F434
-1465 8133F435
-1466 8133F436
-1467 8133F437
-1468 8133F438
-1469 8133F439
-146A 8133F530
-146B 8133F531
-146C 8133F532
-146D 8133F533
-146E 8133F534
-146F 8133F535
-1470 8133F536
-1471 8133F537
-1472 8133F538
-1473 8133F539
-1474 8133F630
-1475 8133F631
-1476 8133F632
-1477 8133F633
-1478 8133F634
-1479 8133F635
-147A 8133F636
-147B 8133F637
-147C 8133F638
-147D 8133F639
-147E 8133F730
-147F 8133F731
-1480 8133F732
-1481 8133F733
-1482 8133F734
-1483 8133F735
-1484 8133F736
-1485 8133F737
-1486 8133F738
-1487 8133F739
-1488 8133F830
-1489 8133F831
-148A 8133F832
-148B 8133F833
-148C 8133F834
-148D 8133F835
-148E 8133F836
-148F 8133F837
-1490 8133F838
-1491 8133F839
-1492 8133F930
-1493 8133F931
-1494 8133F932
-1495 8133F933
-1496 8133F934
-1497 8133F935
-1498 8133F936
-1499 8133F937
-149A 8133F938
-149B 8133F939
-149C 8133FA30
-149D 8133FA31
-149E 8133FA32
-149F 8133FA33
-14A0 8133FA34
-14A1 8133FA35
-14A2 8133FA36
-14A3 8133FA37
-14A4 8133FA38
-14A5 8133FA39
-14A6 8133FB30
-14A7 8133FB31
-14A8 8133FB32
-14A9 8133FB33
-14AA 8133FB34
-14AB 8133FB35
-14AC 8133FB36
-14AD 8133FB37
-14AE 8133FB38
-14AF 8133FB39
-14B0 8133FC30
-14B1 8133FC31
-14B2 8133FC32
-14B3 8133FC33
-14B4 8133FC34
-14B5 8133FC35
-14B6 8133FC36
-14B7 8133FC37
-14B8 8133FC38
-14B9 8133FC39
-14BA 8133FD30
-14BB 8133FD31
-14BC 8133FD32
-14BD 8133FD33
-14BE 8133FD34
-14BF 8133FD35
-14C0 8133FD36
-14C1 8133FD37
-14C2 8133FD38
-14C3 8133FD39
-14C4 8133FE30
-14C5 8133FE31
-14C6 8133FE32
-14C7 8133FE33
-14C8 8133FE34
-14C9 8133FE35
-14CA 8133FE36
-14CB 8133FE37
-14CC 8133FE38
-14CD 8133FE39
-14CE 81348130
-14CF 81348131
-14D0 81348132
-14D1 81348133
-14D2 81348134
-14D3 81348135
-14D4 81348136
-14D5 81348137
-14D6 81348138
-14D7 81348139
-14D8 81348230
-14D9 81348231
-14DA 81348232
-14DB 81348233
-14DC 81348234
-14DD 81348235
-14DE 81348236
-14DF 81348237
-14E0 81348238
-14E1 81348239
-14E2 81348330
-14E3 81348331
-14E4 81348332
-14E5 81348333
-14E6 81348334
-14E7 81348335
-14E8 81348336
-14E9 81348337
-14EA 81348338
-14EB 81348339
-14EC 81348430
-14ED 81348431
-14EE 81348432
-14EF 81348433
-14F0 81348434
-14F1 81348435
-14F2 81348436
-14F3 81348437
-14F4 81348438
-14F5 81348439
-14F6 81348530
-14F7 81348531
-14F8 81348532
-14F9 81348533
-14FA 81348534
-14FB 81348535
-14FC 81348536
-14FD 81348537
-14FE 81348538
-14FF 81348539
-1500 81348630
-1501 81348631
-1502 81348632
-1503 81348633
-1504 81348634
-1505 81348635
-1506 81348636
-1507 81348637
-1508 81348638
-1509 81348639
-150A 81348730
-150B 81348731
-150C 81348732
-150D 81348733
-150E 81348734
-150F 81348735
-1510 81348736
-1511 81348737
-1512 81348738
-1513 81348739
-1514 81348830
-1515 81348831
-1516 81348832
-1517 81348833
-1518 81348834
-1519 81348835
-151A 81348836
-151B 81348837
-151C 81348838
-151D 81348839
-151E 81348930
-151F 81348931
-1520 81348932
-1521 81348933
-1522 81348934
-1523 81348935
-1524 81348936
-1525 81348937
-1526 81348938
-1527 81348939
-1528 81348A30
-1529 81348A31
-152A 81348A32
-152B 81348A33
-152C 81348A34
-152D 81348A35
-152E 81348A36
-152F 81348A37
-1530 81348A38
-1531 81348A39
-1532 81348B30
-1533 81348B31
-1534 81348B32
-1535 81348B33
-1536 81348B34
-1537 81348B35
-1538 81348B36
-1539 81348B37
-153A 81348B38
-153B 81348B39
-153C 81348C30
-153D 81348C31
-153E 81348C32
-153F 81348C33
-1540 81348C34
-1541 81348C35
-1542 81348C36
-1543 81348C37
-1544 81348C38
-1545 81348C39
-1546 81348D30
-1547 81348D31
-1548 81348D32
-1549 81348D33
-154A 81348D34
-154B 81348D35
-154C 81348D36
-154D 81348D37
-154E 81348D38
-154F 81348D39
-1550 81348E30
-1551 81348E31
-1552 81348E32
-1553 81348E33
-1554 81348E34
-1555 81348E35
-1556 81348E36
-1557 81348E37
-1558 81348E38
-1559 81348E39
-155A 81348F30
-155B 81348F31
-155C 81348F32
-155D 81348F33
-155E 81348F34
-155F 81348F35
-1560 81348F36
-1561 81348F37
-1562 81348F38
-1563 81348F39
-1564 81349030
-1565 81349031
-1566 81349032
-1567 81349033
-1568 81349034
-1569 81349035
-156A 81349036
-156B 81349037
-156C 81349038
-156D 81349039
-156E 81349130
-156F 81349131
-1570 81349132
-1571 81349133
-1572 81349134
-1573 81349135
-1574 81349136
-1575 81349137
-1576 81349138
-1577 81349139
-1578 81349230
-1579 81349231
-157A 81349232
-157B 81349233
-157C 81349234
-157D 81349235
-157E 81349236
-157F 81349237
-1580 81349238
-1581 81349239
-1582 81349330
-1583 81349331
-1584 81349332
-1585 81349333
-1586 81349334
-1587 81349335
-1588 81349336
-1589 81349337
-158A 81349338
-158B 81349339
-158C 81349430
-158D 81349431
-158E 81349432
-158F 81349433
-1590 81349434
-1591 81349435
-1592 81349436
-1593 81349437
-1594 81349438
-1595 81349439
-1596 81349530
-1597 81349531
-1598 81349532
-1599 81349533
-159A 81349534
-159B 81349535
-159C 81349536
-159D 81349537
-159E 81349538
-159F 81349539
-15A0 81349630
-15A1 81349631
-15A2 81349632
-15A3 81349633
-15A4 81349634
-15A5 81349635
-15A6 81349636
-15A7 81349637
-15A8 81349638
-15A9 81349639
-15AA 81349730
-15AB 81349731
-15AC 81349732
-15AD 81349733
-15AE 81349734
-15AF 81349735
-15B0 81349736
-15B1 81349737
-15B2 81349738
-15B3 81349739
-15B4 81349830
-15B5 81349831
-15B6 81349832
-15B7 81349833
-15B8 81349834
-15B9 81349835
-15BA 81349836
-15BB 81349837
-15BC 81349838
-15BD 81349839
-15BE 81349930
-15BF 81349931
-15C0 81349932
-15C1 81349933
-15C2 81349934
-15C3 81349935
-15C4 81349936
-15C5 81349937
-15C6 81349938
-15C7 81349939
-15C8 81349A30
-15C9 81349A31
-15CA 81349A32
-15CB 81349A33
-15CC 81349A34
-15CD 81349A35
-15CE 81349A36
-15CF 81349A37
-15D0 81349A38
-15D1 81349A39
-15D2 81349B30
-15D3 81349B31
-15D4 81349B32
-15D5 81349B33
-15D6 81349B34
-15D7 81349B35
-15D8 81349B36
-15D9 81349B37
-15DA 81349B38
-15DB 81349B39
-15DC 81349C30
-15DD 81349C31
-15DE 81349C32
-15DF 81349C33
-15E0 81349C34
-15E1 81349C35
-15E2 81349C36
-15E3 81349C37
-15E4 81349C38
-15E5 81349C39
-15E6 81349D30
-15E7 81349D31
-15E8 81349D32
-15E9 81349D33
-15EA 81349D34
-15EB 81349D35
-15EC 81349D36
-15ED 81349D37
-15EE 81349D38
-15EF 81349D39
-15F0 81349E30
-15F1 81349E31
-15F2 81349E32
-15F3 81349E33
-15F4 81349E34
-15F5 81349E35
-15F6 81349E36
-15F7 81349E37
-15F8 81349E38
-15F9 81349E39
-15FA 81349F30
-15FB 81349F31
-15FC 81349F32
-15FD 81349F33
-15FE 81349F34
-15FF 81349F35
-1600 81349F36
-1601 81349F37
-1602 81349F38
-1603 81349F39
-1604 8134A030
-1605 8134A031
-1606 8134A032
-1607 8134A033
-1608 8134A034
-1609 8134A035
-160A 8134A036
-160B 8134A037
-160C 8134A038
-160D 8134A039
-160E 8134A130
-160F 8134A131
-1610 8134A132
-1611 8134A133
-1612 8134A134
-1613 8134A135
-1614 8134A136
-1615 8134A137
-1616 8134A138
-1617 8134A139
-1618 8134A230
-1619 8134A231
-161A 8134A232
-161B 8134A233
-161C 8134A234
-161D 8134A235
-161E 8134A236
-161F 8134A237
-1620 8134A238
-1621 8134A239
-1622 8134A330
-1623 8134A331
-1624 8134A332
-1625 8134A333
-1626 8134A334
-1627 8134A335
-1628 8134A336
-1629 8134A337
-162A 8134A338
-162B 8134A339
-162C 8134A430
-162D 8134A431
-162E 8134A432
-162F 8134A433
-1630 8134A434
-1631 8134A435
-1632 8134A436
-1633 8134A437
-1634 8134A438
-1635 8134A439
-1636 8134A530
-1637 8134A531
-1638 8134A532
-1639 8134A533
-163A 8134A534
-163B 8134A535
-163C 8134A536
-163D 8134A537
-163E 8134A538
-163F 8134A539
-1640 8134A630
-1641 8134A631
-1642 8134A632
-1643 8134A633
-1644 8134A634
-1645 8134A635
-1646 8134A636
-1647 8134A637
-1648 8134A638
-1649 8134A639
-164A 8134A730
-164B 8134A731
-164C 8134A732
-164D 8134A733
-164E 8134A734
-164F 8134A735
-1650 8134A736
-1651 8134A737
-1652 8134A738
-1653 8134A739
-1654 8134A830
-1655 8134A831
-1656 8134A832
-1657 8134A833
-1658 8134A834
-1659 8134A835
-165A 8134A836
-165B 8134A837
-165C 8134A838
-165D 8134A839
-165E 8134A930
-165F 8134A931
-1660 8134A932
-1661 8134A933
-1662 8134A934
-1663 8134A935
-1664 8134A936
-1665 8134A937
-1666 8134A938
-1667 8134A939
-1668 8134AA30
-1669 8134AA31
-166A 8134AA32
-166B 8134AA33
-166C 8134AA34
-166D 8134AA35
-166E 8134AA36
-166F 8134AA37
-1670 8134AA38
-1671 8134AA39
-1672 8134AB30
-1673 8134AB31
-1674 8134AB32
-1675 8134AB33
-1676 8134AB34
-1677 8134AB35
-1678 8134AB36
-1679 8134AB37
-167A 8134AB38
-167B 8134AB39
-167C 8134AC30
-167D 8134AC31
-167E 8134AC32
-167F 8134AC33
-1680 8134AC34
-1681 8134AC35
-1682 8134AC36
-1683 8134AC37
-1684 8134AC38
-1685 8134AC39
-1686 8134AD30
-1687 8134AD31
-1688 8134AD32
-1689 8134AD33
-168A 8134AD34
-168B 8134AD35
-168C 8134AD36
-168D 8134AD37
-168E 8134AD38
-168F 8134AD39
-1690 8134AE30
-1691 8134AE31
-1692 8134AE32
-1693 8134AE33
-1694 8134AE34
-1695 8134AE35
-1696 8134AE36
-1697 8134AE37
-1698 8134AE38
-1699 8134AE39
-169A 8134AF30
-169B 8134AF31
-169C 8134AF32
-169D 8134AF33
-169E 8134AF34
-169F 8134AF35
-16A0 8134AF36
-16A1 8134AF37
-16A2 8134AF38
-16A3 8134AF39
-16A4 8134B030
-16A5 8134B031
-16A6 8134B032
-16A7 8134B033
-16A8 8134B034
-16A9 8134B035
-16AA 8134B036
-16AB 8134B037
-16AC 8134B038
-16AD 8134B039
-16AE 8134B130
-16AF 8134B131
-16B0 8134B132
-16B1 8134B133
-16B2 8134B134
-16B3 8134B135
-16B4 8134B136
-16B5 8134B137
-16B6 8134B138
-16B7 8134B139
-16B8 8134B230
-16B9 8134B231
-16BA 8134B232
-16BB 8134B233
-16BC 8134B234
-16BD 8134B235
-16BE 8134B236
-16BF 8134B237
-16C0 8134B238
-16C1 8134B239
-16C2 8134B330
-16C3 8134B331
-16C4 8134B332
-16C5 8134B333
-16C6 8134B334
-16C7 8134B335
-16C8 8134B336
-16C9 8134B337
-16CA 8134B338
-16CB 8134B339
-16CC 8134B430
-16CD 8134B431
-16CE 8134B432
-16CF 8134B433
-16D0 8134B434
-16D1 8134B435
-16D2 8134B436
-16D3 8134B437
-16D4 8134B438
-16D5 8134B439
-16D6 8134B530
-16D7 8134B531
-16D8 8134B532
-16D9 8134B533
-16DA 8134B534
-16DB 8134B535
-16DC 8134B536
-16DD 8134B537
-16DE 8134B538
-16DF 8134B539
-16E0 8134B630
-16E1 8134B631
-16E2 8134B632
-16E3 8134B633
-16E4 8134B634
-16E5 8134B635
-16E6 8134B636
-16E7 8134B637
-16E8 8134B638
-16E9 8134B639
-16EA 8134B730
-16EB 8134B731
-16EC 8134B732
-16ED 8134B733
-16EE 8134B734
-16EF 8134B735
-16F0 8134B736
-16F1 8134B737
-16F2 8134B738
-16F3 8134B739
-16F4 8134B830
-16F5 8134B831
-16F6 8134B832
-16F7 8134B833
-16F8 8134B834
-16F9 8134B835
-16FA 8134B836
-16FB 8134B837
-16FC 8134B838
-16FD 8134B839
-16FE 8134B930
-16FF 8134B931
-1700 8134B932
-1701 8134B933
-1702 8134B934
-1703 8134B935
-1704 8134B936
-1705 8134B937
-1706 8134B938
-1707 8134B939
-1708 8134BA30
-1709 8134BA31
-170A 8134BA32
-170B 8134BA33
-170C 8134BA34
-170D 8134BA35
-170E 8134BA36
-170F 8134BA37
-1710 8134BA38
-1711 8134BA39
-1712 8134BB30
-1713 8134BB31
-1714 8134BB32
-1715 8134BB33
-1716 8134BB34
-1717 8134BB35
-1718 8134BB36
-1719 8134BB37
-171A 8134BB38
-171B 8134BB39
-171C 8134BC30
-171D 8134BC31
-171E 8134BC32
-171F 8134BC33
-1720 8134BC34
-1721 8134BC35
-1722 8134BC36
-1723 8134BC37
-1724 8134BC38
-1725 8134BC39
-1726 8134BD30
-1727 8134BD31
-1728 8134BD32
-1729 8134BD33
-172A 8134BD34
-172B 8134BD35
-172C 8134BD36
-172D 8134BD37
-172E 8134BD38
-172F 8134BD39
-1730 8134BE30
-1731 8134BE31
-1732 8134BE32
-1733 8134BE33
-1734 8134BE34
-1735 8134BE35
-1736 8134BE36
-1737 8134BE37
-1738 8134BE38
-1739 8134BE39
-173A 8134BF30
-173B 8134BF31
-173C 8134BF32
-173D 8134BF33
-173E 8134BF34
-173F 8134BF35
-1740 8134BF36
-1741 8134BF37
-1742 8134BF38
-1743 8134BF39
-1744 8134C030
-1745 8134C031
-1746 8134C032
-1747 8134C033
-1748 8134C034
-1749 8134C035
-174A 8134C036
-174B 8134C037
-174C 8134C038
-174D 8134C039
-174E 8134C130
-174F 8134C131
-1750 8134C132
-1751 8134C133
-1752 8134C134
-1753 8134C135
-1754 8134C136
-1755 8134C137
-1756 8134C138
-1757 8134C139
-1758 8134C230
-1759 8134C231
-175A 8134C232
-175B 8134C233
-175C 8134C234
-175D 8134C235
-175E 8134C236
-175F 8134C237
-1760 8134C238
-1761 8134C239
-1762 8134C330
-1763 8134C331
-1764 8134C332
-1765 8134C333
-1766 8134C334
-1767 8134C335
-1768 8134C336
-1769 8134C337
-176A 8134C338
-176B 8134C339
-176C 8134C430
-176D 8134C431
-176E 8134C432
-176F 8134C433
-1770 8134C434
-1771 8134C435
-1772 8134C436
-1773 8134C437
-1774 8134C438
-1775 8134C439
-1776 8134C530
-1777 8134C531
-1778 8134C532
-1779 8134C533
-177A 8134C534
-177B 8134C535
-177C 8134C536
-177D 8134C537
-177E 8134C538
-177F 8134C539
-1780 8134C630
-1781 8134C631
-1782 8134C632
-1783 8134C633
-1784 8134C634
-1785 8134C635
-1786 8134C636
-1787 8134C637
-1788 8134C638
-1789 8134C639
-178A 8134C730
-178B 8134C731
-178C 8134C732
-178D 8134C733
-178E 8134C734
-178F 8134C735
-1790 8134C736
-1791 8134C737
-1792 8134C738
-1793 8134C739
-1794 8134C830
-1795 8134C831
-1796 8134C832
-1797 8134C833
-1798 8134C834
-1799 8134C835
-179A 8134C836
-179B 8134C837
-179C 8134C838
-179D 8134C839
-179E 8134C930
-179F 8134C931
-17A0 8134C932
-17A1 8134C933
-17A2 8134C934
-17A3 8134C935
-17A4 8134C936
-17A5 8134C937
-17A6 8134C938
-17A7 8134C939
-17A8 8134CA30
-17A9 8134CA31
-17AA 8134CA32
-17AB 8134CA33
-17AC 8134CA34
-17AD 8134CA35
-17AE 8134CA36
-17AF 8134CA37
-17B0 8134CA38
-17B1 8134CA39
-17B2 8134CB30
-17B3 8134CB31
-17B4 8134CB32
-17B5 8134CB33
-17B6 8134CB34
-17B7 8134CB35
-17B8 8134CB36
-17B9 8134CB37
-17BA 8134CB38
-17BB 8134CB39
-17BC 8134CC30
-17BD 8134CC31
-17BE 8134CC32
-17BF 8134CC33
-17C0 8134CC34
-17C1 8134CC35
-17C2 8134CC36
-17C3 8134CC37
-17C4 8134CC38
-17C5 8134CC39
-17C6 8134CD30
-17C7 8134CD31
-17C8 8134CD32
-17C9 8134CD33
-17CA 8134CD34
-17CB 8134CD35
-17CC 8134CD36
-17CD 8134CD37
-17CE 8134CD38
-17CF 8134CD39
-17D0 8134CE30
-17D1 8134CE31
-17D2 8134CE32
-17D3 8134CE33
-17D4 8134CE34
-17D5 8134CE35
-17D6 8134CE36
-17D7 8134CE37
-17D8 8134CE38
-17D9 8134CE39
-17DA 8134CF30
-17DB 8134CF31
-17DC 8134CF32
-17DD 8134CF33
-17DE 8134CF34
-17DF 8134CF35
-17E0 8134CF36
-17E1 8134CF37
-17E2 8134CF38
-17E3 8134CF39
-17E4 8134D030
-17E5 8134D031
-17E6 8134D032
-17E7 8134D033
-17E8 8134D034
-17E9 8134D035
-17EA 8134D036
-17EB 8134D037
-17EC 8134D038
-17ED 8134D039
-17EE 8134D130
-17EF 8134D131
-17F0 8134D132
-17F1 8134D133
-17F2 8134D134
-17F3 8134D135
-17F4 8134D136
-17F5 8134D137
-17F6 8134D138
-17F7 8134D139
-17F8 8134D230
-17F9 8134D231
-17FA 8134D232
-17FB 8134D233
-17FC 8134D234
-17FD 8134D235
-17FE 8134D236
-17FF 8134D237
-1800 8134D238
-1801 8134D239
-1802 8134D330
-1803 8134D331
-1804 8134D332
-1805 8134D333
-1806 8134D334
-1807 8134D335
-1808 8134D336
-1809 8134D337
-180A 8134D338
-180B 8134D339
-180C 8134D430
-180D 8134D431
-180E 8134D432
-180F 8134D433
-1810 8134D434
-1811 8134D435
-1812 8134D436
-1813 8134D437
-1814 8134D438
-1815 8134D439
-1816 8134D530
-1817 8134D531
-1818 8134D532
-1819 8134D533
-181A 8134D534
-181B 8134D535
-181C 8134D536
-181D 8134D537
-181E 8134D538
-181F 8134D539
-1820 8134D630
-1821 8134D631
-1822 8134D632
-1823 8134D633
-1824 8134D634
-1825 8134D635
-1826 8134D636
-1827 8134D637
-1828 8134D638
-1829 8134D639
-182A 8134D730
-182B 8134D731
-182C 8134D732
-182D 8134D733
-182E 8134D734
-182F 8134D735
-1830 8134D736
-1831 8134D737
-1832 8134D738
-1833 8134D739
-1834 8134D830
-1835 8134D831
-1836 8134D832
-1837 8134D833
-1838 8134D834
-1839 8134D835
-183A 8134D836
-183B 8134D837
-183C 8134D838
-183D 8134D839
-183E 8134D930
-183F 8134D931
-1840 8134D932
-1841 8134D933
-1842 8134D934
-1843 8134D935
-1844 8134D936
-1845 8134D937
-1846 8134D938
-1847 8134D939
-1848 8134DA30
-1849 8134DA31
-184A 8134DA32
-184B 8134DA33
-184C 8134DA34
-184D 8134DA35
-184E 8134DA36
-184F 8134DA37
-1850 8134DA38
-1851 8134DA39
-1852 8134DB30
-1853 8134DB31
-1854 8134DB32
-1855 8134DB33
-1856 8134DB34
-1857 8134DB35
-1858 8134DB36
-1859 8134DB37
-185A 8134DB38
-185B 8134DB39
-185C 8134DC30
-185D 8134DC31
-185E 8134DC32
-185F 8134DC33
-1860 8134DC34
-1861 8134DC35
-1862 8134DC36
-1863 8134DC37
-1864 8134DC38
-1865 8134DC39
-1866 8134DD30
-1867 8134DD31
-1868 8134DD32
-1869 8134DD33
-186A 8134DD34
-186B 8134DD35
-186C 8134DD36
-186D 8134DD37
-186E 8134DD38
-186F 8134DD39
-1870 8134DE30
-1871 8134DE31
-1872 8134DE32
-1873 8134DE33
-1874 8134DE34
-1875 8134DE35
-1876 8134DE36
-1877 8134DE37
-1878 8134DE38
-1879 8134DE39
-187A 8134DF30
-187B 8134DF31
-187C 8134DF32
-187D 8134DF33
-187E 8134DF34
-187F 8134DF35
-1880 8134DF36
-1881 8134DF37
-1882 8134DF38
-1883 8134DF39
-1884 8134E030
-1885 8134E031
-1886 8134E032
-1887 8134E033
-1888 8134E034
-1889 8134E035
-188A 8134E036
-188B 8134E037
-188C 8134E038
-188D 8134E039
-188E 8134E130
-188F 8134E131
-1890 8134E132
-1891 8134E133
-1892 8134E134
-1893 8134E135
-1894 8134E136
-1895 8134E137
-1896 8134E138
-1897 8134E139
-1898 8134E230
-1899 8134E231
-189A 8134E232
-189B 8134E233
-189C 8134E234
-189D 8134E235
-189E 8134E236
-189F 8134E237
-18A0 8134E238
-18A1 8134E239
-18A2 8134E330
-18A3 8134E331
-18A4 8134E332
-18A5 8134E333
-18A6 8134E334
-18A7 8134E335
-18A8 8134E336
-18A9 8134E337
-18AA 8134E338
-18AB 8134E339
-18AC 8134E430
-18AD 8134E431
-18AE 8134E432
-18AF 8134E433
-18B0 8134E434
-18B1 8134E435
-18B2 8134E436
-18B3 8134E437
-18B4 8134E438
-18B5 8134E439
-18B6 8134E530
-18B7 8134E531
-18B8 8134E532
-18B9 8134E533
-18BA 8134E534
-18BB 8134E535
-18BC 8134E536
-18BD 8134E537
-18BE 8134E538
-18BF 8134E539
-18C0 8134E630
-18C1 8134E631
-18C2 8134E632
-18C3 8134E633
-18C4 8134E634
-18C5 8134E635
-18C6 8134E636
-18C7 8134E637
-18C8 8134E638
-18C9 8134E639
-18CA 8134E730
-18CB 8134E731
-18CC 8134E732
-18CD 8134E733
-18CE 8134E734
-18CF 8134E735
-18D0 8134E736
-18D1 8134E737
-18D2 8134E738
-18D3 8134E739
-18D4 8134E830
-18D5 8134E831
-18D6 8134E832
-18D7 8134E833
-18D8 8134E834
-18D9 8134E835
-18DA 8134E836
-18DB 8134E837
-18DC 8134E838
-18DD 8134E839
-18DE 8134E930
-18DF 8134E931
-18E0 8134E932
-18E1 8134E933
-18E2 8134E934
-18E3 8134E935
-18E4 8134E936
-18E5 8134E937
-18E6 8134E938
-18E7 8134E939
-18E8 8134EA30
-18E9 8134EA31
-18EA 8134EA32
-18EB 8134EA33
-18EC 8134EA34
-18ED 8134EA35
-18EE 8134EA36
-18EF 8134EA37
-18F0 8134EA38
-18F1 8134EA39
-18F2 8134EB30
-18F3 8134EB31
-18F4 8134EB32
-18F5 8134EB33
-18F6 8134EB34
-18F7 8134EB35
-18F8 8134EB36
-18F9 8134EB37
-18FA 8134EB38
-18FB 8134EB39
-18FC 8134EC30
-18FD 8134EC31
-18FE 8134EC32
-18FF 8134EC33
-1900 8134EC34
-1901 8134EC35
-1902 8134EC36
-1903 8134EC37
-1904 8134EC38
-1905 8134EC39
-1906 8134ED30
-1907 8134ED31
-1908 8134ED32
-1909 8134ED33
-190A 8134ED34
-190B 8134ED35
-190C 8134ED36
-190D 8134ED37
-190E 8134ED38
-190F 8134ED39
-1910 8134EE30
-1911 8134EE31
-1912 8134EE32
-1913 8134EE33
-1914 8134EE34
-1915 8134EE35
-1916 8134EE36
-1917 8134EE37
-1918 8134EE38
-1919 8134EE39
-191A 8134EF30
-191B 8134EF31
-191C 8134EF32
-191D 8134EF33
-191E 8134EF34
-191F 8134EF35
-1920 8134EF36
-1921 8134EF37
-1922 8134EF38
-1923 8134EF39
-1924 8134F030
-1925 8134F031
-1926 8134F032
-1927 8134F033
-1928 8134F034
-1929 8134F035
-192A 8134F036
-192B 8134F037
-192C 8134F038
-192D 8134F039
-192E 8134F130
-192F 8134F131
-1930 8134F132
-1931 8134F133
-1932 8134F134
-1933 8134F135
-1934 8134F136
-1935 8134F137
-1936 8134F138
-1937 8134F139
-1938 8134F230
-1939 8134F231
-193A 8134F232
-193B 8134F233
-193C 8134F234
-193D 8134F235
-193E 8134F236
-193F 8134F237
-1940 8134F238
-1941 8134F239
-1942 8134F330
-1943 8134F331
-1944 8134F332
-1945 8134F333
-1946 8134F334
-1947 8134F335
-1948 8134F336
-1949 8134F337
-194A 8134F338
-194B 8134F339
-194C 8134F430
-194D 8134F431
-194E 8134F432
-194F 8134F433
-1950 8134F434
-1951 8134F435
-1952 8134F436
-1953 8134F437
-1954 8134F438
-1955 8134F439
-1956 8134F530
-1957 8134F531
-1958 8134F532
-1959 8134F533
-195A 8134F534
-195B 8134F535
-195C 8134F536
-195D 8134F537
-195E 8134F538
-195F 8134F539
-1960 8134F630
-1961 8134F631
-1962 8134F632
-1963 8134F633
-1964 8134F634
-1965 8134F635
-1966 8134F636
-1967 8134F637
-1968 8134F638
-1969 8134F639
-196A 8134F730
-196B 8134F731
-196C 8134F732
-196D 8134F733
-196E 8134F734
-196F 8134F735
-1970 8134F736
-1971 8134F737
-1972 8134F738
-1973 8134F739
-1974 8134F830
-1975 8134F831
-1976 8134F832
-1977 8134F833
-1978 8134F834
-1979 8134F835
-197A 8134F836
-197B 8134F837
-197C 8134F838
-197D 8134F839
-197E 8134F930
-197F 8134F931
-1980 8134F932
-1981 8134F933
-1982 8134F934
-1983 8134F935
-1984 8134F936
-1985 8134F937
-1986 8134F938
-1987 8134F939
-1988 8134FA30
-1989 8134FA31
-198A 8134FA32
-198B 8134FA33
-198C 8134FA34
-198D 8134FA35
-198E 8134FA36
-198F 8134FA37
-1990 8134FA38
-1991 8134FA39
-1992 8134FB30
-1993 8134FB31
-1994 8134FB32
-1995 8134FB33
-1996 8134FB34
-1997 8134FB35
-1998 8134FB36
-1999 8134FB37
-199A 8134FB38
-199B 8134FB39
-199C 8134FC30
-199D 8134FC31
-199E 8134FC32
-199F 8134FC33
-19A0 8134FC34
-19A1 8134FC35
-19A2 8134FC36
-19A3 8134FC37
-19A4 8134FC38
-19A5 8134FC39
-19A6 8134FD30
-19A7 8134FD31
-19A8 8134FD32
-19A9 8134FD33
-19AA 8134FD34
-19AB 8134FD35
-19AC 8134FD36
-19AD 8134FD37
-19AE 8134FD38
-19AF 8134FD39
-19B0 8134FE30
-19B1 8134FE31
-19B2 8134FE32
-19B3 8134FE33
-19B4 8134FE34
-19B5 8134FE35
-19B6 8134FE36
-19B7 8134FE37
-19B8 8134FE38
-19B9 8134FE39
-19BA 81358130
-19BB 81358131
-19BC 81358132
-19BD 81358133
-19BE 81358134
-19BF 81358135
-19C0 81358136
-19C1 81358137
-19C2 81358138
-19C3 81358139
-19C4 81358230
-19C5 81358231
-19C6 81358232
-19C7 81358233
-19C8 81358234
-19C9 81358235
-19CA 81358236
-19CB 81358237
-19CC 81358238
-19CD 81358239
-19CE 81358330
-19CF 81358331
-19D0 81358332
-19D1 81358333
-19D2 81358334
-19D3 81358335
-19D4 81358336
-19D5 81358337
-19D6 81358338
-19D7 81358339
-19D8 81358430
-19D9 81358431
-19DA 81358432
-19DB 81358433
-19DC 81358434
-19DD 81358435
-19DE 81358436
-19DF 81358437
-19E0 81358438
-19E1 81358439
-19E2 81358530
-19E3 81358531
-19E4 81358532
-19E5 81358533
-19E6 81358534
-19E7 81358535
-19E8 81358536
-19E9 81358537
-19EA 81358538
-19EB 81358539
-19EC 81358630
-19ED 81358631
-19EE 81358632
-19EF 81358633
-19F0 81358634
-19F1 81358635
-19F2 81358636
-19F3 81358637
-19F4 81358638
-19F5 81358639
-19F6 81358730
-19F7 81358731
-19F8 81358732
-19F9 81358733
-19FA 81358734
-19FB 81358735
-19FC 81358736
-19FD 81358737
-19FE 81358738
-19FF 81358739
-1A00 81358830
-1A01 81358831
-1A02 81358832
-1A03 81358833
-1A04 81358834
-1A05 81358835
-1A06 81358836
-1A07 81358837
-1A08 81358838
-1A09 81358839
-1A0A 81358930
-1A0B 81358931
-1A0C 81358932
-1A0D 81358933
-1A0E 81358934
-1A0F 81358935
-1A10 81358936
-1A11 81358937
-1A12 81358938
-1A13 81358939
-1A14 81358A30
-1A15 81358A31
-1A16 81358A32
-1A17 81358A33
-1A18 81358A34
-1A19 81358A35
-1A1A 81358A36
-1A1B 81358A37
-1A1C 81358A38
-1A1D 81358A39
-1A1E 81358B30
-1A1F 81358B31
-1A20 81358B32
-1A21 81358B33
-1A22 81358B34
-1A23 81358B35
-1A24 81358B36
-1A25 81358B37
-1A26 81358B38
-1A27 81358B39
-1A28 81358C30
-1A29 81358C31
-1A2A 81358C32
-1A2B 81358C33
-1A2C 81358C34
-1A2D 81358C35
-1A2E 81358C36
-1A2F 81358C37
-1A30 81358C38
-1A31 81358C39
-1A32 81358D30
-1A33 81358D31
-1A34 81358D32
-1A35 81358D33
-1A36 81358D34
-1A37 81358D35
-1A38 81358D36
-1A39 81358D37
-1A3A 81358D38
-1A3B 81358D39
-1A3C 81358E30
-1A3D 81358E31
-1A3E 81358E32
-1A3F 81358E33
-1A40 81358E34
-1A41 81358E35
-1A42 81358E36
-1A43 81358E37
-1A44 81358E38
-1A45 81358E39
-1A46 81358F30
-1A47 81358F31
-1A48 81358F32
-1A49 81358F33
-1A4A 81358F34
-1A4B 81358F35
-1A4C 81358F36
-1A4D 81358F37
-1A4E 81358F38
-1A4F 81358F39
-1A50 81359030
-1A51 81359031
-1A52 81359032
-1A53 81359033
-1A54 81359034
-1A55 81359035
-1A56 81359036
-1A57 81359037
-1A58 81359038
-1A59 81359039
-1A5A 81359130
-1A5B 81359131
-1A5C 81359132
-1A5D 81359133
-1A5E 81359134
-1A5F 81359135
-1A60 81359136
-1A61 81359137
-1A62 81359138
-1A63 81359139
-1A64 81359230
-1A65 81359231
-1A66 81359232
-1A67 81359233
-1A68 81359234
-1A69 81359235
-1A6A 81359236
-1A6B 81359237
-1A6C 81359238
-1A6D 81359239
-1A6E 81359330
-1A6F 81359331
-1A70 81359332
-1A71 81359333
-1A72 81359334
-1A73 81359335
-1A74 81359336
-1A75 81359337
-1A76 81359338
-1A77 81359339
-1A78 81359430
-1A79 81359431
-1A7A 81359432
-1A7B 81359433
-1A7C 81359434
-1A7D 81359435
-1A7E 81359436
-1A7F 81359437
-1A80 81359438
-1A81 81359439
-1A82 81359530
-1A83 81359531
-1A84 81359532
-1A85 81359533
-1A86 81359534
-1A87 81359535
-1A88 81359536
-1A89 81359537
-1A8A 81359538
-1A8B 81359539
-1A8C 81359630
-1A8D 81359631
-1A8E 81359632
-1A8F 81359633
-1A90 81359634
-1A91 81359635
-1A92 81359636
-1A93 81359637
-1A94 81359638
-1A95 81359639
-1A96 81359730
-1A97 81359731
-1A98 81359732
-1A99 81359733
-1A9A 81359734
-1A9B 81359735
-1A9C 81359736
-1A9D 81359737
-1A9E 81359738
-1A9F 81359739
-1AA0 81359830
-1AA1 81359831
-1AA2 81359832
-1AA3 81359833
-1AA4 81359834
-1AA5 81359835
-1AA6 81359836
-1AA7 81359837
-1AA8 81359838
-1AA9 81359839
-1AAA 81359930
-1AAB 81359931
-1AAC 81359932
-1AAD 81359933
-1AAE 81359934
-1AAF 81359935
-1AB0 81359936
-1AB1 81359937
-1AB2 81359938
-1AB3 81359939
-1AB4 81359A30
-1AB5 81359A31
-1AB6 81359A32
-1AB7 81359A33
-1AB8 81359A34
-1AB9 81359A35
-1ABA 81359A36
-1ABB 81359A37
-1ABC 81359A38
-1ABD 81359A39
-1ABE 81359B30
-1ABF 81359B31
-1AC0 81359B32
-1AC1 81359B33
-1AC2 81359B34
-1AC3 81359B35
-1AC4 81359B36
-1AC5 81359B37
-1AC6 81359B38
-1AC7 81359B39
-1AC8 81359C30
-1AC9 81359C31
-1ACA 81359C32
-1ACB 81359C33
-1ACC 81359C34
-1ACD 81359C35
-1ACE 81359C36
-1ACF 81359C37
-1AD0 81359C38
-1AD1 81359C39
-1AD2 81359D30
-1AD3 81359D31
-1AD4 81359D32
-1AD5 81359D33
-1AD6 81359D34
-1AD7 81359D35
-1AD8 81359D36
-1AD9 81359D37
-1ADA 81359D38
-1ADB 81359D39
-1ADC 81359E30
-1ADD 81359E31
-1ADE 81359E32
-1ADF 81359E33
-1AE0 81359E34
-1AE1 81359E35
-1AE2 81359E36
-1AE3 81359E37
-1AE4 81359E38
-1AE5 81359E39
-1AE6 81359F30
-1AE7 81359F31
-1AE8 81359F32
-1AE9 81359F33
-1AEA 81359F34
-1AEB 81359F35
-1AEC 81359F36
-1AED 81359F37
-1AEE 81359F38
-1AEF 81359F39
-1AF0 8135A030
-1AF1 8135A031
-1AF2 8135A032
-1AF3 8135A033
-1AF4 8135A034
-1AF5 8135A035
-1AF6 8135A036
-1AF7 8135A037
-1AF8 8135A038
-1AF9 8135A039
-1AFA 8135A130
-1AFB 8135A131
-1AFC 8135A132
-1AFD 8135A133
-1AFE 8135A134
-1AFF 8135A135
-1B00 8135A136
-1B01 8135A137
-1B02 8135A138
-1B03 8135A139
-1B04 8135A230
-1B05 8135A231
-1B06 8135A232
-1B07 8135A233
-1B08 8135A234
-1B09 8135A235
-1B0A 8135A236
-1B0B 8135A237
-1B0C 8135A238
-1B0D 8135A239
-1B0E 8135A330
-1B0F 8135A331
-1B10 8135A332
-1B11 8135A333
-1B12 8135A334
-1B13 8135A335
-1B14 8135A336
-1B15 8135A337
-1B16 8135A338
-1B17 8135A339
-1B18 8135A430
-1B19 8135A431
-1B1A 8135A432
-1B1B 8135A433
-1B1C 8135A434
-1B1D 8135A435
-1B1E 8135A436
-1B1F 8135A437
-1B20 8135A438
-1B21 8135A439
-1B22 8135A530
-1B23 8135A531
-1B24 8135A532
-1B25 8135A533
-1B26 8135A534
-1B27 8135A535
-1B28 8135A536
-1B29 8135A537
-1B2A 8135A538
-1B2B 8135A539
-1B2C 8135A630
-1B2D 8135A631
-1B2E 8135A632
-1B2F 8135A633
-1B30 8135A634
-1B31 8135A635
-1B32 8135A636
-1B33 8135A637
-1B34 8135A638
-1B35 8135A639
-1B36 8135A730
-1B37 8135A731
-1B38 8135A732
-1B39 8135A733
-1B3A 8135A734
-1B3B 8135A735
-1B3C 8135A736
-1B3D 8135A737
-1B3E 8135A738
-1B3F 8135A739
-1B40 8135A830
-1B41 8135A831
-1B42 8135A832
-1B43 8135A833
-1B44 8135A834
-1B45 8135A835
-1B46 8135A836
-1B47 8135A837
-1B48 8135A838
-1B49 8135A839
-1B4A 8135A930
-1B4B 8135A931
-1B4C 8135A932
-1B4D 8135A933
-1B4E 8135A934
-1B4F 8135A935
-1B50 8135A936
-1B51 8135A937
-1B52 8135A938
-1B53 8135A939
-1B54 8135AA30
-1B55 8135AA31
-1B56 8135AA32
-1B57 8135AA33
-1B58 8135AA34
-1B59 8135AA35
-1B5A 8135AA36
-1B5B 8135AA37
-1B5C 8135AA38
-1B5D 8135AA39
-1B5E 8135AB30
-1B5F 8135AB31
-1B60 8135AB32
-1B61 8135AB33
-1B62 8135AB34
-1B63 8135AB35
-1B64 8135AB36
-1B65 8135AB37
-1B66 8135AB38
-1B67 8135AB39
-1B68 8135AC30
-1B69 8135AC31
-1B6A 8135AC32
-1B6B 8135AC33
-1B6C 8135AC34
-1B6D 8135AC35
-1B6E 8135AC36
-1B6F 8135AC37
-1B70 8135AC38
-1B71 8135AC39
-1B72 8135AD30
-1B73 8135AD31
-1B74 8135AD32
-1B75 8135AD33
-1B76 8135AD34
-1B77 8135AD35
-1B78 8135AD36
-1B79 8135AD37
-1B7A 8135AD38
-1B7B 8135AD39
-1B7C 8135AE30
-1B7D 8135AE31
-1B7E 8135AE32
-1B7F 8135AE33
-1B80 8135AE34
-1B81 8135AE35
-1B82 8135AE36
-1B83 8135AE37
-1B84 8135AE38
-1B85 8135AE39
-1B86 8135AF30
-1B87 8135AF31
-1B88 8135AF32
-1B89 8135AF33
-1B8A 8135AF34
-1B8B 8135AF35
-1B8C 8135AF36
-1B8D 8135AF37
-1B8E 8135AF38
-1B8F 8135AF39
-1B90 8135B030
-1B91 8135B031
-1B92 8135B032
-1B93 8135B033
-1B94 8135B034
-1B95 8135B035
-1B96 8135B036
-1B97 8135B037
-1B98 8135B038
-1B99 8135B039
-1B9A 8135B130
-1B9B 8135B131
-1B9C 8135B132
-1B9D 8135B133
-1B9E 8135B134
-1B9F 8135B135
-1BA0 8135B136
-1BA1 8135B137
-1BA2 8135B138
-1BA3 8135B139
-1BA4 8135B230
-1BA5 8135B231
-1BA6 8135B232
-1BA7 8135B233
-1BA8 8135B234
-1BA9 8135B235
-1BAA 8135B236
-1BAB 8135B237
-1BAC 8135B238
-1BAD 8135B239
-1BAE 8135B330
-1BAF 8135B331
-1BB0 8135B332
-1BB1 8135B333
-1BB2 8135B334
-1BB3 8135B335
-1BB4 8135B336
-1BB5 8135B337
-1BB6 8135B338
-1BB7 8135B339
-1BB8 8135B430
-1BB9 8135B431
-1BBA 8135B432
-1BBB 8135B433
-1BBC 8135B434
-1BBD 8135B435
-1BBE 8135B436
-1BBF 8135B437
-1BC0 8135B438
-1BC1 8135B439
-1BC2 8135B530
-1BC3 8135B531
-1BC4 8135B532
-1BC5 8135B533
-1BC6 8135B534
-1BC7 8135B535
-1BC8 8135B536
-1BC9 8135B537
-1BCA 8135B538
-1BCB 8135B539
-1BCC 8135B630
-1BCD 8135B631
-1BCE 8135B632
-1BCF 8135B633
-1BD0 8135B634
-1BD1 8135B635
-1BD2 8135B636
-1BD3 8135B637
-1BD4 8135B638
-1BD5 8135B639
-1BD6 8135B730
-1BD7 8135B731
-1BD8 8135B732
-1BD9 8135B733
-1BDA 8135B734
-1BDB 8135B735
-1BDC 8135B736
-1BDD 8135B737
-1BDE 8135B738
-1BDF 8135B739
-1BE0 8135B830
-1BE1 8135B831
-1BE2 8135B832
-1BE3 8135B833
-1BE4 8135B834
-1BE5 8135B835
-1BE6 8135B836
-1BE7 8135B837
-1BE8 8135B838
-1BE9 8135B839
-1BEA 8135B930
-1BEB 8135B931
-1BEC 8135B932
-1BED 8135B933
-1BEE 8135B934
-1BEF 8135B935
-1BF0 8135B936
-1BF1 8135B937
-1BF2 8135B938
-1BF3 8135B939
-1BF4 8135BA30
-1BF5 8135BA31
-1BF6 8135BA32
-1BF7 8135BA33
-1BF8 8135BA34
-1BF9 8135BA35
-1BFA 8135BA36
-1BFB 8135BA37
-1BFC 8135BA38
-1BFD 8135BA39
-1BFE 8135BB30
-1BFF 8135BB31
-1C00 8135BB32
-1C01 8135BB33
-1C02 8135BB34
-1C03 8135BB35
-1C04 8135BB36
-1C05 8135BB37
-1C06 8135BB38
-1C07 8135BB39
-1C08 8135BC30
-1C09 8135BC31
-1C0A 8135BC32
-1C0B 8135BC33
-1C0C 8135BC34
-1C0D 8135BC35
-1C0E 8135BC36
-1C0F 8135BC37
-1C10 8135BC38
-1C11 8135BC39
-1C12 8135BD30
-1C13 8135BD31
-1C14 8135BD32
-1C15 8135BD33
-1C16 8135BD34
-1C17 8135BD35
-1C18 8135BD36
-1C19 8135BD37
-1C1A 8135BD38
-1C1B 8135BD39
-1C1C 8135BE30
-1C1D 8135BE31
-1C1E 8135BE32
-1C1F 8135BE33
-1C20 8135BE34
-1C21 8135BE35
-1C22 8135BE36
-1C23 8135BE37
-1C24 8135BE38
-1C25 8135BE39
-1C26 8135BF30
-1C27 8135BF31
-1C28 8135BF32
-1C29 8135BF33
-1C2A 8135BF34
-1C2B 8135BF35
-1C2C 8135BF36
-1C2D 8135BF37
-1C2E 8135BF38
-1C2F 8135BF39
-1C30 8135C030
-1C31 8135C031
-1C32 8135C032
-1C33 8135C033
-1C34 8135C034
-1C35 8135C035
-1C36 8135C036
-1C37 8135C037
-1C38 8135C038
-1C39 8135C039
-1C3A 8135C130
-1C3B 8135C131
-1C3C 8135C132
-1C3D 8135C133
-1C3E 8135C134
-1C3F 8135C135
-1C40 8135C136
-1C41 8135C137
-1C42 8135C138
-1C43 8135C139
-1C44 8135C230
-1C45 8135C231
-1C46 8135C232
-1C47 8135C233
-1C48 8135C234
-1C49 8135C235
-1C4A 8135C236
-1C4B 8135C237
-1C4C 8135C238
-1C4D 8135C239
-1C4E 8135C330
-1C4F 8135C331
-1C50 8135C332
-1C51 8135C333
-1C52 8135C334
-1C53 8135C335
-1C54 8135C336
-1C55 8135C337
-1C56 8135C338
-1C57 8135C339
-1C58 8135C430
-1C59 8135C431
-1C5A 8135C432
-1C5B 8135C433
-1C5C 8135C434
-1C5D 8135C435
-1C5E 8135C436
-1C5F 8135C437
-1C60 8135C438
-1C61 8135C439
-1C62 8135C530
-1C63 8135C531
-1C64 8135C532
-1C65 8135C533
-1C66 8135C534
-1C67 8135C535
-1C68 8135C536
-1C69 8135C537
-1C6A 8135C538
-1C6B 8135C539
-1C6C 8135C630
-1C6D 8135C631
-1C6E 8135C632
-1C6F 8135C633
-1C70 8135C634
-1C71 8135C635
-1C72 8135C636
-1C73 8135C637
-1C74 8135C638
-1C75 8135C639
-1C76 8135C730
-1C77 8135C731
-1C78 8135C732
-1C79 8135C733
-1C7A 8135C734
-1C7B 8135C735
-1C7C 8135C736
-1C7D 8135C737
-1C7E 8135C738
-1C7F 8135C739
-1C80 8135C830
-1C81 8135C831
-1C82 8135C832
-1C83 8135C833
-1C84 8135C834
-1C85 8135C835
-1C86 8135C836
-1C87 8135C837
-1C88 8135C838
-1C89 8135C839
-1C8A 8135C930
-1C8B 8135C931
-1C8C 8135C932
-1C8D 8135C933
-1C8E 8135C934
-1C8F 8135C935
-1C90 8135C936
-1C91 8135C937
-1C92 8135C938
-1C93 8135C939
-1C94 8135CA30
-1C95 8135CA31
-1C96 8135CA32
-1C97 8135CA33
-1C98 8135CA34
-1C99 8135CA35
-1C9A 8135CA36
-1C9B 8135CA37
-1C9C 8135CA38
-1C9D 8135CA39
-1C9E 8135CB30
-1C9F 8135CB31
-1CA0 8135CB32
-1CA1 8135CB33
-1CA2 8135CB34
-1CA3 8135CB35
-1CA4 8135CB36
-1CA5 8135CB37
-1CA6 8135CB38
-1CA7 8135CB39
-1CA8 8135CC30
-1CA9 8135CC31
-1CAA 8135CC32
-1CAB 8135CC33
-1CAC 8135CC34
-1CAD 8135CC35
-1CAE 8135CC36
-1CAF 8135CC37
-1CB0 8135CC38
-1CB1 8135CC39
-1CB2 8135CD30
-1CB3 8135CD31
-1CB4 8135CD32
-1CB5 8135CD33
-1CB6 8135CD34
-1CB7 8135CD35
-1CB8 8135CD36
-1CB9 8135CD37
-1CBA 8135CD38
-1CBB 8135CD39
-1CBC 8135CE30
-1CBD 8135CE31
-1CBE 8135CE32
-1CBF 8135CE33
-1CC0 8135CE34
-1CC1 8135CE35
-1CC2 8135CE36
-1CC3 8135CE37
-1CC4 8135CE38
-1CC5 8135CE39
-1CC6 8135CF30
-1CC7 8135CF31
-1CC8 8135CF32
-1CC9 8135CF33
-1CCA 8135CF34
-1CCB 8135CF35
-1CCC 8135CF36
-1CCD 8135CF37
-1CCE 8135CF38
-1CCF 8135CF39
-1CD0 8135D030
-1CD1 8135D031
-1CD2 8135D032
-1CD3 8135D033
-1CD4 8135D034
-1CD5 8135D035
-1CD6 8135D036
-1CD7 8135D037
-1CD8 8135D038
-1CD9 8135D039
-1CDA 8135D130
-1CDB 8135D131
-1CDC 8135D132
-1CDD 8135D133
-1CDE 8135D134
-1CDF 8135D135
-1CE0 8135D136
-1CE1 8135D137
-1CE2 8135D138
-1CE3 8135D139
-1CE4 8135D230
-1CE5 8135D231
-1CE6 8135D232
-1CE7 8135D233
-1CE8 8135D234
-1CE9 8135D235
-1CEA 8135D236
-1CEB 8135D237
-1CEC 8135D238
-1CED 8135D239
-1CEE 8135D330
-1CEF 8135D331
-1CF0 8135D332
-1CF1 8135D333
-1CF2 8135D334
-1CF3 8135D335
-1CF4 8135D336
-1CF5 8135D337
-1CF6 8135D338
-1CF7 8135D339
-1CF8 8135D430
-1CF9 8135D431
-1CFA 8135D432
-1CFB 8135D433
-1CFC 8135D434
-1CFD 8135D435
-1CFE 8135D436
-1CFF 8135D437
-1D00 8135D438
-1D01 8135D439
-1D02 8135D530
-1D03 8135D531
-1D04 8135D532
-1D05 8135D533
-1D06 8135D534
-1D07 8135D535
-1D08 8135D536
-1D09 8135D537
-1D0A 8135D538
-1D0B 8135D539
-1D0C 8135D630
-1D0D 8135D631
-1D0E 8135D632
-1D0F 8135D633
-1D10 8135D634
-1D11 8135D635
-1D12 8135D636
-1D13 8135D637
-1D14 8135D638
-1D15 8135D639
-1D16 8135D730
-1D17 8135D731
-1D18 8135D732
-1D19 8135D733
-1D1A 8135D734
-1D1B 8135D735
-1D1C 8135D736
-1D1D 8135D737
-1D1E 8135D738
-1D1F 8135D739
-1D20 8135D830
-1D21 8135D831
-1D22 8135D832
-1D23 8135D833
-1D24 8135D834
-1D25 8135D835
-1D26 8135D836
-1D27 8135D837
-1D28 8135D838
-1D29 8135D839
-1D2A 8135D930
-1D2B 8135D931
-1D2C 8135D932
-1D2D 8135D933
-1D2E 8135D934
-1D2F 8135D935
-1D30 8135D936
-1D31 8135D937
-1D32 8135D938
-1D33 8135D939
-1D34 8135DA30
-1D35 8135DA31
-1D36 8135DA32
-1D37 8135DA33
-1D38 8135DA34
-1D39 8135DA35
-1D3A 8135DA36
-1D3B 8135DA37
-1D3C 8135DA38
-1D3D 8135DA39
-1D3E 8135DB30
-1D3F 8135DB31
-1D40 8135DB32
-1D41 8135DB33
-1D42 8135DB34
-1D43 8135DB35
-1D44 8135DB36
-1D45 8135DB37
-1D46 8135DB38
-1D47 8135DB39
-1D48 8135DC30
-1D49 8135DC31
-1D4A 8135DC32
-1D4B 8135DC33
-1D4C 8135DC34
-1D4D 8135DC35
-1D4E 8135DC36
-1D4F 8135DC37
-1D50 8135DC38
-1D51 8135DC39
-1D52 8135DD30
-1D53 8135DD31
-1D54 8135DD32
-1D55 8135DD33
-1D56 8135DD34
-1D57 8135DD35
-1D58 8135DD36
-1D59 8135DD37
-1D5A 8135DD38
-1D5B 8135DD39
-1D5C 8135DE30
-1D5D 8135DE31
-1D5E 8135DE32
-1D5F 8135DE33
-1D60 8135DE34
-1D61 8135DE35
-1D62 8135DE36
-1D63 8135DE37
-1D64 8135DE38
-1D65 8135DE39
-1D66 8135DF30
-1D67 8135DF31
-1D68 8135DF32
-1D69 8135DF33
-1D6A 8135DF34
-1D6B 8135DF35
-1D6C 8135DF36
-1D6D 8135DF37
-1D6E 8135DF38
-1D6F 8135DF39
-1D70 8135E030
-1D71 8135E031
-1D72 8135E032
-1D73 8135E033
-1D74 8135E034
-1D75 8135E035
-1D76 8135E036
-1D77 8135E037
-1D78 8135E038
-1D79 8135E039
-1D7A 8135E130
-1D7B 8135E131
-1D7C 8135E132
-1D7D 8135E133
-1D7E 8135E134
-1D7F 8135E135
-1D80 8135E136
-1D81 8135E137
-1D82 8135E138
-1D83 8135E139
-1D84 8135E230
-1D85 8135E231
-1D86 8135E232
-1D87 8135E233
-1D88 8135E234
-1D89 8135E235
-1D8A 8135E236
-1D8B 8135E237
-1D8C 8135E238
-1D8D 8135E239
-1D8E 8135E330
-1D8F 8135E331
-1D90 8135E332
-1D91 8135E333
-1D92 8135E334
-1D93 8135E335
-1D94 8135E336
-1D95 8135E337
-1D96 8135E338
-1D97 8135E339
-1D98 8135E430
-1D99 8135E431
-1D9A 8135E432
-1D9B 8135E433
-1D9C 8135E434
-1D9D 8135E435
-1D9E 8135E436
-1D9F 8135E437
-1DA0 8135E438
-1DA1 8135E439
-1DA2 8135E530
-1DA3 8135E531
-1DA4 8135E532
-1DA5 8135E533
-1DA6 8135E534
-1DA7 8135E535
-1DA8 8135E536
-1DA9 8135E537
-1DAA 8135E538
-1DAB 8135E539
-1DAC 8135E630
-1DAD 8135E631
-1DAE 8135E632
-1DAF 8135E633
-1DB0 8135E634
-1DB1 8135E635
-1DB2 8135E636
-1DB3 8135E637
-1DB4 8135E638
-1DB5 8135E639
-1DB6 8135E730
-1DB7 8135E731
-1DB8 8135E732
-1DB9 8135E733
-1DBA 8135E734
-1DBB 8135E735
-1DBC 8135E736
-1DBD 8135E737
-1DBE 8135E738
-1DBF 8135E739
-1DC0 8135E830
-1DC1 8135E831
-1DC2 8135E832
-1DC3 8135E833
-1DC4 8135E834
-1DC5 8135E835
-1DC6 8135E836
-1DC7 8135E837
-1DC8 8135E838
-1DC9 8135E839
-1DCA 8135E930
-1DCB 8135E931
-1DCC 8135E932
-1DCD 8135E933
-1DCE 8135E934
-1DCF 8135E935
-1DD0 8135E936
-1DD1 8135E937
-1DD2 8135E938
-1DD3 8135E939
-1DD4 8135EA30
-1DD5 8135EA31
-1DD6 8135EA32
-1DD7 8135EA33
-1DD8 8135EA34
-1DD9 8135EA35
-1DDA 8135EA36
-1DDB 8135EA37
-1DDC 8135EA38
-1DDD 8135EA39
-1DDE 8135EB30
-1DDF 8135EB31
-1DE0 8135EB32
-1DE1 8135EB33
-1DE2 8135EB34
-1DE3 8135EB35
-1DE4 8135EB36
-1DE5 8135EB37
-1DE6 8135EB38
-1DE7 8135EB39
-1DE8 8135EC30
-1DE9 8135EC31
-1DEA 8135EC32
-1DEB 8135EC33
-1DEC 8135EC34
-1DED 8135EC35
-1DEE 8135EC36
-1DEF 8135EC37
-1DF0 8135EC38
-1DF1 8135EC39
-1DF2 8135ED30
-1DF3 8135ED31
-1DF4 8135ED32
-1DF5 8135ED33
-1DF6 8135ED34
-1DF7 8135ED35
-1DF8 8135ED36
-1DF9 8135ED37
-1DFA 8135ED38
-1DFB 8135ED39
-1DFC 8135EE30
-1DFD 8135EE31
-1DFE 8135EE32
-1DFF 8135EE33
-1E00 8135EE34
-1E01 8135EE35
-1E02 8135EE36
-1E03 8135EE37
-1E04 8135EE38
-1E05 8135EE39
-1E06 8135EF30
-1E07 8135EF31
-1E08 8135EF32
-1E09 8135EF33
-1E0A 8135EF34
-1E0B 8135EF35
-1E0C 8135EF36
-1E0D 8135EF37
-1E0E 8135EF38
-1E0F 8135EF39
-1E10 8135F030
-1E11 8135F031
-1E12 8135F032
-1E13 8135F033
-1E14 8135F034
-1E15 8135F035
-1E16 8135F036
-1E17 8135F037
-1E18 8135F038
-1E19 8135F039
-1E1A 8135F130
-1E1B 8135F131
-1E1C 8135F132
-1E1D 8135F133
-1E1E 8135F134
-1E1F 8135F135
-1E20 8135F136
-1E21 8135F137
-1E22 8135F138
-1E23 8135F139
-1E24 8135F230
-1E25 8135F231
-1E26 8135F232
-1E27 8135F233
-1E28 8135F234
-1E29 8135F235
-1E2A 8135F236
-1E2B 8135F237
-1E2C 8135F238
-1E2D 8135F239
-1E2E 8135F330
-1E2F 8135F331
-1E30 8135F332
-1E31 8135F333
-1E32 8135F334
-1E33 8135F335
-1E34 8135F336
-1E35 8135F337
-1E36 8135F338
-1E37 8135F339
-1E38 8135F430
-1E39 8135F431
-1E3A 8135F432
-1E3B 8135F433
-1E3C 8135F434
-1E3D 8135F435
-1E3E 8135F436
-1E3F 8135F437
-1E40 8135F438
-1E41 8135F439
-1E42 8135F530
-1E43 8135F531
-1E44 8135F532
-1E45 8135F533
-1E46 8135F534
-1E47 8135F535
-1E48 8135F536
-1E49 8135F537
-1E4A 8135F538
-1E4B 8135F539
-1E4C 8135F630
-1E4D 8135F631
-1E4E 8135F632
-1E4F 8135F633
-1E50 8135F634
-1E51 8135F635
-1E52 8135F636
-1E53 8135F637
-1E54 8135F638
-1E55 8135F639
-1E56 8135F730
-1E57 8135F731
-1E58 8135F732
-1E59 8135F733
-1E5A 8135F734
-1E5B 8135F735
-1E5C 8135F736
-1E5D 8135F737
-1E5E 8135F738
-1E5F 8135F739
-1E60 8135F830
-1E61 8135F831
-1E62 8135F832
-1E63 8135F833
-1E64 8135F834
-1E65 8135F835
-1E66 8135F836
-1E67 8135F837
-1E68 8135F838
-1E69 8135F839
-1E6A 8135F930
-1E6B 8135F931
-1E6C 8135F932
-1E6D 8135F933
-1E6E 8135F934
-1E6F 8135F935
-1E70 8135F936
-1E71 8135F937
-1E72 8135F938
-1E73 8135F939
-1E74 8135FA30
-1E75 8135FA31
-1E76 8135FA32
-1E77 8135FA33
-1E78 8135FA34
-1E79 8135FA35
-1E7A 8135FA36
-1E7B 8135FA37
-1E7C 8135FA38
-1E7D 8135FA39
-1E7E 8135FB30
-1E7F 8135FB31
-1E80 8135FB32
-1E81 8135FB33
-1E82 8135FB34
-1E83 8135FB35
-1E84 8135FB36
-1E85 8135FB37
-1E86 8135FB38
-1E87 8135FB39
-1E88 8135FC30
-1E89 8135FC31
-1E8A 8135FC32
-1E8B 8135FC33
-1E8C 8135FC34
-1E8D 8135FC35
-1E8E 8135FC36
-1E8F 8135FC37
-1E90 8135FC38
-1E91 8135FC39
-1E92 8135FD30
-1E93 8135FD31
-1E94 8135FD32
-1E95 8135FD33
-1E96 8135FD34
-1E97 8135FD35
-1E98 8135FD36
-1E99 8135FD37
-1E9A 8135FD38
-1E9B 8135FD39
-1E9C 8135FE30
-1E9D 8135FE31
-1E9E 8135FE32
-1E9F 8135FE33
-1EA0 8135FE34
-1EA1 8135FE35
-1EA2 8135FE36
-1EA3 8135FE37
-1EA4 8135FE38
-1EA5 8135FE39
-1EA6 81368130
-1EA7 81368131
-1EA8 81368132
-1EA9 81368133
-1EAA 81368134
-1EAB 81368135
-1EAC 81368136
-1EAD 81368137
-1EAE 81368138
-1EAF 81368139
-1EB0 81368230
-1EB1 81368231
-1EB2 81368232
-1EB3 81368233
-1EB4 81368234
-1EB5 81368235
-1EB6 81368236
-1EB7 81368237
-1EB8 81368238
-1EB9 81368239
-1EBA 81368330
-1EBB 81368331
-1EBC 81368332
-1EBD 81368333
-1EBE 81368334
-1EBF 81368335
-1EC0 81368336
-1EC1 81368337
-1EC2 81368338
-1EC3 81368339
-1EC4 81368430
-1EC5 81368431
-1EC6 81368432
-1EC7 81368433
-1EC8 81368434
-1EC9 81368435
-1ECA 81368436
-1ECB 81368437
-1ECC 81368438
-1ECD 81368439
-1ECE 81368530
-1ECF 81368531
-1ED0 81368532
-1ED1 81368533
-1ED2 81368534
-1ED3 81368535
-1ED4 81368536
-1ED5 81368537
-1ED6 81368538
-1ED7 81368539
-1ED8 81368630
-1ED9 81368631
-1EDA 81368632
-1EDB 81368633
-1EDC 81368634
-1EDD 81368635
-1EDE 81368636
-1EDF 81368637
-1EE0 81368638
-1EE1 81368639
-1EE2 81368730
-1EE3 81368731
-1EE4 81368732
-1EE5 81368733
-1EE6 81368734
-1EE7 81368735
-1EE8 81368736
-1EE9 81368737
-1EEA 81368738
-1EEB 81368739
-1EEC 81368830
-1EED 81368831
-1EEE 81368832
-1EEF 81368833
-1EF0 81368834
-1EF1 81368835
-1EF2 81368836
-1EF3 81368837
-1EF4 81368838
-1EF5 81368839
-1EF6 81368930
-1EF7 81368931
-1EF8 81368932
-1EF9 81368933
-1EFA 81368934
-1EFB 81368935
-1EFC 81368936
-1EFD 81368937
-1EFE 81368938
-1EFF 81368939
-1F00 81368A30
-1F01 81368A31
-1F02 81368A32
-1F03 81368A33
-1F04 81368A34
-1F05 81368A35
-1F06 81368A36
-1F07 81368A37
-1F08 81368A38
-1F09 81368A39
-1F0A 81368B30
-1F0B 81368B31
-1F0C 81368B32
-1F0D 81368B33
-1F0E 81368B34
-1F0F 81368B35
-1F10 81368B36
-1F11 81368B37
-1F12 81368B38
-1F13 81368B39
-1F14 81368C30
-1F15 81368C31
-1F16 81368C32
-1F17 81368C33
-1F18 81368C34
-1F19 81368C35
-1F1A 81368C36
-1F1B 81368C37
-1F1C 81368C38
-1F1D 81368C39
-1F1E 81368D30
-1F1F 81368D31
-1F20 81368D32
-1F21 81368D33
-1F22 81368D34
-1F23 81368D35
-1F24 81368D36
-1F25 81368D37
-1F26 81368D38
-1F27 81368D39
-1F28 81368E30
-1F29 81368E31
-1F2A 81368E32
-1F2B 81368E33
-1F2C 81368E34
-1F2D 81368E35
-1F2E 81368E36
-1F2F 81368E37
-1F30 81368E38
-1F31 81368E39
-1F32 81368F30
-1F33 81368F31
-1F34 81368F32
-1F35 81368F33
-1F36 81368F34
-1F37 81368F35
-1F38 81368F36
-1F39 81368F37
-1F3A 81368F38
-1F3B 81368F39
-1F3C 81369030
-1F3D 81369031
-1F3E 81369032
-1F3F 81369033
-1F40 81369034
-1F41 81369035
-1F42 81369036
-1F43 81369037
-1F44 81369038
-1F45 81369039
-1F46 81369130
-1F47 81369131
-1F48 81369132
-1F49 81369133
-1F4A 81369134
-1F4B 81369135
-1F4C 81369136
-1F4D 81369137
-1F4E 81369138
-1F4F 81369139
-1F50 81369230
-1F51 81369231
-1F52 81369232
-1F53 81369233
-1F54 81369234
-1F55 81369235
-1F56 81369236
-1F57 81369237
-1F58 81369238
-1F59 81369239
-1F5A 81369330
-1F5B 81369331
-1F5C 81369332
-1F5D 81369333
-1F5E 81369334
-1F5F 81369335
-1F60 81369336
-1F61 81369337
-1F62 81369338
-1F63 81369339
-1F64 81369430
-1F65 81369431
-1F66 81369432
-1F67 81369433
-1F68 81369434
-1F69 81369435
-1F6A 81369436
-1F6B 81369437
-1F6C 81369438
-1F6D 81369439
-1F6E 81369530
-1F6F 81369531
-1F70 81369532
-1F71 81369533
-1F72 81369534
-1F73 81369535
-1F74 81369536
-1F75 81369537
-1F76 81369538
-1F77 81369539
-1F78 81369630
-1F79 81369631
-1F7A 81369632
-1F7B 81369633
-1F7C 81369634
-1F7D 81369635
-1F7E 81369636
-1F7F 81369637
-1F80 81369638
-1F81 81369639
-1F82 81369730
-1F83 81369731
-1F84 81369732
-1F85 81369733
-1F86 81369734
-1F87 81369735
-1F88 81369736
-1F89 81369737
-1F8A 81369738
-1F8B 81369739
-1F8C 81369830
-1F8D 81369831
-1F8E 81369832
-1F8F 81369833
-1F90 81369834
-1F91 81369835
-1F92 81369836
-1F93 81369837
-1F94 81369838
-1F95 81369839
-1F96 81369930
-1F97 81369931
-1F98 81369932
-1F99 81369933
-1F9A 81369934
-1F9B 81369935
-1F9C 81369936
-1F9D 81369937
-1F9E 81369938
-1F9F 81369939
-1FA0 81369A30
-1FA1 81369A31
-1FA2 81369A32
-1FA3 81369A33
-1FA4 81369A34
-1FA5 81369A35
-1FA6 81369A36
-1FA7 81369A37
-1FA8 81369A38
-1FA9 81369A39
-1FAA 81369B30
-1FAB 81369B31
-1FAC 81369B32
-1FAD 81369B33
-1FAE 81369B34
-1FAF 81369B35
-1FB0 81369B36
-1FB1 81369B37
-1FB2 81369B38
-1FB3 81369B39
-1FB4 81369C30
-1FB5 81369C31
-1FB6 81369C32
-1FB7 81369C33
-1FB8 81369C34
-1FB9 81369C35
-1FBA 81369C36
-1FBB 81369C37
-1FBC 81369C38
-1FBD 81369C39
-1FBE 81369D30
-1FBF 81369D31
-1FC0 81369D32
-1FC1 81369D33
-1FC2 81369D34
-1FC3 81369D35
-1FC4 81369D36
-1FC5 81369D37
-1FC6 81369D38
-1FC7 81369D39
-1FC8 81369E30
-1FC9 81369E31
-1FCA 81369E32
-1FCB 81369E33
-1FCC 81369E34
-1FCD 81369E35
-1FCE 81369E36
-1FCF 81369E37
-1FD0 81369E38
-1FD1 81369E39
-1FD2 81369F30
-1FD3 81369F31
-1FD4 81369F32
-1FD5 81369F33
-1FD6 81369F34
-1FD7 81369F35
-1FD8 81369F36
-1FD9 81369F37
-1FDA 81369F38
-1FDB 81369F39
-1FDC 8136A030
-1FDD 8136A031
-1FDE 8136A032
-1FDF 8136A033
-1FE0 8136A034
-1FE1 8136A035
-1FE2 8136A036
-1FE3 8136A037
-1FE4 8136A038
-1FE5 8136A039
-1FE6 8136A130
-1FE7 8136A131
-1FE8 8136A132
-1FE9 8136A133
-1FEA 8136A134
-1FEB 8136A135
-1FEC 8136A136
-1FED 8136A137
-1FEE 8136A138
-1FEF 8136A139
-1FF0 8136A230
-1FF1 8136A231
-1FF2 8136A232
-1FF3 8136A233
-1FF4 8136A234
-1FF5 8136A235
-1FF6 8136A236
-1FF7 8136A237
-1FF8 8136A238
-1FF9 8136A239
-1FFA 8136A330
-1FFB 8136A331
-1FFC 8136A332
-1FFD 8136A333
-1FFE 8136A334
-1FFF 8136A335
-2000 8136A336
-2001 8136A337
-2002 8136A338
-2003 8136A339
-2004 8136A430
-2005 8136A431
-2006 8136A432
-2007 8136A433
-2008 8136A434
-2009 8136A435
-200A 8136A436
-200B 8136A437
-200C 8136A438
-200D 8136A439
-200E 8136A530
-200F 8136A531
-2010 A95C
-2011 8136A532
-2012 8136A533
-2013 A843
-2014 A1AA
-2015 A844
-2016 A1AC
-2017 8136A534
-2018 A1AE
-2019 A1AF
-201A 8136A535
-201B 8136A536
-201C A1B0
-201D A1B1
-201E 8136A537
-201F 8136A538
-2020 8136A539
-2021 8136A630
-2022 8136A631
-2023 8136A632
-2024 8136A633
-2025 A845
-2026 A1AD
-2027 8136A634
-2028 8136A635
-2029 8136A636
-202A 8136A637
-202B 8136A638
-202C 8136A639
-202D 8136A730
-202E 8136A731
-202F 8136A732
-2030 A1EB
-2031 8136A733
-2032 A1E4
-2033 A1E5
-2034 8136A734
-2035 A846
-2036 8136A735
-2037 8136A736
-2038 8136A737
-2039 8136A738
-203A 8136A739
-203B A1F9
-203C 8136A830
-203D 8136A831
-203E 8136A832
-203F 8136A833
-2040 8136A834
-2041 8136A835
-2042 8136A836
-2043 8136A837
-2044 8136A838
-2045 8136A839
-2046 8136A930
-2047 8136A931
-2048 8136A932
-2049 8136A933
-204A 8136A934
-204B 8136A935
-204C 8136A936
-204D 8136A937
-204E 8136A938
-204F 8136A939
-2050 8136AA30
-2051 8136AA31
-2052 8136AA32
-2053 8136AA33
-2054 8136AA34
-2055 8136AA35
-2056 8136AA36
-2057 8136AA37
-2058 8136AA38
-2059 8136AA39
-205A 8136AB30
-205B 8136AB31
-205C 8136AB32
-205D 8136AB33
-205E 8136AB34
-205F 8136AB35
-2060 8136AB36
-2061 8136AB37
-2062 8136AB38
-2063 8136AB39
-2064 8136AC30
-2065 8136AC31
-2066 8136AC32
-2067 8136AC33
-2068 8136AC34
-2069 8136AC35
-206A 8136AC36
-206B 8136AC37
-206C 8136AC38
-206D 8136AC39
-206E 8136AD30
-206F 8136AD31
-2070 8136AD32
-2071 8136AD33
-2072 8136AD34
-2073 8136AD35
-2074 8136AD36
-2075 8136AD37
-2076 8136AD38
-2077 8136AD39
-2078 8136AE30
-2079 8136AE31
-207A 8136AE32
-207B 8136AE33
-207C 8136AE34
-207D 8136AE35
-207E 8136AE36
-207F 8136AE37
-2080 8136AE38
-2081 8136AE39
-2082 8136AF30
-2083 8136AF31
-2084 8136AF32
-2085 8136AF33
-2086 8136AF34
-2087 8136AF35
-2088 8136AF36
-2089 8136AF37
-208A 8136AF38
-208B 8136AF39
-208C 8136B030
-208D 8136B031
-208E 8136B032
-208F 8136B033
-2090 8136B034
-2091 8136B035
-2092 8136B036
-2093 8136B037
-2094 8136B038
-2095 8136B039
-2096 8136B130
-2097 8136B131
-2098 8136B132
-2099 8136B133
-209A 8136B134
-209B 8136B135
-209C 8136B136
-209D 8136B137
-209E 8136B138
-209F 8136B139
-20A0 8136B230
-20A1 8136B231
-20A2 8136B232
-20A3 8136B233
-20A4 8136B234
-20A5 8136B235
-20A6 8136B236
-20A7 8136B237
-20A8 8136B238
-20A9 8136B239
-20AA 8136B330
-20AB 8136B331
-20AC A2E3
-20AD 8136B332
-20AE 8136B333
-20AF 8136B334
-20B0 8136B335
-20B1 8136B336
-20B2 8136B337
-20B3 8136B338
-20B4 8136B339
-20B5 8136B430
-20B6 8136B431
-20B7 8136B432
-20B8 8136B433
-20B9 8136B434
-20BA 8136B435
-20BB 8136B436
-20BC 8136B437
-20BD 8136B438
-20BE 8136B439
-20BF 8136B530
-20C0 8136B531
-20C1 8136B532
-20C2 8136B533
-20C3 8136B534
-20C4 8136B535
-20C5 8136B536
-20C6 8136B537
-20C7 8136B538
-20C8 8136B539
-20C9 8136B630
-20CA 8136B631
-20CB 8136B632
-20CC 8136B633
-20CD 8136B634
-20CE 8136B635
-20CF 8136B636
-20D0 8136B637
-20D1 8136B638
-20D2 8136B639
-20D3 8136B730
-20D4 8136B731
-20D5 8136B732
-20D6 8136B733
-20D7 8136B734
-20D8 8136B735
-20D9 8136B736
-20DA 8136B737
-20DB 8136B738
-20DC 8136B739
-20DD 8136B830
-20DE 8136B831
-20DF 8136B832
-20E0 8136B833
-20E1 8136B834
-20E2 8136B835
-20E3 8136B836
-20E4 8136B837
-20E5 8136B838
-20E6 8136B839
-20E7 8136B930
-20E8 8136B931
-20E9 8136B932
-20EA 8136B933
-20EB 8136B934
-20EC 8136B935
-20ED 8136B936
-20EE 8136B937
-20EF 8136B938
-20F0 8136B939
-20F1 8136BA30
-20F2 8136BA31
-20F3 8136BA32
-20F4 8136BA33
-20F5 8136BA34
-20F6 8136BA35
-20F7 8136BA36
-20F8 8136BA37
-20F9 8136BA38
-20FA 8136BA39
-20FB 8136BB30
-20FC 8136BB31
-20FD 8136BB32
-20FE 8136BB33
-20FF 8136BB34
-2100 8136BB35
-2101 8136BB36
-2102 8136BB37
-2103 A1E6
-2104 8136BB38
-2105 A847
-2106 8136BB39
-2107 8136BC30
-2108 8136BC31
-2109 A848
-210A 8136BC32
-210B 8136BC33
-210C 8136BC34
-210D 8136BC35
-210E 8136BC36
-210F 8136BC37
-2110 8136BC38
-2111 8136BC39
-2112 8136BD30
-2113 8136BD31
-2114 8136BD32
-2115 8136BD33
-2116 A1ED
-2117 8136BD34
-2118 8136BD35
-2119 8136BD36
-211A 8136BD37
-211B 8136BD38
-211C 8136BD39
-211D 8136BE30
-211E 8136BE31
-211F 8136BE32
-2120 8136BE33
-2121 A959
-2122 8136BE34
-2123 8136BE35
-2124 8136BE36
-2125 8136BE37
-2126 8136BE38
-2127 8136BE39
-2128 8136BF30
-2129 8136BF31
-212A 8136BF32
-212B 8136BF33
-212C 8136BF34
-212D 8136BF35
-212E 8136BF36
-212F 8136BF37
-2130 8136BF38
-2131 8136BF39
-2132 8136C030
-2133 8136C031
-2134 8136C032
-2135 8136C033
-2136 8136C034
-2137 8136C035
-2138 8136C036
-2139 8136C037
-213A 8136C038
-213B 8136C039
-213C 8136C130
-213D 8136C131
-213E 8136C132
-213F 8136C133
-2140 8136C134
-2141 8136C135
-2142 8136C136
-2143 8136C137
-2144 8136C138
-2145 8136C139
-2146 8136C230
-2147 8136C231
-2148 8136C232
-2149 8136C233
-214A 8136C234
-214B 8136C235
-214C 8136C236
-214D 8136C237
-214E 8136C238
-214F 8136C239
-2150 8136C330
-2151 8136C331
-2152 8136C332
-2153 8136C333
-2154 8136C334
-2155 8136C335
-2156 8136C336
-2157 8136C337
-2158 8136C338
-2159 8136C339
-215A 8136C430
-215B 8136C431
-215C 8136C432
-215D 8136C433
-215E 8136C434
-215F 8136C435
-2160 A2F1
-2161 A2F2
-2162 A2F3
-2163 A2F4
-2164 A2F5
-2165 A2F6
-2166 A2F7
-2167 A2F8
-2168 A2F9
-2169 A2FA
-216A A2FB
-216B A2FC
-216C 8136C436
-216D 8136C437
-216E 8136C438
-216F 8136C439
-2170 A2A1
-2171 A2A2
-2172 A2A3
-2173 A2A4
-2174 A2A5
-2175 A2A6
-2176 A2A7
-2177 A2A8
-2178 A2A9
-2179 A2AA
-217A 8136C530
-217B 8136C531
-217C 8136C532
-217D 8136C533
-217E 8136C534
-217F 8136C535
-2180 8136C536
-2181 8136C537
-2182 8136C538
-2183 8136C539
-2184 8136C630
-2185 8136C631
-2186 8136C632
-2187 8136C633
-2188 8136C634
-2189 8136C635
-218A 8136C636
-218B 8136C637
-218C 8136C638
-218D 8136C639
-218E 8136C730
-218F 8136C731
-2190 A1FB
-2191 A1FC
-2192 A1FA
-2193 A1FD
-2194 8136C732
-2195 8136C733
-2196 A849
-2197 A84A
-2198 A84B
-2199 A84C
-219A 8136C734
-219B 8136C735
-219C 8136C736
-219D 8136C737
-219E 8136C738
-219F 8136C739
-21A0 8136C830
-21A1 8136C831
-21A2 8136C832
-21A3 8136C833
-21A4 8136C834
-21A5 8136C835
-21A6 8136C836
-21A7 8136C837
-21A8 8136C838
-21A9 8136C839
-21AA 8136C930
-21AB 8136C931
-21AC 8136C932
-21AD 8136C933
-21AE 8136C934
-21AF 8136C935
-21B0 8136C936
-21B1 8136C937
-21B2 8136C938
-21B3 8136C939
-21B4 8136CA30
-21B5 8136CA31
-21B6 8136CA32
-21B7 8136CA33
-21B8 8136CA34
-21B9 8136CA35
-21BA 8136CA36
-21BB 8136CA37
-21BC 8136CA38
-21BD 8136CA39
-21BE 8136CB30
-21BF 8136CB31
-21C0 8136CB32
-21C1 8136CB33
-21C2 8136CB34
-21C3 8136CB35
-21C4 8136CB36
-21C5 8136CB37
-21C6 8136CB38
-21C7 8136CB39
-21C8 8136CC30
-21C9 8136CC31
-21CA 8136CC32
-21CB 8136CC33
-21CC 8136CC34
-21CD 8136CC35
-21CE 8136CC36
-21CF 8136CC37
-21D0 8136CC38
-21D1 8136CC39
-21D2 8136CD30
-21D3 8136CD31
-21D4 8136CD32
-21D5 8136CD33
-21D6 8136CD34
-21D7 8136CD35
-21D8 8136CD36
-21D9 8136CD37
-21DA 8136CD38
-21DB 8136CD39
-21DC 8136CE30
-21DD 8136CE31
-21DE 8136CE32
-21DF 8136CE33
-21E0 8136CE34
-21E1 8136CE35
-21E2 8136CE36
-21E3 8136CE37
-21E4 8136CE38
-21E5 8136CE39
-21E6 8136CF30
-21E7 8136CF31
-21E8 8136CF32
-21E9 8136CF33
-21EA 8136CF34
-21EB 8136CF35
-21EC 8136CF36
-21ED 8136CF37
-21EE 8136CF38
-21EF 8136CF39
-21F0 8136D030
-21F1 8136D031
-21F2 8136D032
-21F3 8136D033
-21F4 8136D034
-21F5 8136D035
-21F6 8136D036
-21F7 8136D037
-21F8 8136D038
-21F9 8136D039
-21FA 8136D130
-21FB 8136D131
-21FC 8136D132
-21FD 8136D133
-21FE 8136D134
-21FF 8136D135
-2200 8136D136
-2201 8136D137
-2202 8136D138
-2203 8136D139
-2204 8136D230
-2205 8136D231
-2206 8136D232
-2207 8136D233
-2208 A1CA
-2209 8136D234
-220A 8136D235
-220B 8136D236
-220C 8136D237
-220D 8136D238
-220E 8136D239
-220F A1C7
-2210 8136D330
-2211 A1C6
-2212 8136D331
-2213 8136D332
-2214 8136D333
-2215 A84D
-2216 8136D334
-2217 8136D335
-2218 8136D336
-2219 8136D337
-221A A1CC
-221B 8136D338
-221C 8136D339
-221D A1D8
-221E A1DE
-221F A84E
-2220 A1CF
-2221 8136D430
-2222 8136D431
-2223 A84F
-2224 8136D432
-2225 A1CE
-2226 8136D433
-2227 A1C4
-2228 A1C5
-2229 A1C9
-222A A1C8
-222B A1D2
-222C 8136D434
-222D 8136D435
-222E A1D3
-222F 8136D436
-2230 8136D437
-2231 8136D438
-2232 8136D439
-2233 8136D530
-2234 A1E0
-2235 A1DF
-2236 A1C3
-2237 A1CB
-2238 8136D531
-2239 8136D532
-223A 8136D533
-223B 8136D534
-223C 8136D535
-223D A1D7
-223E 8136D536
-223F 8136D537
-2240 8136D538
-2241 8136D539
-2242 8136D630
-2243 8136D631
-2244 8136D632
-2245 8136D633
-2246 8136D634
-2247 8136D635
-2248 A1D6
-2249 8136D636
-224A 8136D637
-224B 8136D638
-224C A1D5
-224D 8136D639
-224E 8136D730
-224F 8136D731
-2250 8136D732
-2251 8136D733
-2252 A850
-2253 8136D734
-2254 8136D735
-2255 8136D736
-2256 8136D737
-2257 8136D738
-2258 8136D739
-2259 8136D830
-225A 8136D831
-225B 8136D832
-225C 8136D833
-225D 8136D834
-225E 8136D835
-225F 8136D836
-2260 A1D9
-2261 A1D4
-2262 8136D837
-2263 8136D838
-2264 A1DC
-2265 A1DD
-2266 A851
-2267 A852
-2268 8136D839
-2269 8136D930
-226A 8136D931
-226B 8136D932
-226C 8136D933
-226D 8136D934
-226E A1DA
-226F A1DB
-2270 8136D935
-2271 8136D936
-2272 8136D937
-2273 8136D938
-2274 8136D939
-2275 8136DA30
-2276 8136DA31
-2277 8136DA32
-2278 8136DA33
-2279 8136DA34
-227A 8136DA35
-227B 8136DA36
-227C 8136DA37
-227D 8136DA38
-227E 8136DA39
-227F 8136DB30
-2280 8136DB31
-2281 8136DB32
-2282 8136DB33
-2283 8136DB34
-2284 8136DB35
-2285 8136DB36
-2286 8136DB37
-2287 8136DB38
-2288 8136DB39
-2289 8136DC30
-228A 8136DC31
-228B 8136DC32
-228C 8136DC33
-228D 8136DC34
-228E 8136DC35
-228F 8136DC36
-2290 8136DC37
-2291 8136DC38
-2292 8136DC39
-2293 8136DD30
-2294 8136DD31
-2295 A892
-2296 8136DD32
-2297 8136DD33
-2298 8136DD34
-2299 A1D1
-229A 8136DD35
-229B 8136DD36
-229C 8136DD37
-229D 8136DD38
-229E 8136DD39
-229F 8136DE30
-22A0 8136DE31
-22A1 8136DE32
-22A2 8136DE33
-22A3 8136DE34
-22A4 8136DE35
-22A5 A1CD
-22A6 8136DE36
-22A7 8136DE37
-22A8 8136DE38
-22A9 8136DE39
-22AA 8136DF30
-22AB 8136DF31
-22AC 8136DF32
-22AD 8136DF33
-22AE 8136DF34
-22AF 8136DF35
-22B0 8136DF36
-22B1 8136DF37
-22B2 8136DF38
-22B3 8136DF39
-22B4 8136E030
-22B5 8136E031
-22B6 8136E032
-22B7 8136E033
-22B8 8136E034
-22B9 8136E035
-22BA 8136E036
-22BB 8136E037
-22BC 8136E038
-22BD 8136E039
-22BE 8136E130
-22BF A853
-22C0 8136E131
-22C1 8136E132
-22C2 8136E133
-22C3 8136E134
-22C4 8136E135
-22C5 8136E136
-22C6 8136E137
-22C7 8136E138
-22C8 8136E139
-22C9 8136E230
-22CA 8136E231
-22CB 8136E232
-22CC 8136E233
-22CD 8136E234
-22CE 8136E235
-22CF 8136E236
-22D0 8136E237
-22D1 8136E238
-22D2 8136E239
-22D3 8136E330
-22D4 8136E331
-22D5 8136E332
-22D6 8136E333
-22D7 8136E334
-22D8 8136E335
-22D9 8136E336
-22DA 8136E337
-22DB 8136E338
-22DC 8136E339
-22DD 8136E430
-22DE 8136E431
-22DF 8136E432
-22E0 8136E433
-22E1 8136E434
-22E2 8136E435
-22E3 8136E436
-22E4 8136E437
-22E5 8136E438
-22E6 8136E439
-22E7 8136E530
-22E8 8136E531
-22E9 8136E532
-22EA 8136E533
-22EB 8136E534
-22EC 8136E535
-22ED 8136E536
-22EE 8136E537
-22EF 8136E538
-22F0 8136E539
-22F1 8136E630
-22F2 8136E631
-22F3 8136E632
-22F4 8136E633
-22F5 8136E634
-22F6 8136E635
-22F7 8136E636
-22F8 8136E637
-22F9 8136E638
-22FA 8136E639
-22FB 8136E730
-22FC 8136E731
-22FD 8136E732
-22FE 8136E733
-22FF 8136E734
-2300 8136E735
-2301 8136E736
-2302 8136E737
-2303 8136E738
-2304 8136E739
-2305 8136E830
-2306 8136E831
-2307 8136E832
-2308 8136E833
-2309 8136E834
-230A 8136E835
-230B 8136E836
-230C 8136E837
-230D 8136E838
-230E 8136E839
-230F 8136E930
-2310 8136E931
-2311 8136E932
-2312 A1D0
-2313 8136E933
-2314 8136E934
-2315 8136E935
-2316 8136E936
-2317 8136E937
-2318 8136E938
-2319 8136E939
-231A 8136EA30
-231B 8136EA31
-231C 8136EA32
-231D 8136EA33
-231E 8136EA34
-231F 8136EA35
-2320 8136EA36
-2321 8136EA37
-2322 8136EA38
-2323 8136EA39
-2324 8136EB30
-2325 8136EB31
-2326 8136EB32
-2327 8136EB33
-2328 8136EB34
-2329 8136EB35
-232A 8136EB36
-232B 8136EB37
-232C 8136EB38
-232D 8136EB39
-232E 8136EC30
-232F 8136EC31
-2330 8136EC32
-2331 8136EC33
-2332 8136EC34
-2333 8136EC35
-2334 8136EC36
-2335 8136EC37
-2336 8136EC38
-2337 8136EC39
-2338 8136ED30
-2339 8136ED31
-233A 8136ED32
-233B 8136ED33
-233C 8136ED34
-233D 8136ED35
-233E 8136ED36
-233F 8136ED37
-2340 8136ED38
-2341 8136ED39
-2342 8136EE30
-2343 8136EE31
-2344 8136EE32
-2345 8136EE33
-2346 8136EE34
-2347 8136EE35
-2348 8136EE36
-2349 8136EE37
-234A 8136EE38
-234B 8136EE39
-234C 8136EF30
-234D 8136EF31
-234E 8136EF32
-234F 8136EF33
-2350 8136EF34
-2351 8136EF35
-2352 8136EF36
-2353 8136EF37
-2354 8136EF38
-2355 8136EF39
-2356 8136F030
-2357 8136F031
-2358 8136F032
-2359 8136F033
-235A 8136F034
-235B 8136F035
-235C 8136F036
-235D 8136F037
-235E 8136F038
-235F 8136F039
-2360 8136F130
-2361 8136F131
-2362 8136F132
-2363 8136F133
-2364 8136F134
-2365 8136F135
-2366 8136F136
-2367 8136F137
-2368 8136F138
-2369 8136F139
-236A 8136F230
-236B 8136F231
-236C 8136F232
-236D 8136F233
-236E 8136F234
-236F 8136F235
-2370 8136F236
-2371 8136F237
-2372 8136F238
-2373 8136F239
-2374 8136F330
-2375 8136F331
-2376 8136F332
-2377 8136F333
-2378 8136F334
-2379 8136F335
-237A 8136F336
-237B 8136F337
-237C 8136F338
-237D 8136F339
-237E 8136F430
-237F 8136F431
-2380 8136F432
-2381 8136F433
-2382 8136F434
-2383 8136F435
-2384 8136F436
-2385 8136F437
-2386 8136F438
-2387 8136F439
-2388 8136F530
-2389 8136F531
-238A 8136F532
-238B 8136F533
-238C 8136F534
-238D 8136F535
-238E 8136F536
-238F 8136F537
-2390 8136F538
-2391 8136F539
-2392 8136F630
-2393 8136F631
-2394 8136F632
-2395 8136F633
-2396 8136F634
-2397 8136F635
-2398 8136F636
-2399 8136F637
-239A 8136F638
-239B 8136F639
-239C 8136F730
-239D 8136F731
-239E 8136F732
-239F 8136F733
-23A0 8136F734
-23A1 8136F735
-23A2 8136F736
-23A3 8136F737
-23A4 8136F738
-23A5 8136F739
-23A6 8136F830
-23A7 8136F831
-23A8 8136F832
-23A9 8136F833
-23AA 8136F834
-23AB 8136F835
-23AC 8136F836
-23AD 8136F837
-23AE 8136F838
-23AF 8136F839
-23B0 8136F930
-23B1 8136F931
-23B2 8136F932
-23B3 8136F933
-23B4 8136F934
-23B5 8136F935
-23B6 8136F936
-23B7 8136F937
-23B8 8136F938
-23B9 8136F939
-23BA 8136FA30
-23BB 8136FA31
-23BC 8136FA32
-23BD 8136FA33
-23BE 8136FA34
-23BF 8136FA35
-23C0 8136FA36
-23C1 8136FA37
-23C2 8136FA38
-23C3 8136FA39
-23C4 8136FB30
-23C5 8136FB31
-23C6 8136FB32
-23C7 8136FB33
-23C8 8136FB34
-23C9 8136FB35
-23CA 8136FB36
-23CB 8136FB37
-23CC 8136FB38
-23CD 8136FB39
-23CE 8136FC30
-23CF 8136FC31
-23D0 8136FC32
-23D1 8136FC33
-23D2 8136FC34
-23D3 8136FC35
-23D4 8136FC36
-23D5 8136FC37
-23D6 8136FC38
-23D7 8136FC39
-23D8 8136FD30
-23D9 8136FD31
-23DA 8136FD32
-23DB 8136FD33
-23DC 8136FD34
-23DD 8136FD35
-23DE 8136FD36
-23DF 8136FD37
-23E0 8136FD38
-23E1 8136FD39
-23E2 8136FE30
-23E3 8136FE31
-23E4 8136FE32
-23E5 8136FE33
-23E6 8136FE34
-23E7 8136FE35
-23E8 8136FE36
-23E9 8136FE37
-23EA 8136FE38
-23EB 8136FE39
-23EC 81378130
-23ED 81378131
-23EE 81378132
-23EF 81378133
-23F0 81378134
-23F1 81378135
-23F2 81378136
-23F3 81378137
-23F4 81378138
-23F5 81378139
-23F6 81378230
-23F7 81378231
-23F8 81378232
-23F9 81378233
-23FA 81378234
-23FB 81378235
-23FC 81378236
-23FD 81378237
-23FE 81378238
-23FF 81378239
-2400 81378330
-2401 81378331
-2402 81378332
-2403 81378333
-2404 81378334
-2405 81378335
-2406 81378336
-2407 81378337
-2408 81378338
-2409 81378339
-240A 81378430
-240B 81378431
-240C 81378432
-240D 81378433
-240E 81378434
-240F 81378435
-2410 81378436
-2411 81378437
-2412 81378438
-2413 81378439
-2414 81378530
-2415 81378531
-2416 81378532
-2417 81378533
-2418 81378534
-2419 81378535
-241A 81378536
-241B 81378537
-241C 81378538
-241D 81378539
-241E 81378630
-241F 81378631
-2420 81378632
-2421 81378633
-2422 81378634
-2423 81378635
-2424 81378636
-2425 81378637
-2426 81378638
-2427 81378639
-2428 81378730
-2429 81378731
-242A 81378732
-242B 81378733
-242C 81378734
-242D 81378735
-242E 81378736
-242F 81378737
-2430 81378738
-2431 81378739
-2432 81378830
-2433 81378831
-2434 81378832
-2435 81378833
-2436 81378834
-2437 81378835
-2438 81378836
-2439 81378837
-243A 81378838
-243B 81378839
-243C 81378930
-243D 81378931
-243E 81378932
-243F 81378933
-2440 81378934
-2441 81378935
-2442 81378936
-2443 81378937
-2444 81378938
-2445 81378939
-2446 81378A30
-2447 81378A31
-2448 81378A32
-2449 81378A33
-244A 81378A34
-244B 81378A35
-244C 81378A36
-244D 81378A37
-244E 81378A38
-244F 81378A39
-2450 81378B30
-2451 81378B31
-2452 81378B32
-2453 81378B33
-2454 81378B34
-2455 81378B35
-2456 81378B36
-2457 81378B37
-2458 81378B38
-2459 81378B39
-245A 81378C30
-245B 81378C31
-245C 81378C32
-245D 81378C33
-245E 81378C34
-245F 81378C35
-2460 A2D9
-2461 A2DA
-2462 A2DB
-2463 A2DC
-2464 A2DD
-2465 A2DE
-2466 A2DF
-2467 A2E0
-2468 A2E1
-2469 A2E2
-246A 81378C36
-246B 81378C37
-246C 81378C38
-246D 81378C39
-246E 81378D30
-246F 81378D31
-2470 81378D32
-2471 81378D33
-2472 81378D34
-2473 81378D35
-2474 A2C5
-2475 A2C6
-2476 A2C7
-2477 A2C8
-2478 A2C9
-2479 A2CA
-247A A2CB
-247B A2CC
-247C A2CD
-247D A2CE
-247E A2CF
-247F A2D0
-2480 A2D1
-2481 A2D2
-2482 A2D3
-2483 A2D4
-2484 A2D5
-2485 A2D6
-2486 A2D7
-2487 A2D8
-2488 A2B1
-2489 A2B2
-248A A2B3
-248B A2B4
-248C A2B5
-248D A2B6
-248E A2B7
-248F A2B8
-2490 A2B9
-2491 A2BA
-2492 A2BB
-2493 A2BC
-2494 A2BD
-2495 A2BE
-2496 A2BF
-2497 A2C0
-2498 A2C1
-2499 A2C2
-249A A2C3
-249B A2C4
-249C 81378D36
-249D 81378D37
-249E 81378D38
-249F 81378D39
-24A0 81378E30
-24A1 81378E31
-24A2 81378E32
-24A3 81378E33
-24A4 81378E34
-24A5 81378E35
-24A6 81378E36
-24A7 81378E37
-24A8 81378E38
-24A9 81378E39
-24AA 81378F30
-24AB 81378F31
-24AC 81378F32
-24AD 81378F33
-24AE 81378F34
-24AF 81378F35
-24B0 81378F36
-24B1 81378F37
-24B2 81378F38
-24B3 81378F39
-24B4 81379030
-24B5 81379031
-24B6 81379032
-24B7 81379033
-24B8 81379034
-24B9 81379035
-24BA 81379036
-24BB 81379037
-24BC 81379038
-24BD 81379039
-24BE 81379130
-24BF 81379131
-24C0 81379132
-24C1 81379133
-24C2 81379134
-24C3 81379135
-24C4 81379136
-24C5 81379137
-24C6 81379138
-24C7 81379139
-24C8 81379230
-24C9 81379231
-24CA 81379232
-24CB 81379233
-24CC 81379234
-24CD 81379235
-24CE 81379236
-24CF 81379237
-24D0 81379238
-24D1 81379239
-24D2 81379330
-24D3 81379331
-24D4 81379332
-24D5 81379333
-24D6 81379334
-24D7 81379335
-24D8 81379336
-24D9 81379337
-24DA 81379338
-24DB 81379339
-24DC 81379430
-24DD 81379431
-24DE 81379432
-24DF 81379433
-24E0 81379434
-24E1 81379435
-24E2 81379436
-24E3 81379437
-24E4 81379438
-24E5 81379439
-24E6 81379530
-24E7 81379531
-24E8 81379532
-24E9 81379533
-24EA 81379534
-24EB 81379535
-24EC 81379536
-24ED 81379537
-24EE 81379538
-24EF 81379539
-24F0 81379630
-24F1 81379631
-24F2 81379632
-24F3 81379633
-24F4 81379634
-24F5 81379635
-24F6 81379636
-24F7 81379637
-24F8 81379638
-24F9 81379639
-24FA 81379730
-24FB 81379731
-24FC 81379732
-24FD 81379733
-24FE 81379734
-24FF 81379735
-2500 A9A4
-2501 A9A5
-2502 A9A6
-2503 A9A7
-2504 A9A8
-2505 A9A9
-2506 A9AA
-2507 A9AB
-2508 A9AC
-2509 A9AD
-250A A9AE
-250B A9AF
-250C A9B0
-250D A9B1
-250E A9B2
-250F A9B3
-2510 A9B4
-2511 A9B5
-2512 A9B6
-2513 A9B7
-2514 A9B8
-2515 A9B9
-2516 A9BA
-2517 A9BB
-2518 A9BC
-2519 A9BD
-251A A9BE
-251B A9BF
-251C A9C0
-251D A9C1
-251E A9C2
-251F A9C3
-2520 A9C4
-2521 A9C5
-2522 A9C6
-2523 A9C7
-2524 A9C8
-2525 A9C9
-2526 A9CA
-2527 A9CB
-2528 A9CC
-2529 A9CD
-252A A9CE
-252B A9CF
-252C A9D0
-252D A9D1
-252E A9D2
-252F A9D3
-2530 A9D4
-2531 A9D5
-2532 A9D6
-2533 A9D7
-2534 A9D8
-2535 A9D9
-2536 A9DA
-2537 A9DB
-2538 A9DC
-2539 A9DD
-253A A9DE
-253B A9DF
-253C A9E0
-253D A9E1
-253E A9E2
-253F A9E3
-2540 A9E4
-2541 A9E5
-2542 A9E6
-2543 A9E7
-2544 A9E8
-2545 A9E9
-2546 A9EA
-2547 A9EB
-2548 A9EC
-2549 A9ED
-254A A9EE
-254B A9EF
-254C 81379736
-254D 81379737
-254E 81379738
-254F 81379739
-2550 A854
-2551 A855
-2552 A856
-2553 A857
-2554 A858
-2555 A859
-2556 A85A
-2557 A85B
-2558 A85C
-2559 A85D
-255A A85E
-255B A85F
-255C A860
-255D A861
-255E A862
-255F A863
-2560 A864
-2561 A865
-2562 A866
-2563 A867
-2564 A868
-2565 A869
-2566 A86A
-2567 A86B
-2568 A86C
-2569 A86D
-256A A86E
-256B A86F
-256C A870
-256D A871
-256E A872
-256F A873
-2570 A874
-2571 A875
-2572 A876
-2573 A877
-2574 81379830
-2575 81379831
-2576 81379832
-2577 81379833
-2578 81379834
-2579 81379835
-257A 81379836
-257B 81379837
-257C 81379838
-257D 81379839
-257E 81379930
-257F 81379931
-2580 81379932
-2581 A878
-2582 A879
-2583 A87A
-2584 A87B
-2585 A87C
-2586 A87D
-2587 A87E
-2588 A880
-2589 A881
-258A A882
-258B A883
-258C A884
-258D A885
-258E A886
-258F A887
-2590 81379933
-2591 81379934
-2592 81379935
-2593 A888
-2594 A889
-2595 A88A
-2596 81379936
-2597 81379937
-2598 81379938
-2599 81379939
-259A 81379A30
-259B 81379A31
-259C 81379A32
-259D 81379A33
-259E 81379A34
-259F 81379A35
-25A0 A1F6
-25A1 A1F5
-25A2 81379A36
-25A3 81379A37
-25A4 81379A38
-25A5 81379A39
-25A6 81379B30
-25A7 81379B31
-25A8 81379B32
-25A9 81379B33
-25AA 81379B34
-25AB 81379B35
-25AC 81379B36
-25AD 81379B37
-25AE 81379B38
-25AF 81379B39
-25B0 81379C30
-25B1 81379C31
-25B2 A1F8
-25B3 A1F7
-25B4 81379C32
-25B5 81379C33
-25B6 81379C34
-25B7 81379C35
-25B8 81379C36
-25B9 81379C37
-25BA 81379C38
-25BB 81379C39
-25BC A88B
-25BD A88C
-25BE 81379D30
-25BF 81379D31
-25C0 81379D32
-25C1 81379D33
-25C2 81379D34
-25C3 81379D35
-25C4 81379D36
-25C5 81379D37
-25C6 A1F4
-25C7 A1F3
-25C8 81379D38
-25C9 81379D39
-25CA 81379E30
-25CB A1F0
-25CC 81379E31
-25CD 81379E32
-25CE A1F2
-25CF A1F1
-25D0 81379E33
-25D1 81379E34
-25D2 81379E35
-25D3 81379E36
-25D4 81379E37
-25D5 81379E38
-25D6 81379E39
-25D7 81379F30
-25D8 81379F31
-25D9 81379F32
-25DA 81379F33
-25DB 81379F34
-25DC 81379F35
-25DD 81379F36
-25DE 81379F37
-25DF 81379F38
-25E0 81379F39
-25E1 8137A030
-25E2 A88D
-25E3 A88E
-25E4 A88F
-25E5 A890
-25E6 8137A031
-25E7 8137A032
-25E8 8137A033
-25E9 8137A034
-25EA 8137A035
-25EB 8137A036
-25EC 8137A037
-25ED 8137A038
-25EE 8137A039
-25EF 8137A130
-25F0 8137A131
-25F1 8137A132
-25F2 8137A133
-25F3 8137A134
-25F4 8137A135
-25F5 8137A136
-25F6 8137A137
-25F7 8137A138
-25F8 8137A139
-25F9 8137A230
-25FA 8137A231
-25FB 8137A232
-25FC 8137A233
-25FD 8137A234
-25FE 8137A235
-25FF 8137A236
-2600 8137A237
-2601 8137A238
-2602 8137A239
-2603 8137A330
-2604 8137A331
-2605 A1EF
-2606 A1EE
-2607 8137A332
-2608 8137A333
-2609 A891
-260A 8137A334
-260B 8137A335
-260C 8137A336
-260D 8137A337
-260E 8137A338
-260F 8137A339
-2610 8137A430
-2611 8137A431
-2612 8137A432
-2613 8137A433
-2614 8137A434
-2615 8137A435
-2616 8137A436
-2617 8137A437
-2618 8137A438
-2619 8137A439
-261A 8137A530
-261B 8137A531
-261C 8137A532
-261D 8137A533
-261E 8137A534
-261F 8137A535
-2620 8137A536
-2621 8137A537
-2622 8137A538
-2623 8137A539
-2624 8137A630
-2625 8137A631
-2626 8137A632
-2627 8137A633
-2628 8137A634
-2629 8137A635
-262A 8137A636
-262B 8137A637
-262C 8137A638
-262D 8137A639
-262E 8137A730
-262F 8137A731
-2630 8137A732
-2631 8137A733
-2632 8137A734
-2633 8137A735
-2634 8137A736
-2635 8137A737
-2636 8137A738
-2637 8137A739
-2638 8137A830
-2639 8137A831
-263A 8137A832
-263B 8137A833
-263C 8137A834
-263D 8137A835
-263E 8137A836
-263F 8137A837
-2640 A1E2
-2641 8137A838
-2642 A1E1
-2643 8137A839
-2644 8137A930
-2645 8137A931
-2646 8137A932
-2647 8137A933
-2648 8137A934
-2649 8137A935
-264A 8137A936
-264B 8137A937
-264C 8137A938
-264D 8137A939
-264E 8137AA30
-264F 8137AA31
-2650 8137AA32
-2651 8137AA33
-2652 8137AA34
-2653 8137AA35
-2654 8137AA36
-2655 8137AA37
-2656 8137AA38
-2657 8137AA39
-2658 8137AB30
-2659 8137AB31
-265A 8137AB32
-265B 8137AB33
-265C 8137AB34
-265D 8137AB35
-265E 8137AB36
-265F 8137AB37
-2660 8137AB38
-2661 8137AB39
-2662 8137AC30
-2663 8137AC31
-2664 8137AC32
-2665 8137AC33
-2666 8137AC34
-2667 8137AC35
-2668 8137AC36
-2669 8137AC37
-266A 8137AC38
-266B 8137AC39
-266C 8137AD30
-266D 8137AD31
-266E 8137AD32
-266F 8137AD33
-2670 8137AD34
-2671 8137AD35
-2672 8137AD36
-2673 8137AD37
-2674 8137AD38
-2675 8137AD39
-2676 8137AE30
-2677 8137AE31
-2678 8137AE32
-2679 8137AE33
-267A 8137AE34
-267B 8137AE35
-267C 8137AE36
-267D 8137AE37
-267E 8137AE38
-267F 8137AE39
-2680 8137AF30
-2681 8137AF31
-2682 8137AF32
-2683 8137AF33
-2684 8137AF34
-2685 8137AF35
-2686 8137AF36
-2687 8137AF37
-2688 8137AF38
-2689 8137AF39
-268A 8137B030
-268B 8137B031
-268C 8137B032
-268D 8137B033
-268E 8137B034
-268F 8137B035
-2690 8137B036
-2691 8137B037
-2692 8137B038
-2693 8137B039
-2694 8137B130
-2695 8137B131
-2696 8137B132
-2697 8137B133
-2698 8137B134
-2699 8137B135
-269A 8137B136
-269B 8137B137
-269C 8137B138
-269D 8137B139
-269E 8137B230
-269F 8137B231
-26A0 8137B232
-26A1 8137B233
-26A2 8137B234
-26A3 8137B235
-26A4 8137B236
-26A5 8137B237
-26A6 8137B238
-26A7 8137B239
-26A8 8137B330
-26A9 8137B331
-26AA 8137B332
-26AB 8137B333
-26AC 8137B334
-26AD 8137B335
-26AE 8137B336
-26AF 8137B337
-26B0 8137B338
-26B1 8137B339
-26B2 8137B430
-26B3 8137B431
-26B4 8137B432
-26B5 8137B433
-26B6 8137B434
-26B7 8137B435
-26B8 8137B436
-26B9 8137B437
-26BA 8137B438
-26BB 8137B439
-26BC 8137B530
-26BD 8137B531
-26BE 8137B532
-26BF 8137B533
-26C0 8137B534
-26C1 8137B535
-26C2 8137B536
-26C3 8137B537
-26C4 8137B538
-26C5 8137B539
-26C6 8137B630
-26C7 8137B631
-26C8 8137B632
-26C9 8137B633
-26CA 8137B634
-26CB 8137B635
-26CC 8137B636
-26CD 8137B637
-26CE 8137B638
-26CF 8137B639
-26D0 8137B730
-26D1 8137B731
-26D2 8137B732
-26D3 8137B733
-26D4 8137B734
-26D5 8137B735
-26D6 8137B736
-26D7 8137B737
-26D8 8137B738
-26D9 8137B739
-26DA 8137B830
-26DB 8137B831
-26DC 8137B832
-26DD 8137B833
-26DE 8137B834
-26DF 8137B835
-26E0 8137B836
-26E1 8137B837
-26E2 8137B838
-26E3 8137B839
-26E4 8137B930
-26E5 8137B931
-26E6 8137B932
-26E7 8137B933
-26E8 8137B934
-26E9 8137B935
-26EA 8137B936
-26EB 8137B937
-26EC 8137B938
-26ED 8137B939
-26EE 8137BA30
-26EF 8137BA31
-26F0 8137BA32
-26F1 8137BA33
-26F2 8137BA34
-26F3 8137BA35
-26F4 8137BA36
-26F5 8137BA37
-26F6 8137BA38
-26F7 8137BA39
-26F8 8137BB30
-26F9 8137BB31
-26FA 8137BB32
-26FB 8137BB33
-26FC 8137BB34
-26FD 8137BB35
-26FE 8137BB36
-26FF 8137BB37
-2700 8137BB38
-2701 8137BB39
-2702 8137BC30
-2703 8137BC31
-2704 8137BC32
-2705 8137BC33
-2706 8137BC34
-2707 8137BC35
-2708 8137BC36
-2709 8137BC37
-270A 8137BC38
-270B 8137BC39
-270C 8137BD30
-270D 8137BD31
-270E 8137BD32
-270F 8137BD33
-2710 8137BD34
-2711 8137BD35
-2712 8137BD36
-2713 8137BD37
-2714 8137BD38
-2715 8137BD39
-2716 8137BE30
-2717 8137BE31
-2718 8137BE32
-2719 8137BE33
-271A 8137BE34
-271B 8137BE35
-271C 8137BE36
-271D 8137BE37
-271E 8137BE38
-271F 8137BE39
-2720 8137BF30
-2721 8137BF31
-2722 8137BF32
-2723 8137BF33
-2724 8137BF34
-2725 8137BF35
-2726 8137BF36
-2727 8137BF37
-2728 8137BF38
-2729 8137BF39
-272A 8137C030
-272B 8137C031
-272C 8137C032
-272D 8137C033
-272E 8137C034
-272F 8137C035
-2730 8137C036
-2731 8137C037
-2732 8137C038
-2733 8137C039
-2734 8137C130
-2735 8137C131
-2736 8137C132
-2737 8137C133
-2738 8137C134
-2739 8137C135
-273A 8137C136
-273B 8137C137
-273C 8137C138
-273D 8137C139
-273E 8137C230
-273F 8137C231
-2740 8137C232
-2741 8137C233
-2742 8137C234
-2743 8137C235
-2744 8137C236
-2745 8137C237
-2746 8137C238
-2747 8137C239
-2748 8137C330
-2749 8137C331
-274A 8137C332
-274B 8137C333
-274C 8137C334
-274D 8137C335
-274E 8137C336
-274F 8137C337
-2750 8137C338
-2751 8137C339
-2752 8137C430
-2753 8137C431
-2754 8137C432
-2755 8137C433
-2756 8137C434
-2757 8137C435
-2758 8137C436
-2759 8137C437
-275A 8137C438
-275B 8137C439
-275C 8137C530
-275D 8137C531
-275E 8137C532
-275F 8137C533
-2760 8137C534
-2761 8137C535
-2762 8137C536
-2763 8137C537
-2764 8137C538
-2765 8137C539
-2766 8137C630
-2767 8137C631
-2768 8137C632
-2769 8137C633
-276A 8137C634
-276B 8137C635
-276C 8137C636
-276D 8137C637
-276E 8137C638
-276F 8137C639
-2770 8137C730
-2771 8137C731
-2772 8137C732
-2773 8137C733
-2774 8137C734
-2775 8137C735
-2776 8137C736
-2777 8137C737
-2778 8137C738
-2779 8137C739
-277A 8137C830
-277B 8137C831
-277C 8137C832
-277D 8137C833
-277E 8137C834
-277F 8137C835
-2780 8137C836
-2781 8137C837
-2782 8137C838
-2783 8137C839
-2784 8137C930
-2785 8137C931
-2786 8137C932
-2787 8137C933
-2788 8137C934
-2789 8137C935
-278A 8137C936
-278B 8137C937
-278C 8137C938
-278D 8137C939
-278E 8137CA30
-278F 8137CA31
-2790 8137CA32
-2791 8137CA33
-2792 8137CA34
-2793 8137CA35
-2794 8137CA36
-2795 8137CA37
-2796 8137CA38
-2797 8137CA39
-2798 8137CB30
-2799 8137CB31
-279A 8137CB32
-279B 8137CB33
-279C 8137CB34
-279D 8137CB35
-279E 8137CB36
-279F 8137CB37
-27A0 8137CB38
-27A1 8137CB39
-27A2 8137CC30
-27A3 8137CC31
-27A4 8137CC32
-27A5 8137CC33
-27A6 8137CC34
-27A7 8137CC35
-27A8 8137CC36
-27A9 8137CC37
-27AA 8137CC38
-27AB 8137CC39
-27AC 8137CD30
-27AD 8137CD31
-27AE 8137CD32
-27AF 8137CD33
-27B0 8137CD34
-27B1 8137CD35
-27B2 8137CD36
-27B3 8137CD37
-27B4 8137CD38
-27B5 8137CD39
-27B6 8137CE30
-27B7 8137CE31
-27B8 8137CE32
-27B9 8137CE33
-27BA 8137CE34
-27BB 8137CE35
-27BC 8137CE36
-27BD 8137CE37
-27BE 8137CE38
-27BF 8137CE39
-27C0 8137CF30
-27C1 8137CF31
-27C2 8137CF32
-27C3 8137CF33
-27C4 8137CF34
-27C5 8137CF35
-27C6 8137CF36
-27C7 8137CF37
-27C8 8137CF38
-27C9 8137CF39
-27CA 8137D030
-27CB 8137D031
-27CC 8137D032
-27CD 8137D033
-27CE 8137D034
-27CF 8137D035
-27D0 8137D036
-27D1 8137D037
-27D2 8137D038
-27D3 8137D039
-27D4 8137D130
-27D5 8137D131
-27D6 8137D132
-27D7 8137D133
-27D8 8137D134
-27D9 8137D135
-27DA 8137D136
-27DB 8137D137
-27DC 8137D138
-27DD 8137D139
-27DE 8137D230
-27DF 8137D231
-27E0 8137D232
-27E1 8137D233
-27E2 8137D234
-27E3 8137D235
-27E4 8137D236
-27E5 8137D237
-27E6 8137D238
-27E7 8137D239
-27E8 8137D330
-27E9 8137D331
-27EA 8137D332
-27EB 8137D333
-27EC 8137D334
-27ED 8137D335
-27EE 8137D336
-27EF 8137D337
-27F0 8137D338
-27F1 8137D339
-27F2 8137D430
-27F3 8137D431
-27F4 8137D432
-27F5 8137D433
-27F6 8137D434
-27F7 8137D435
-27F8 8137D436
-27F9 8137D437
-27FA 8137D438
-27FB 8137D439
-27FC 8137D530
-27FD 8137D531
-27FE 8137D532
-27FF 8137D533
-2800 8137D534
-2801 8137D535
-2802 8137D536
-2803 8137D537
-2804 8137D538
-2805 8137D539
-2806 8137D630
-2807 8137D631
-2808 8137D632
-2809 8137D633
-280A 8137D634
-280B 8137D635
-280C 8137D636
-280D 8137D637
-280E 8137D638
-280F 8137D639
-2810 8137D730
-2811 8137D731
-2812 8137D732
-2813 8137D733
-2814 8137D734
-2815 8137D735
-2816 8137D736
-2817 8137D737
-2818 8137D738
-2819 8137D739
-281A 8137D830
-281B 8137D831
-281C 8137D832
-281D 8137D833
-281E 8137D834
-281F 8137D835
-2820 8137D836
-2821 8137D837
-2822 8137D838
-2823 8137D839
-2824 8137D930
-2825 8137D931
-2826 8137D932
-2827 8137D933
-2828 8137D934
-2829 8137D935
-282A 8137D936
-282B 8137D937
-282C 8137D938
-282D 8137D939
-282E 8137DA30
-282F 8137DA31
-2830 8137DA32
-2831 8137DA33
-2832 8137DA34
-2833 8137DA35
-2834 8137DA36
-2835 8137DA37
-2836 8137DA38
-2837 8137DA39
-2838 8137DB30
-2839 8137DB31
-283A 8137DB32
-283B 8137DB33
-283C 8137DB34
-283D 8137DB35
-283E 8137DB36
-283F 8137DB37
-2840 8137DB38
-2841 8137DB39
-2842 8137DC30
-2843 8137DC31
-2844 8137DC32
-2845 8137DC33
-2846 8137DC34
-2847 8137DC35
-2848 8137DC36
-2849 8137DC37
-284A 8137DC38
-284B 8137DC39
-284C 8137DD30
-284D 8137DD31
-284E 8137DD32
-284F 8137DD33
-2850 8137DD34
-2851 8137DD35
-2852 8137DD36
-2853 8137DD37
-2854 8137DD38
-2855 8137DD39
-2856 8137DE30
-2857 8137DE31
-2858 8137DE32
-2859 8137DE33
-285A 8137DE34
-285B 8137DE35
-285C 8137DE36
-285D 8137DE37
-285E 8137DE38
-285F 8137DE39
-2860 8137DF30
-2861 8137DF31
-2862 8137DF32
-2863 8137DF33
-2864 8137DF34
-2865 8137DF35
-2866 8137DF36
-2867 8137DF37
-2868 8137DF38
-2869 8137DF39
-286A 8137E030
-286B 8137E031
-286C 8137E032
-286D 8137E033
-286E 8137E034
-286F 8137E035
-2870 8137E036
-2871 8137E037
-2872 8137E038
-2873 8137E039
-2874 8137E130
-2875 8137E131
-2876 8137E132
-2877 8137E133
-2878 8137E134
-2879 8137E135
-287A 8137E136
-287B 8137E137
-287C 8137E138
-287D 8137E139
-287E 8137E230
-287F 8137E231
-2880 8137E232
-2881 8137E233
-2882 8137E234
-2883 8137E235
-2884 8137E236
-2885 8137E237
-2886 8137E238
-2887 8137E239
-2888 8137E330
-2889 8137E331
-288A 8137E332
-288B 8137E333
-288C 8137E334
-288D 8137E335
-288E 8137E336
-288F 8137E337
-2890 8137E338
-2891 8137E339
-2892 8137E430
-2893 8137E431
-2894 8137E432
-2895 8137E433
-2896 8137E434
-2897 8137E435
-2898 8137E436
-2899 8137E437
-289A 8137E438
-289B 8137E439
-289C 8137E530
-289D 8137E531
-289E 8137E532
-289F 8137E533
-28A0 8137E534
-28A1 8137E535
-28A2 8137E536
-28A3 8137E537
-28A4 8137E538
-28A5 8137E539
-28A6 8137E630
-28A7 8137E631
-28A8 8137E632
-28A9 8137E633
-28AA 8137E634
-28AB 8137E635
-28AC 8137E636
-28AD 8137E637
-28AE 8137E638
-28AF 8137E639
-28B0 8137E730
-28B1 8137E731
-28B2 8137E732
-28B3 8137E733
-28B4 8137E734
-28B5 8137E735
-28B6 8137E736
-28B7 8137E737
-28B8 8137E738
-28B9 8137E739
-28BA 8137E830
-28BB 8137E831
-28BC 8137E832
-28BD 8137E833
-28BE 8137E834
-28BF 8137E835
-28C0 8137E836
-28C1 8137E837
-28C2 8137E838
-28C3 8137E839
-28C4 8137E930
-28C5 8137E931
-28C6 8137E932
-28C7 8137E933
-28C8 8137E934
-28C9 8137E935
-28CA 8137E936
-28CB 8137E937
-28CC 8137E938
-28CD 8137E939
-28CE 8137EA30
-28CF 8137EA31
-28D0 8137EA32
-28D1 8137EA33
-28D2 8137EA34
-28D3 8137EA35
-28D4 8137EA36
-28D5 8137EA37
-28D6 8137EA38
-28D7 8137EA39
-28D8 8137EB30
-28D9 8137EB31
-28DA 8137EB32
-28DB 8137EB33
-28DC 8137EB34
-28DD 8137EB35
-28DE 8137EB36
-28DF 8137EB37
-28E0 8137EB38
-28E1 8137EB39
-28E2 8137EC30
-28E3 8137EC31
-28E4 8137EC32
-28E5 8137EC33
-28E6 8137EC34
-28E7 8137EC35
-28E8 8137EC36
-28E9 8137EC37
-28EA 8137EC38
-28EB 8137EC39
-28EC 8137ED30
-28ED 8137ED31
-28EE 8137ED32
-28EF 8137ED33
-28F0 8137ED34
-28F1 8137ED35
-28F2 8137ED36
-28F3 8137ED37
-28F4 8137ED38
-28F5 8137ED39
-28F6 8137EE30
-28F7 8137EE31
-28F8 8137EE32
-28F9 8137EE33
-28FA 8137EE34
-28FB 8137EE35
-28FC 8137EE36
-28FD 8137EE37
-28FE 8137EE38
-28FF 8137EE39
-2900 8137EF30
-2901 8137EF31
-2902 8137EF32
-2903 8137EF33
-2904 8137EF34
-2905 8137EF35
-2906 8137EF36
-2907 8137EF37
-2908 8137EF38
-2909 8137EF39
-290A 8137F030
-290B 8137F031
-290C 8137F032
-290D 8137F033
-290E 8137F034
-290F 8137F035
-2910 8137F036
-2911 8137F037
-2912 8137F038
-2913 8137F039
-2914 8137F130
-2915 8137F131
-2916 8137F132
-2917 8137F133
-2918 8137F134
-2919 8137F135
-291A 8137F136
-291B 8137F137
-291C 8137F138
-291D 8137F139
-291E 8137F230
-291F 8137F231
-2920 8137F232
-2921 8137F233
-2922 8137F234
-2923 8137F235
-2924 8137F236
-2925 8137F237
-2926 8137F238
-2927 8137F239
-2928 8137F330
-2929 8137F331
-292A 8137F332
-292B 8137F333
-292C 8137F334
-292D 8137F335
-292E 8137F336
-292F 8137F337
-2930 8137F338
-2931 8137F339
-2932 8137F430
-2933 8137F431
-2934 8137F432
-2935 8137F433
-2936 8137F434
-2937 8137F435
-2938 8137F436
-2939 8137F437
-293A 8137F438
-293B 8137F439
-293C 8137F530
-293D 8137F531
-293E 8137F532
-293F 8137F533
-2940 8137F534
-2941 8137F535
-2942 8137F536
-2943 8137F537
-2944 8137F538
-2945 8137F539
-2946 8137F630
-2947 8137F631
-2948 8137F632
-2949 8137F633
-294A 8137F634
-294B 8137F635
-294C 8137F636
-294D 8137F637
-294E 8137F638
-294F 8137F639
-2950 8137F730
-2951 8137F731
-2952 8137F732
-2953 8137F733
-2954 8137F734
-2955 8137F735
-2956 8137F736
-2957 8137F737
-2958 8137F738
-2959 8137F739
-295A 8137F830
-295B 8137F831
-295C 8137F832
-295D 8137F833
-295E 8137F834
-295F 8137F835
-2960 8137F836
-2961 8137F837
-2962 8137F838
-2963 8137F839
-2964 8137F930
-2965 8137F931
-2966 8137F932
-2967 8137F933
-2968 8137F934
-2969 8137F935
-296A 8137F936
-296B 8137F937
-296C 8137F938
-296D 8137F939
-296E 8137FA30
-296F 8137FA31
-2970 8137FA32
-2971 8137FA33
-2972 8137FA34
-2973 8137FA35
-2974 8137FA36
-2975 8137FA37
-2976 8137FA38
-2977 8137FA39
-2978 8137FB30
-2979 8137FB31
-297A 8137FB32
-297B 8137FB33
-297C 8137FB34
-297D 8137FB35
-297E 8137FB36
-297F 8137FB37
-2980 8137FB38
-2981 8137FB39
-2982 8137FC30
-2983 8137FC31
-2984 8137FC32
-2985 8137FC33
-2986 8137FC34
-2987 8137FC35
-2988 8137FC36
-2989 8137FC37
-298A 8137FC38
-298B 8137FC39
-298C 8137FD30
-298D 8137FD31
-298E 8137FD32
-298F 8137FD33
-2990 8137FD34
-2991 8137FD35
-2992 8137FD36
-2993 8137FD37
-2994 8137FD38
-2995 8137FD39
-2996 8137FE30
-2997 8137FE31
-2998 8137FE32
-2999 8137FE33
-299A 8137FE34
-299B 8137FE35
-299C 8137FE36
-299D 8137FE37
-299E 8137FE38
-299F 8137FE39
-29A0 81388130
-29A1 81388131
-29A2 81388132
-29A3 81388133
-29A4 81388134
-29A5 81388135
-29A6 81388136
-29A7 81388137
-29A8 81388138
-29A9 81388139
-29AA 81388230
-29AB 81388231
-29AC 81388232
-29AD 81388233
-29AE 81388234
-29AF 81388235
-29B0 81388236
-29B1 81388237
-29B2 81388238
-29B3 81388239
-29B4 81388330
-29B5 81388331
-29B6 81388332
-29B7 81388333
-29B8 81388334
-29B9 81388335
-29BA 81388336
-29BB 81388337
-29BC 81388338
-29BD 81388339
-29BE 81388430
-29BF 81388431
-29C0 81388432
-29C1 81388433
-29C2 81388434
-29C3 81388435
-29C4 81388436
-29C5 81388437
-29C6 81388438
-29C7 81388439
-29C8 81388530
-29C9 81388531
-29CA 81388532
-29CB 81388533
-29CC 81388534
-29CD 81388535
-29CE 81388536
-29CF 81388537
-29D0 81388538
-29D1 81388539
-29D2 81388630
-29D3 81388631
-29D4 81388632
-29D5 81388633
-29D6 81388634
-29D7 81388635
-29D8 81388636
-29D9 81388637
-29DA 81388638
-29DB 81388639
-29DC 81388730
-29DD 81388731
-29DE 81388732
-29DF 81388733
-29E0 81388734
-29E1 81388735
-29E2 81388736
-29E3 81388737
-29E4 81388738
-29E5 81388739
-29E6 81388830
-29E7 81388831
-29E8 81388832
-29E9 81388833
-29EA 81388834
-29EB 81388835
-29EC 81388836
-29ED 81388837
-29EE 81388838
-29EF 81388839
-29F0 81388930
-29F1 81388931
-29F2 81388932
-29F3 81388933
-29F4 81388934
-29F5 81388935
-29F6 81388936
-29F7 81388937
-29F8 81388938
-29F9 81388939
-29FA 81388A30
-29FB 81388A31
-29FC 81388A32
-29FD 81388A33
-29FE 81388A34
-29FF 81388A35
-2A00 81388A36
-2A01 81388A37
-2A02 81388A38
-2A03 81388A39
-2A04 81388B30
-2A05 81388B31
-2A06 81388B32
-2A07 81388B33
-2A08 81388B34
-2A09 81388B35
-2A0A 81388B36
-2A0B 81388B37
-2A0C 81388B38
-2A0D 81388B39
-2A0E 81388C30
-2A0F 81388C31
-2A10 81388C32
-2A11 81388C33
-2A12 81388C34
-2A13 81388C35
-2A14 81388C36
-2A15 81388C37
-2A16 81388C38
-2A17 81388C39
-2A18 81388D30
-2A19 81388D31
-2A1A 81388D32
-2A1B 81388D33
-2A1C 81388D34
-2A1D 81388D35
-2A1E 81388D36
-2A1F 81388D37
-2A20 81388D38
-2A21 81388D39
-2A22 81388E30
-2A23 81388E31
-2A24 81388E32
-2A25 81388E33
-2A26 81388E34
-2A27 81388E35
-2A28 81388E36
-2A29 81388E37
-2A2A 81388E38
-2A2B 81388E39
-2A2C 81388F30
-2A2D 81388F31
-2A2E 81388F32
-2A2F 81388F33
-2A30 81388F34
-2A31 81388F35
-2A32 81388F36
-2A33 81388F37
-2A34 81388F38
-2A35 81388F39
-2A36 81389030
-2A37 81389031
-2A38 81389032
-2A39 81389033
-2A3A 81389034
-2A3B 81389035
-2A3C 81389036
-2A3D 81389037
-2A3E 81389038
-2A3F 81389039
-2A40 81389130
-2A41 81389131
-2A42 81389132
-2A43 81389133
-2A44 81389134
-2A45 81389135
-2A46 81389136
-2A47 81389137
-2A48 81389138
-2A49 81389139
-2A4A 81389230
-2A4B 81389231
-2A4C 81389232
-2A4D 81389233
-2A4E 81389234
-2A4F 81389235
-2A50 81389236
-2A51 81389237
-2A52 81389238
-2A53 81389239
-2A54 81389330
-2A55 81389331
-2A56 81389332
-2A57 81389333
-2A58 81389334
-2A59 81389335
-2A5A 81389336
-2A5B 81389337
-2A5C 81389338
-2A5D 81389339
-2A5E 81389430
-2A5F 81389431
-2A60 81389432
-2A61 81389433
-2A62 81389434
-2A63 81389435
-2A64 81389436
-2A65 81389437
-2A66 81389438
-2A67 81389439
-2A68 81389530
-2A69 81389531
-2A6A 81389532
-2A6B 81389533
-2A6C 81389534
-2A6D 81389535
-2A6E 81389536
-2A6F 81389537
-2A70 81389538
-2A71 81389539
-2A72 81389630
-2A73 81389631
-2A74 81389632
-2A75 81389633
-2A76 81389634
-2A77 81389635
-2A78 81389636
-2A79 81389637
-2A7A 81389638
-2A7B 81389639
-2A7C 81389730
-2A7D 81389731
-2A7E 81389732
-2A7F 81389733
-2A80 81389734
-2A81 81389735
-2A82 81389736
-2A83 81389737
-2A84 81389738
-2A85 81389739
-2A86 81389830
-2A87 81389831
-2A88 81389832
-2A89 81389833
-2A8A 81389834
-2A8B 81389835
-2A8C 81389836
-2A8D 81389837
-2A8E 81389838
-2A8F 81389839
-2A90 81389930
-2A91 81389931
-2A92 81389932
-2A93 81389933
-2A94 81389934
-2A95 81389935
-2A96 81389936
-2A97 81389937
-2A98 81389938
-2A99 81389939
-2A9A 81389A30
-2A9B 81389A31
-2A9C 81389A32
-2A9D 81389A33
-2A9E 81389A34
-2A9F 81389A35
-2AA0 81389A36
-2AA1 81389A37
-2AA2 81389A38
-2AA3 81389A39
-2AA4 81389B30
-2AA5 81389B31
-2AA6 81389B32
-2AA7 81389B33
-2AA8 81389B34
-2AA9 81389B35
-2AAA 81389B36
-2AAB 81389B37
-2AAC 81389B38
-2AAD 81389B39
-2AAE 81389C30
-2AAF 81389C31
-2AB0 81389C32
-2AB1 81389C33
-2AB2 81389C34
-2AB3 81389C35
-2AB4 81389C36
-2AB5 81389C37
-2AB6 81389C38
-2AB7 81389C39
-2AB8 81389D30
-2AB9 81389D31
-2ABA 81389D32
-2ABB 81389D33
-2ABC 81389D34
-2ABD 81389D35
-2ABE 81389D36
-2ABF 81389D37
-2AC0 81389D38
-2AC1 81389D39
-2AC2 81389E30
-2AC3 81389E31
-2AC4 81389E32
-2AC5 81389E33
-2AC6 81389E34
-2AC7 81389E35
-2AC8 81389E36
-2AC9 81389E37
-2ACA 81389E38
-2ACB 81389E39
-2ACC 81389F30
-2ACD 81389F31
-2ACE 81389F32
-2ACF 81389F33
-2AD0 81389F34
-2AD1 81389F35
-2AD2 81389F36
-2AD3 81389F37
-2AD4 81389F38
-2AD5 81389F39
-2AD6 8138A030
-2AD7 8138A031
-2AD8 8138A032
-2AD9 8138A033
-2ADA 8138A034
-2ADB 8138A035
-2ADC 8138A036
-2ADD 8138A037
-2ADE 8138A038
-2ADF 8138A039
-2AE0 8138A130
-2AE1 8138A131
-2AE2 8138A132
-2AE3 8138A133
-2AE4 8138A134
-2AE5 8138A135
-2AE6 8138A136
-2AE7 8138A137
-2AE8 8138A138
-2AE9 8138A139
-2AEA 8138A230
-2AEB 8138A231
-2AEC 8138A232
-2AED 8138A233
-2AEE 8138A234
-2AEF 8138A235
-2AF0 8138A236
-2AF1 8138A237
-2AF2 8138A238
-2AF3 8138A239
-2AF4 8138A330
-2AF5 8138A331
-2AF6 8138A332
-2AF7 8138A333
-2AF8 8138A334
-2AF9 8138A335
-2AFA 8138A336
-2AFB 8138A337
-2AFC 8138A338
-2AFD 8138A339
-2AFE 8138A430
-2AFF 8138A431
-2B00 8138A432
-2B01 8138A433
-2B02 8138A434
-2B03 8138A435
-2B04 8138A436
-2B05 8138A437
-2B06 8138A438
-2B07 8138A439
-2B08 8138A530
-2B09 8138A531
-2B0A 8138A532
-2B0B 8138A533
-2B0C 8138A534
-2B0D 8138A535
-2B0E 8138A536
-2B0F 8138A537
-2B10 8138A538
-2B11 8138A539
-2B12 8138A630
-2B13 8138A631
-2B14 8138A632
-2B15 8138A633
-2B16 8138A634
-2B17 8138A635
-2B18 8138A636
-2B19 8138A637
-2B1A 8138A638
-2B1B 8138A639
-2B1C 8138A730
-2B1D 8138A731
-2B1E 8138A732
-2B1F 8138A733
-2B20 8138A734
-2B21 8138A735
-2B22 8138A736
-2B23 8138A737
-2B24 8138A738
-2B25 8138A739
-2B26 8138A830
-2B27 8138A831
-2B28 8138A832
-2B29 8138A833
-2B2A 8138A834
-2B2B 8138A835
-2B2C 8138A836
-2B2D 8138A837
-2B2E 8138A838
-2B2F 8138A839
-2B30 8138A930
-2B31 8138A931
-2B32 8138A932
-2B33 8138A933
-2B34 8138A934
-2B35 8138A935
-2B36 8138A936
-2B37 8138A937
-2B38 8138A938
-2B39 8138A939
-2B3A 8138AA30
-2B3B 8138AA31
-2B3C 8138AA32
-2B3D 8138AA33
-2B3E 8138AA34
-2B3F 8138AA35
-2B40 8138AA36
-2B41 8138AA37
-2B42 8138AA38
-2B43 8138AA39
-2B44 8138AB30
-2B45 8138AB31
-2B46 8138AB32
-2B47 8138AB33
-2B48 8138AB34
-2B49 8138AB35
-2B4A 8138AB36
-2B4B 8138AB37
-2B4C 8138AB38
-2B4D 8138AB39
-2B4E 8138AC30
-2B4F 8138AC31
-2B50 8138AC32
-2B51 8138AC33
-2B52 8138AC34
-2B53 8138AC35
-2B54 8138AC36
-2B55 8138AC37
-2B56 8138AC38
-2B57 8138AC39
-2B58 8138AD30
-2B59 8138AD31
-2B5A 8138AD32
-2B5B 8138AD33
-2B5C 8138AD34
-2B5D 8138AD35
-2B5E 8138AD36
-2B5F 8138AD37
-2B60 8138AD38
-2B61 8138AD39
-2B62 8138AE30
-2B63 8138AE31
-2B64 8138AE32
-2B65 8138AE33
-2B66 8138AE34
-2B67 8138AE35
-2B68 8138AE36
-2B69 8138AE37
-2B6A 8138AE38
-2B6B 8138AE39
-2B6C 8138AF30
-2B6D 8138AF31
-2B6E 8138AF32
-2B6F 8138AF33
-2B70 8138AF34
-2B71 8138AF35
-2B72 8138AF36
-2B73 8138AF37
-2B74 8138AF38
-2B75 8138AF39
-2B76 8138B030
-2B77 8138B031
-2B78 8138B032
-2B79 8138B033
-2B7A 8138B034
-2B7B 8138B035
-2B7C 8138B036
-2B7D 8138B037
-2B7E 8138B038
-2B7F 8138B039
-2B80 8138B130
-2B81 8138B131
-2B82 8138B132
-2B83 8138B133
-2B84 8138B134
-2B85 8138B135
-2B86 8138B136
-2B87 8138B137
-2B88 8138B138
-2B89 8138B139
-2B8A 8138B230
-2B8B 8138B231
-2B8C 8138B232
-2B8D 8138B233
-2B8E 8138B234
-2B8F 8138B235
-2B90 8138B236
-2B91 8138B237
-2B92 8138B238
-2B93 8138B239
-2B94 8138B330
-2B95 8138B331
-2B96 8138B332
-2B97 8138B333
-2B98 8138B334
-2B99 8138B335
-2B9A 8138B336
-2B9B 8138B337
-2B9C 8138B338
-2B9D 8138B339
-2B9E 8138B430
-2B9F 8138B431
-2BA0 8138B432
-2BA1 8138B433
-2BA2 8138B434
-2BA3 8138B435
-2BA4 8138B436
-2BA5 8138B437
-2BA6 8138B438
-2BA7 8138B439
-2BA8 8138B530
-2BA9 8138B531
-2BAA 8138B532
-2BAB 8138B533
-2BAC 8138B534
-2BAD 8138B535
-2BAE 8138B536
-2BAF 8138B537
-2BB0 8138B538
-2BB1 8138B539
-2BB2 8138B630
-2BB3 8138B631
-2BB4 8138B632
-2BB5 8138B633
-2BB6 8138B634
-2BB7 8138B635
-2BB8 8138B636
-2BB9 8138B637
-2BBA 8138B638
-2BBB 8138B639
-2BBC 8138B730
-2BBD 8138B731
-2BBE 8138B732
-2BBF 8138B733
-2BC0 8138B734
-2BC1 8138B735
-2BC2 8138B736
-2BC3 8138B737
-2BC4 8138B738
-2BC5 8138B739
-2BC6 8138B830
-2BC7 8138B831
-2BC8 8138B832
-2BC9 8138B833
-2BCA 8138B834
-2BCB 8138B835
-2BCC 8138B836
-2BCD 8138B837
-2BCE 8138B838
-2BCF 8138B839
-2BD0 8138B930
-2BD1 8138B931
-2BD2 8138B932
-2BD3 8138B933
-2BD4 8138B934
-2BD5 8138B935
-2BD6 8138B936
-2BD7 8138B937
-2BD8 8138B938
-2BD9 8138B939
-2BDA 8138BA30
-2BDB 8138BA31
-2BDC 8138BA32
-2BDD 8138BA33
-2BDE 8138BA34
-2BDF 8138BA35
-2BE0 8138BA36
-2BE1 8138BA37
-2BE2 8138BA38
-2BE3 8138BA39
-2BE4 8138BB30
-2BE5 8138BB31
-2BE6 8138BB32
-2BE7 8138BB33
-2BE8 8138BB34
-2BE9 8138BB35
-2BEA 8138BB36
-2BEB 8138BB37
-2BEC 8138BB38
-2BED 8138BB39
-2BEE 8138BC30
-2BEF 8138BC31
-2BF0 8138BC32
-2BF1 8138BC33
-2BF2 8138BC34
-2BF3 8138BC35
-2BF4 8138BC36
-2BF5 8138BC37
-2BF6 8138BC38
-2BF7 8138BC39
-2BF8 8138BD30
-2BF9 8138BD31
-2BFA 8138BD32
-2BFB 8138BD33
-2BFC 8138BD34
-2BFD 8138BD35
-2BFE 8138BD36
-2BFF 8138BD37
-2C00 8138BD38
-2C01 8138BD39
-2C02 8138BE30
-2C03 8138BE31
-2C04 8138BE32
-2C05 8138BE33
-2C06 8138BE34
-2C07 8138BE35
-2C08 8138BE36
-2C09 8138BE37
-2C0A 8138BE38
-2C0B 8138BE39
-2C0C 8138BF30
-2C0D 8138BF31
-2C0E 8138BF32
-2C0F 8138BF33
-2C10 8138BF34
-2C11 8138BF35
-2C12 8138BF36
-2C13 8138BF37
-2C14 8138BF38
-2C15 8138BF39
-2C16 8138C030
-2C17 8138C031
-2C18 8138C032
-2C19 8138C033
-2C1A 8138C034
-2C1B 8138C035
-2C1C 8138C036
-2C1D 8138C037
-2C1E 8138C038
-2C1F 8138C039
-2C20 8138C130
-2C21 8138C131
-2C22 8138C132
-2C23 8138C133
-2C24 8138C134
-2C25 8138C135
-2C26 8138C136
-2C27 8138C137
-2C28 8138C138
-2C29 8138C139
-2C2A 8138C230
-2C2B 8138C231
-2C2C 8138C232
-2C2D 8138C233
-2C2E 8138C234
-2C2F 8138C235
-2C30 8138C236
-2C31 8138C237
-2C32 8138C238
-2C33 8138C239
-2C34 8138C330
-2C35 8138C331
-2C36 8138C332
-2C37 8138C333
-2C38 8138C334
-2C39 8138C335
-2C3A 8138C336
-2C3B 8138C337
-2C3C 8138C338
-2C3D 8138C339
-2C3E 8138C430
-2C3F 8138C431
-2C40 8138C432
-2C41 8138C433
-2C42 8138C434
-2C43 8138C435
-2C44 8138C436
-2C45 8138C437
-2C46 8138C438
-2C47 8138C439
-2C48 8138C530
-2C49 8138C531
-2C4A 8138C532
-2C4B 8138C533
-2C4C 8138C534
-2C4D 8138C535
-2C4E 8138C536
-2C4F 8138C537
-2C50 8138C538
-2C51 8138C539
-2C52 8138C630
-2C53 8138C631
-2C54 8138C632
-2C55 8138C633
-2C56 8138C634
-2C57 8138C635
-2C58 8138C636
-2C59 8138C637
-2C5A 8138C638
-2C5B 8138C639
-2C5C 8138C730
-2C5D 8138C731
-2C5E 8138C732
-2C5F 8138C733
-2C60 8138C734
-2C61 8138C735
-2C62 8138C736
-2C63 8138C737
-2C64 8138C738
-2C65 8138C739
-2C66 8138C830
-2C67 8138C831
-2C68 8138C832
-2C69 8138C833
-2C6A 8138C834
-2C6B 8138C835
-2C6C 8138C836
-2C6D 8138C837
-2C6E 8138C838
-2C6F 8138C839
-2C70 8138C930
-2C71 8138C931
-2C72 8138C932
-2C73 8138C933
-2C74 8138C934
-2C75 8138C935
-2C76 8138C936
-2C77 8138C937
-2C78 8138C938
-2C79 8138C939
-2C7A 8138CA30
-2C7B 8138CA31
-2C7C 8138CA32
-2C7D 8138CA33
-2C7E 8138CA34
-2C7F 8138CA35
-2C80 8138CA36
-2C81 8138CA37
-2C82 8138CA38
-2C83 8138CA39
-2C84 8138CB30
-2C85 8138CB31
-2C86 8138CB32
-2C87 8138CB33
-2C88 8138CB34
-2C89 8138CB35
-2C8A 8138CB36
-2C8B 8138CB37
-2C8C 8138CB38
-2C8D 8138CB39
-2C8E 8138CC30
-2C8F 8138CC31
-2C90 8138CC32
-2C91 8138CC33
-2C92 8138CC34
-2C93 8138CC35
-2C94 8138CC36
-2C95 8138CC37
-2C96 8138CC38
-2C97 8138CC39
-2C98 8138CD30
-2C99 8138CD31
-2C9A 8138CD32
-2C9B 8138CD33
-2C9C 8138CD34
-2C9D 8138CD35
-2C9E 8138CD36
-2C9F 8138CD37
-2CA0 8138CD38
-2CA1 8138CD39
-2CA2 8138CE30
-2CA3 8138CE31
-2CA4 8138CE32
-2CA5 8138CE33
-2CA6 8138CE34
-2CA7 8138CE35
-2CA8 8138CE36
-2CA9 8138CE37
-2CAA 8138CE38
-2CAB 8138CE39
-2CAC 8138CF30
-2CAD 8138CF31
-2CAE 8138CF32
-2CAF 8138CF33
-2CB0 8138CF34
-2CB1 8138CF35
-2CB2 8138CF36
-2CB3 8138CF37
-2CB4 8138CF38
-2CB5 8138CF39
-2CB6 8138D030
-2CB7 8138D031
-2CB8 8138D032
-2CB9 8138D033
-2CBA 8138D034
-2CBB 8138D035
-2CBC 8138D036
-2CBD 8138D037
-2CBE 8138D038
-2CBF 8138D039
-2CC0 8138D130
-2CC1 8138D131
-2CC2 8138D132
-2CC3 8138D133
-2CC4 8138D134
-2CC5 8138D135
-2CC6 8138D136
-2CC7 8138D137
-2CC8 8138D138
-2CC9 8138D139
-2CCA 8138D230
-2CCB 8138D231
-2CCC 8138D232
-2CCD 8138D233
-2CCE 8138D234
-2CCF 8138D235
-2CD0 8138D236
-2CD1 8138D237
-2CD2 8138D238
-2CD3 8138D239
-2CD4 8138D330
-2CD5 8138D331
-2CD6 8138D332
-2CD7 8138D333
-2CD8 8138D334
-2CD9 8138D335
-2CDA 8138D336
-2CDB 8138D337
-2CDC 8138D338
-2CDD 8138D339
-2CDE 8138D430
-2CDF 8138D431
-2CE0 8138D432
-2CE1 8138D433
-2CE2 8138D434
-2CE3 8138D435
-2CE4 8138D436
-2CE5 8138D437
-2CE6 8138D438
-2CE7 8138D439
-2CE8 8138D530
-2CE9 8138D531
-2CEA 8138D532
-2CEB 8138D533
-2CEC 8138D534
-2CED 8138D535
-2CEE 8138D536
-2CEF 8138D537
-2CF0 8138D538
-2CF1 8138D539
-2CF2 8138D630
-2CF3 8138D631
-2CF4 8138D632
-2CF5 8138D633
-2CF6 8138D634
-2CF7 8138D635
-2CF8 8138D636
-2CF9 8138D637
-2CFA 8138D638
-2CFB 8138D639
-2CFC 8138D730
-2CFD 8138D731
-2CFE 8138D732
-2CFF 8138D733
-2D00 8138D734
-2D01 8138D735
-2D02 8138D736
-2D03 8138D737
-2D04 8138D738
-2D05 8138D739
-2D06 8138D830
-2D07 8138D831
-2D08 8138D832
-2D09 8138D833
-2D0A 8138D834
-2D0B 8138D835
-2D0C 8138D836
-2D0D 8138D837
-2D0E 8138D838
-2D0F 8138D839
-2D10 8138D930
-2D11 8138D931
-2D12 8138D932
-2D13 8138D933
-2D14 8138D934
-2D15 8138D935
-2D16 8138D936
-2D17 8138D937
-2D18 8138D938
-2D19 8138D939
-2D1A 8138DA30
-2D1B 8138DA31
-2D1C 8138DA32
-2D1D 8138DA33
-2D1E 8138DA34
-2D1F 8138DA35
-2D20 8138DA36
-2D21 8138DA37
-2D22 8138DA38
-2D23 8138DA39
-2D24 8138DB30
-2D25 8138DB31
-2D26 8138DB32
-2D27 8138DB33
-2D28 8138DB34
-2D29 8138DB35
-2D2A 8138DB36
-2D2B 8138DB37
-2D2C 8138DB38
-2D2D 8138DB39
-2D2E 8138DC30
-2D2F 8138DC31
-2D30 8138DC32
-2D31 8138DC33
-2D32 8138DC34
-2D33 8138DC35
-2D34 8138DC36
-2D35 8138DC37
-2D36 8138DC38
-2D37 8138DC39
-2D38 8138DD30
-2D39 8138DD31
-2D3A 8138DD32
-2D3B 8138DD33
-2D3C 8138DD34
-2D3D 8138DD35
-2D3E 8138DD36
-2D3F 8138DD37
-2D40 8138DD38
-2D41 8138DD39
-2D42 8138DE30
-2D43 8138DE31
-2D44 8138DE32
-2D45 8138DE33
-2D46 8138DE34
-2D47 8138DE35
-2D48 8138DE36
-2D49 8138DE37
-2D4A 8138DE38
-2D4B 8138DE39
-2D4C 8138DF30
-2D4D 8138DF31
-2D4E 8138DF32
-2D4F 8138DF33
-2D50 8138DF34
-2D51 8138DF35
-2D52 8138DF36
-2D53 8138DF37
-2D54 8138DF38
-2D55 8138DF39
-2D56 8138E030
-2D57 8138E031
-2D58 8138E032
-2D59 8138E033
-2D5A 8138E034
-2D5B 8138E035
-2D5C 8138E036
-2D5D 8138E037
-2D5E 8138E038
-2D5F 8138E039
-2D60 8138E130
-2D61 8138E131
-2D62 8138E132
-2D63 8138E133
-2D64 8138E134
-2D65 8138E135
-2D66 8138E136
-2D67 8138E137
-2D68 8138E138
-2D69 8138E139
-2D6A 8138E230
-2D6B 8138E231
-2D6C 8138E232
-2D6D 8138E233
-2D6E 8138E234
-2D6F 8138E235
-2D70 8138E236
-2D71 8138E237
-2D72 8138E238
-2D73 8138E239
-2D74 8138E330
-2D75 8138E331
-2D76 8138E332
-2D77 8138E333
-2D78 8138E334
-2D79 8138E335
-2D7A 8138E336
-2D7B 8138E337
-2D7C 8138E338
-2D7D 8138E339
-2D7E 8138E430
-2D7F 8138E431
-2D80 8138E432
-2D81 8138E433
-2D82 8138E434
-2D83 8138E435
-2D84 8138E436
-2D85 8138E437
-2D86 8138E438
-2D87 8138E439
-2D88 8138E530
-2D89 8138E531
-2D8A 8138E532
-2D8B 8138E533
-2D8C 8138E534
-2D8D 8138E535
-2D8E 8138E536
-2D8F 8138E537
-2D90 8138E538
-2D91 8138E539
-2D92 8138E630
-2D93 8138E631
-2D94 8138E632
-2D95 8138E633
-2D96 8138E634
-2D97 8138E635
-2D98 8138E636
-2D99 8138E637
-2D9A 8138E638
-2D9B 8138E639
-2D9C 8138E730
-2D9D 8138E731
-2D9E 8138E732
-2D9F 8138E733
-2DA0 8138E734
-2DA1 8138E735
-2DA2 8138E736
-2DA3 8138E737
-2DA4 8138E738
-2DA5 8138E739
-2DA6 8138E830
-2DA7 8138E831
-2DA8 8138E832
-2DA9 8138E833
-2DAA 8138E834
-2DAB 8138E835
-2DAC 8138E836
-2DAD 8138E837
-2DAE 8138E838
-2DAF 8138E839
-2DB0 8138E930
-2DB1 8138E931
-2DB2 8138E932
-2DB3 8138E933
-2DB4 8138E934
-2DB5 8138E935
-2DB6 8138E936
-2DB7 8138E937
-2DB8 8138E938
-2DB9 8138E939
-2DBA 8138EA30
-2DBB 8138EA31
-2DBC 8138EA32
-2DBD 8138EA33
-2DBE 8138EA34
-2DBF 8138EA35
-2DC0 8138EA36
-2DC1 8138EA37
-2DC2 8138EA38
-2DC3 8138EA39
-2DC4 8138EB30
-2DC5 8138EB31
-2DC6 8138EB32
-2DC7 8138EB33
-2DC8 8138EB34
-2DC9 8138EB35
-2DCA 8138EB36
-2DCB 8138EB37
-2DCC 8138EB38
-2DCD 8138EB39
-2DCE 8138EC30
-2DCF 8138EC31
-2DD0 8138EC32
-2DD1 8138EC33
-2DD2 8138EC34
-2DD3 8138EC35
-2DD4 8138EC36
-2DD5 8138EC37
-2DD6 8138EC38
-2DD7 8138EC39
-2DD8 8138ED30
-2DD9 8138ED31
-2DDA 8138ED32
-2DDB 8138ED33
-2DDC 8138ED34
-2DDD 8138ED35
-2DDE 8138ED36
-2DDF 8138ED37
-2DE0 8138ED38
-2DE1 8138ED39
-2DE2 8138EE30
-2DE3 8138EE31
-2DE4 8138EE32
-2DE5 8138EE33
-2DE6 8138EE34
-2DE7 8138EE35
-2DE8 8138EE36
-2DE9 8138EE37
-2DEA 8138EE38
-2DEB 8138EE39
-2DEC 8138EF30
-2DED 8138EF31
-2DEE 8138EF32
-2DEF 8138EF33
-2DF0 8138EF34
-2DF1 8138EF35
-2DF2 8138EF36
-2DF3 8138EF37
-2DF4 8138EF38
-2DF5 8138EF39
-2DF6 8138F030
-2DF7 8138F031
-2DF8 8138F032
-2DF9 8138F033
-2DFA 8138F034
-2DFB 8138F035
-2DFC 8138F036
-2DFD 8138F037
-2DFE 8138F038
-2DFF 8138F039
-2E00 8138F130
-2E01 8138F131
-2E02 8138F132
-2E03 8138F133
-2E04 8138F134
-2E05 8138F135
-2E06 8138F136
-2E07 8138F137
-2E08 8138F138
-2E09 8138F139
-2E0A 8138F230
-2E0B 8138F231
-2E0C 8138F232
-2E0D 8138F233
-2E0E 8138F234
-2E0F 8138F235
-2E10 8138F236
-2E11 8138F237
-2E12 8138F238
-2E13 8138F239
-2E14 8138F330
-2E15 8138F331
-2E16 8138F332
-2E17 8138F333
-2E18 8138F334
-2E19 8138F335
-2E1A 8138F336
-2E1B 8138F337
-2E1C 8138F338
-2E1D 8138F339
-2E1E 8138F430
-2E1F 8138F431
-2E20 8138F432
-2E21 8138F433
-2E22 8138F434
-2E23 8138F435
-2E24 8138F436
-2E25 8138F437
-2E26 8138F438
-2E27 8138F439
-2E28 8138F530
-2E29 8138F531
-2E2A 8138F532
-2E2B 8138F533
-2E2C 8138F534
-2E2D 8138F535
-2E2E 8138F536
-2E2F 8138F537
-2E30 8138F538
-2E31 8138F539
-2E32 8138F630
-2E33 8138F631
-2E34 8138F632
-2E35 8138F633
-2E36 8138F634
-2E37 8138F635
-2E38 8138F636
-2E39 8138F637
-2E3A 8138F638
-2E3B 8138F639
-2E3C 8138F730
-2E3D 8138F731
-2E3E 8138F732
-2E3F 8138F733
-2E40 8138F734
-2E41 8138F735
-2E42 8138F736
-2E43 8138F737
-2E44 8138F738
-2E45 8138F739
-2E46 8138F830
-2E47 8138F831
-2E48 8138F832
-2E49 8138F833
-2E4A 8138F834
-2E4B 8138F835
-2E4C 8138F836
-2E4D 8138F837
-2E4E 8138F838
-2E4F 8138F839
-2E50 8138F930
-2E51 8138F931
-2E52 8138F932
-2E53 8138F933
-2E54 8138F934
-2E55 8138F935
-2E56 8138F936
-2E57 8138F937
-2E58 8138F938
-2E59 8138F939
-2E5A 8138FA30
-2E5B 8138FA31
-2E5C 8138FA32
-2E5D 8138FA33
-2E5E 8138FA34
-2E5F 8138FA35
-2E60 8138FA36
-2E61 8138FA37
-2E62 8138FA38
-2E63 8138FA39
-2E64 8138FB30
-2E65 8138FB31
-2E66 8138FB32
-2E67 8138FB33
-2E68 8138FB34
-2E69 8138FB35
-2E6A 8138FB36
-2E6B 8138FB37
-2E6C 8138FB38
-2E6D 8138FB39
-2E6E 8138FC30
-2E6F 8138FC31
-2E70 8138FC32
-2E71 8138FC33
-2E72 8138FC34
-2E73 8138FC35
-2E74 8138FC36
-2E75 8138FC37
-2E76 8138FC38
-2E77 8138FC39
-2E78 8138FD30
-2E79 8138FD31
-2E7A 8138FD32
-2E7B 8138FD33
-2E7C 8138FD34
-2E7D 8138FD35
-2E7E 8138FD36
-2E7F 8138FD37
-2E80 8138FD38
-2E81 FE50
-2E82 8138FD39
-2E83 8138FE30
-2E84 FE54
-2E85 8138FE31
-2E86 8138FE32
-2E87 8138FE33
-2E88 FE57
-2E89 8138FE34
-2E8A 8138FE35
-2E8B FE58
-2E8C FE5D
-2E8D 8138FE36
-2E8E 8138FE37
-2E8F 8138FE38
-2E90 8138FE39
-2E91 81398130
-2E92 81398131
-2E93 81398132
-2E94 81398133
-2E95 81398134
-2E96 81398135
-2E97 FE5E
-2E98 81398136
-2E99 81398137
-2E9A 81398138
-2E9B 81398139
-2E9C 81398230
-2E9D 81398231
-2E9E 81398232
-2E9F 81398233
-2EA0 81398234
-2EA1 81398235
-2EA2 81398236
-2EA3 81398237
-2EA4 81398238
-2EA5 81398239
-2EA6 81398330
-2EA7 FE6B
-2EA8 81398331
-2EA9 81398332
-2EAA FE6E
-2EAB 81398333
-2EAC 81398334
-2EAD 81398335
-2EAE FE71
-2EAF 81398336
-2EB0 81398337
-2EB1 81398338
-2EB2 81398339
-2EB3 FE73
-2EB4 81398430
-2EB5 81398431
-2EB6 FE74
-2EB7 FE75
-2EB8 81398432
-2EB9 81398433
-2EBA 81398434
-2EBB FE79
-2EBC 81398435
-2EBD 81398436
-2EBE 81398437
-2EBF 81398438
-2EC0 81398439
-2EC1 81398530
-2EC2 81398531
-2EC3 81398532
-2EC4 81398533
-2EC5 81398534
-2EC6 81398535
-2EC7 81398536
-2EC8 81398537
-2EC9 81398538
-2ECA FE84
-2ECB 81398539
-2ECC 81398630
-2ECD 81398631
-2ECE 81398632
-2ECF 81398633
-2ED0 81398634
-2ED1 81398635
-2ED2 81398636
-2ED3 81398637
-2ED4 81398638
-2ED5 81398639
-2ED6 81398730
-2ED7 81398731
-2ED8 81398732
-2ED9 81398733
-2EDA 81398734
-2EDB 81398735
-2EDC 81398736
-2EDD 81398737
-2EDE 81398738
-2EDF 81398739
-2EE0 81398830
-2EE1 81398831
-2EE2 81398832
-2EE3 81398833
-2EE4 81398834
-2EE5 81398835
-2EE6 81398836
-2EE7 81398837
-2EE8 81398838
-2EE9 81398839
-2EEA 81398930
-2EEB 81398931
-2EEC 81398932
-2EED 81398933
-2EEE 81398934
-2EEF 81398935
-2EF0 81398936
-2EF1 81398937
-2EF2 81398938
-2EF3 81398939
-2EF4 81398A30
-2EF5 81398A31
-2EF6 81398A32
-2EF7 81398A33
-2EF8 81398A34
-2EF9 81398A35
-2EFA 81398A36
-2EFB 81398A37
-2EFC 81398A38
-2EFD 81398A39
-2EFE 81398B30
-2EFF 81398B31
-2F00 81398B32
-2F01 81398B33
-2F02 81398B34
-2F03 81398B35
-2F04 81398B36
-2F05 81398B37
-2F06 81398B38
-2F07 81398B39
-2F08 81398C30
-2F09 81398C31
-2F0A 81398C32
-2F0B 81398C33
-2F0C 81398C34
-2F0D 81398C35
-2F0E 81398C36
-2F0F 81398C37
-2F10 81398C38
-2F11 81398C39
-2F12 81398D30
-2F13 81398D31
-2F14 81398D32
-2F15 81398D33
-2F16 81398D34
-2F17 81398D35
-2F18 81398D36
-2F19 81398D37
-2F1A 81398D38
-2F1B 81398D39
-2F1C 81398E30
-2F1D 81398E31
-2F1E 81398E32
-2F1F 81398E33
-2F20 81398E34
-2F21 81398E35
-2F22 81398E36
-2F23 81398E37
-2F24 81398E38
-2F25 81398E39
-2F26 81398F30
-2F27 81398F31
-2F28 81398F32
-2F29 81398F33
-2F2A 81398F34
-2F2B 81398F35
-2F2C 81398F36
-2F2D 81398F37
-2F2E 81398F38
-2F2F 81398F39
-2F30 81399030
-2F31 81399031
-2F32 81399032
-2F33 81399033
-2F34 81399034
-2F35 81399035
-2F36 81399036
-2F37 81399037
-2F38 81399038
-2F39 81399039
-2F3A 81399130
-2F3B 81399131
-2F3C 81399132
-2F3D 81399133
-2F3E 81399134
-2F3F 81399135
-2F40 81399136
-2F41 81399137
-2F42 81399138
-2F43 81399139
-2F44 81399230
-2F45 81399231
-2F46 81399232
-2F47 81399233
-2F48 81399234
-2F49 81399235
-2F4A 81399236
-2F4B 81399237
-2F4C 81399238
-2F4D 81399239
-2F4E 81399330
-2F4F 81399331
-2F50 81399332
-2F51 81399333
-2F52 81399334
-2F53 81399335
-2F54 81399336
-2F55 81399337
-2F56 81399338
-2F57 81399339
-2F58 81399430
-2F59 81399431
-2F5A 81399432
-2F5B 81399433
-2F5C 81399434
-2F5D 81399435
-2F5E 81399436
-2F5F 81399437
-2F60 81399438
-2F61 81399439
-2F62 81399530
-2F63 81399531
-2F64 81399532
-2F65 81399533
-2F66 81399534
-2F67 81399535
-2F68 81399536
-2F69 81399537
-2F6A 81399538
-2F6B 81399539
-2F6C 81399630
-2F6D 81399631
-2F6E 81399632
-2F6F 81399633
-2F70 81399634
-2F71 81399635
-2F72 81399636
-2F73 81399637
-2F74 81399638
-2F75 81399639
-2F76 81399730
-2F77 81399731
-2F78 81399732
-2F79 81399733
-2F7A 81399734
-2F7B 81399735
-2F7C 81399736
-2F7D 81399737
-2F7E 81399738
-2F7F 81399739
-2F80 81399830
-2F81 81399831
-2F82 81399832
-2F83 81399833
-2F84 81399834
-2F85 81399835
-2F86 81399836
-2F87 81399837
-2F88 81399838
-2F89 81399839
-2F8A 81399930
-2F8B 81399931
-2F8C 81399932
-2F8D 81399933
-2F8E 81399934
-2F8F 81399935
-2F90 81399936
-2F91 81399937
-2F92 81399938
-2F93 81399939
-2F94 81399A30
-2F95 81399A31
-2F96 81399A32
-2F97 81399A33
-2F98 81399A34
-2F99 81399A35
-2F9A 81399A36
-2F9B 81399A37
-2F9C 81399A38
-2F9D 81399A39
-2F9E 81399B30
-2F9F 81399B31
-2FA0 81399B32
-2FA1 81399B33
-2FA2 81399B34
-2FA3 81399B35
-2FA4 81399B36
-2FA5 81399B37
-2FA6 81399B38
-2FA7 81399B39
-2FA8 81399C30
-2FA9 81399C31
-2FAA 81399C32
-2FAB 81399C33
-2FAC 81399C34
-2FAD 81399C35
-2FAE 81399C36
-2FAF 81399C37
-2FB0 81399C38
-2FB1 81399C39
-2FB2 81399D30
-2FB3 81399D31
-2FB4 81399D32
-2FB5 81399D33
-2FB6 81399D34
-2FB7 81399D35
-2FB8 81399D36
-2FB9 81399D37
-2FBA 81399D38
-2FBB 81399D39
-2FBC 81399E30
-2FBD 81399E31
-2FBE 81399E32
-2FBF 81399E33
-2FC0 81399E34
-2FC1 81399E35
-2FC2 81399E36
-2FC3 81399E37
-2FC4 81399E38
-2FC5 81399E39
-2FC6 81399F30
-2FC7 81399F31
-2FC8 81399F32
-2FC9 81399F33
-2FCA 81399F34
-2FCB 81399F35
-2FCC 81399F36
-2FCD 81399F37
-2FCE 81399F38
-2FCF 81399F39
-2FD0 8139A030
-2FD1 8139A031
-2FD2 8139A032
-2FD3 8139A033
-2FD4 8139A034
-2FD5 8139A035
-2FD6 8139A036
-2FD7 8139A037
-2FD8 8139A038
-2FD9 8139A039
-2FDA 8139A130
-2FDB 8139A131
-2FDC 8139A132
-2FDD 8139A133
-2FDE 8139A134
-2FDF 8139A135
-2FE0 8139A136
-2FE1 8139A137
-2FE2 8139A138
-2FE3 8139A139
-2FE4 8139A230
-2FE5 8139A231
-2FE6 8139A232
-2FE7 8139A233
-2FE8 8139A234
-2FE9 8139A235
-2FEA 8139A236
-2FEB 8139A237
-2FEC 8139A238
-2FED 8139A239
-2FEE 8139A330
-2FEF 8139A331
-2FF0 A98A
-2FF1 A98B
-2FF2 A98C
-2FF3 A98D
-2FF4 A98E
-2FF5 A98F
-2FF6 A990
-2FF7 A991
-2FF8 A992
-2FF9 A993
-2FFA A994
-2FFB A995
-2FFC 8139A332
-2FFD 8139A333
-2FFE 8139A334
-2FFF 8139A335
-3000 A1A1
-3001 A1A2
-3002 A1A3
-3003 A1A8
-3004 8139A336
-3005 A1A9
-3006 A965
-3007 A996
-3008 A1B4
-3009 A1B5
-300A A1B6
-300B A1B7
-300C A1B8
-300D A1B9
-300E A1BA
-300F A1BB
-3010 A1BE
-3011 A1BF
-3012 A893
-3013 A1FE
-3014 A1B2
-3015 A1B3
-3016 A1BC
-3017 A1BD
-3018 8139A337
-3019 8139A338
-301A 8139A339
-301B 8139A430
-301C 8139A431
-301D A894
-301E A895
-301F 8139A432
-3020 8139A433
-3021 A940
-3022 A941
-3023 A942
-3024 A943
-3025 A944
-3026 A945
-3027 A946
-3028 A947
-3029 A948
-302A 8139A434
-302B 8139A435
-302C 8139A436
-302D 8139A437
-302E 8139A438
-302F 8139A439
-3030 8139A530
-3031 8139A531
-3032 8139A532
-3033 8139A533
-3034 8139A534
-3035 8139A535
-3036 8139A536
-3037 8139A537
-3038 8139A538
-3039 8139A539
-303A 8139A630
-303B 8139A631
-303C 8139A632
-303D 8139A633
-303E A989
-303F 8139A634
-3040 8139A635
-3041 A4A1
-3042 A4A2
-3043 A4A3
-3044 A4A4
-3045 A4A5
-3046 A4A6
-3047 A4A7
-3048 A4A8
-3049 A4A9
-304A A4AA
-304B A4AB
-304C A4AC
-304D A4AD
-304E A4AE
-304F A4AF
-3050 A4B0
-3051 A4B1
-3052 A4B2
-3053 A4B3
-3054 A4B4
-3055 A4B5
-3056 A4B6
-3057 A4B7
-3058 A4B8
-3059 A4B9
-305A A4BA
-305B A4BB
-305C A4BC
-305D A4BD
-305E A4BE
-305F A4BF
-3060 A4C0
-3061 A4C1
-3062 A4C2
-3063 A4C3
-3064 A4C4
-3065 A4C5
-3066 A4C6
-3067 A4C7
-3068 A4C8
-3069 A4C9
-306A A4CA
-306B A4CB
-306C A4CC
-306D A4CD
-306E A4CE
-306F A4CF
-3070 A4D0
-3071 A4D1
-3072 A4D2
-3073 A4D3
-3074 A4D4
-3075 A4D5
-3076 A4D6
-3077 A4D7
-3078 A4D8
-3079 A4D9
-307A A4DA
-307B A4DB
-307C A4DC
-307D A4DD
-307E A4DE
-307F A4DF
-3080 A4E0
-3081 A4E1
-3082 A4E2
-3083 A4E3
-3084 A4E4
-3085 A4E5
-3086 A4E6
-3087 A4E7
-3088 A4E8
-3089 A4E9
-308A A4EA
-308B A4EB
-308C A4EC
-308D A4ED
-308E A4EE
-308F A4EF
-3090 A4F0
-3091 A4F1
-3092 A4F2
-3093 A4F3
-3094 8139A636
-3095 8139A637
-3096 8139A638
-3097 8139A639
-3098 8139A730
-3099 8139A731
-309A 8139A732
-309B A961
-309C A962
-309D A966
-309E A967
-309F 8139A733
-30A0 8139A734
-30A1 A5A1
-30A2 A5A2
-30A3 A5A3
-30A4 A5A4
-30A5 A5A5
-30A6 A5A6
-30A7 A5A7
-30A8 A5A8
-30A9 A5A9
-30AA A5AA
-30AB A5AB
-30AC A5AC
-30AD A5AD
-30AE A5AE
-30AF A5AF
-30B0 A5B0
-30B1 A5B1
-30B2 A5B2
-30B3 A5B3
-30B4 A5B4
-30B5 A5B5
-30B6 A5B6
-30B7 A5B7
-30B8 A5B8
-30B9 A5B9
-30BA A5BA
-30BB A5BB
-30BC A5BC
-30BD A5BD
-30BE A5BE
-30BF A5BF
-30C0 A5C0
-30C1 A5C1
-30C2 A5C2
-30C3 A5C3
-30C4 A5C4
-30C5 A5C5
-30C6 A5C6
-30C7 A5C7
-30C8 A5C8
-30C9 A5C9
-30CA A5CA
-30CB A5CB
-30CC A5CC
-30CD A5CD
-30CE A5CE
-30CF A5CF
-30D0 A5D0
-30D1 A5D1
-30D2 A5D2
-30D3 A5D3
-30D4 A5D4
-30D5 A5D5
-30D6 A5D6
-30D7 A5D7
-30D8 A5D8
-30D9 A5D9
-30DA A5DA
-30DB A5DB
-30DC A5DC
-30DD A5DD
-30DE A5DE
-30DF A5DF
-30E0 A5E0
-30E1 A5E1
-30E2 A5E2
-30E3 A5E3
-30E4 A5E4
-30E5 A5E5
-30E6 A5E6
-30E7 A5E7
-30E8 A5E8
-30E9 A5E9
-30EA A5EA
-30EB A5EB
-30EC A5EC
-30ED A5ED
-30EE A5EE
-30EF A5EF
-30F0 A5F0
-30F1 A5F1
-30F2 A5F2
-30F3 A5F3
-30F4 A5F4
-30F5 A5F5
-30F6 A5F6
-30F7 8139A735
-30F8 8139A736
-30F9 8139A737
-30FA 8139A738
-30FB 8139A739
-30FC A960
-30FD A963
-30FE A964
-30FF 8139A830
-3100 8139A831
-3101 8139A832
-3102 8139A833
-3103 8139A834
-3104 8139A835
-3105 A8C5
-3106 A8C6
-3107 A8C7
-3108 A8C8
-3109 A8C9
-310A A8CA
-310B A8CB
-310C A8CC
-310D A8CD
-310E A8CE
-310F A8CF
-3110 A8D0
-3111 A8D1
-3112 A8D2
-3113 A8D3
-3114 A8D4
-3115 A8D5
-3116 A8D6
-3117 A8D7
-3118 A8D8
-3119 A8D9
-311A A8DA
-311B A8DB
-311C A8DC
-311D A8DD
-311E A8DE
-311F A8DF
-3120 A8E0
-3121 A8E1
-3122 A8E2
-3123 A8E3
-3124 A8E4
-3125 A8E5
-3126 A8E6
-3127 A8E7
-3128 A8E8
-3129 A8E9
-312A 8139A836
-312B 8139A837
-312C 8139A838
-312D 8139A839
-312E 8139A930
-312F 8139A931
-3130 8139A932
-3131 8139A933
-3132 8139A934
-3133 8139A935
-3134 8139A936
-3135 8139A937
-3136 8139A938
-3137 8139A939
-3138 8139AA30
-3139 8139AA31
-313A 8139AA32
-313B 8139AA33
-313C 8139AA34
-313D 8139AA35
-313E 8139AA36
-313F 8139AA37
-3140 8139AA38
-3141 8139AA39
-3142 8139AB30
-3143 8139AB31
-3144 8139AB32
-3145 8139AB33
-3146 8139AB34
-3147 8139AB35
-3148 8139AB36
-3149 8139AB37
-314A 8139AB38
-314B 8139AB39
-314C 8139AC30
-314D 8139AC31
-314E 8139AC32
-314F 8139AC33
-3150 8139AC34
-3151 8139AC35
-3152 8139AC36
-3153 8139AC37
-3154 8139AC38
-3155 8139AC39
-3156 8139AD30
-3157 8139AD31
-3158 8139AD32
-3159 8139AD33
-315A 8139AD34
-315B 8139AD35
-315C 8139AD36
-315D 8139AD37
-315E 8139AD38
-315F 8139AD39
-3160 8139AE30
-3161 8139AE31
-3162 8139AE32
-3163 8139AE33
-3164 8139AE34
-3165 8139AE35
-3166 8139AE36
-3167 8139AE37
-3168 8139AE38
-3169 8139AE39
-316A 8139AF30
-316B 8139AF31
-316C 8139AF32
-316D 8139AF33
-316E 8139AF34
-316F 8139AF35
-3170 8139AF36
-3171 8139AF37
-3172 8139AF38
-3173 8139AF39
-3174 8139B030
-3175 8139B031
-3176 8139B032
-3177 8139B033
-3178 8139B034
-3179 8139B035
-317A 8139B036
-317B 8139B037
-317C 8139B038
-317D 8139B039
-317E 8139B130
-317F 8139B131
-3180 8139B132
-3181 8139B133
-3182 8139B134
-3183 8139B135
-3184 8139B136
-3185 8139B137
-3186 8139B138
-3187 8139B139
-3188 8139B230
-3189 8139B231
-318A 8139B232
-318B 8139B233
-318C 8139B234
-318D 8139B235
-318E 8139B236
-318F 8139B237
-3190 8139B238
-3191 8139B239
-3192 8139B330
-3193 8139B331
-3194 8139B332
-3195 8139B333
-3196 8139B334
-3197 8139B335
-3198 8139B336
-3199 8139B337
-319A 8139B338
-319B 8139B339
-319C 8139B430
-319D 8139B431
-319E 8139B432
-319F 8139B433
-31A0 8139B434
-31A1 8139B435
-31A2 8139B436
-31A3 8139B437
-31A4 8139B438
-31A5 8139B439
-31A6 8139B530
-31A7 8139B531
-31A8 8139B532
-31A9 8139B533
-31AA 8139B534
-31AB 8139B535
-31AC 8139B536
-31AD 8139B537
-31AE 8139B538
-31AF 8139B539
-31B0 8139B630
-31B1 8139B631
-31B2 8139B632
-31B3 8139B633
-31B4 8139B634
-31B5 8139B635
-31B6 8139B636
-31B7 8139B637
-31B8 8139B638
-31B9 8139B639
-31BA 8139B730
-31BB 8139B731
-31BC 8139B732
-31BD 8139B733
-31BE 8139B734
-31BF 8139B735
-31C0 8139B736
-31C1 8139B737
-31C2 8139B738
-31C3 8139B739
-31C4 8139B830
-31C5 8139B831
-31C6 8139B832
-31C7 8139B833
-31C8 8139B834
-31C9 8139B835
-31CA 8139B836
-31CB 8139B837
-31CC 8139B838
-31CD 8139B839
-31CE 8139B930
-31CF 8139B931
-31D0 8139B932
-31D1 8139B933
-31D2 8139B934
-31D3 8139B935
-31D4 8139B936
-31D5 8139B937
-31D6 8139B938
-31D7 8139B939
-31D8 8139BA30
-31D9 8139BA31
-31DA 8139BA32
-31DB 8139BA33
-31DC 8139BA34
-31DD 8139BA35
-31DE 8139BA36
-31DF 8139BA37
-31E0 8139BA38
-31E1 8139BA39
-31E2 8139BB30
-31E3 8139BB31
-31E4 8139BB32
-31E5 8139BB33
-31E6 8139BB34
-31E7 8139BB35
-31E8 8139BB36
-31E9 8139BB37
-31EA 8139BB38
-31EB 8139BB39
-31EC 8139BC30
-31ED 8139BC31
-31EE 8139BC32
-31EF 8139BC33
-31F0 8139BC34
-31F1 8139BC35
-31F2 8139BC36
-31F3 8139BC37
-31F4 8139BC38
-31F5 8139BC39
-31F6 8139BD30
-31F7 8139BD31
-31F8 8139BD32
-31F9 8139BD33
-31FA 8139BD34
-31FB 8139BD35
-31FC 8139BD36
-31FD 8139BD37
-31FE 8139BD38
-31FF 8139BD39
-3200 8139BE30
-3201 8139BE31
-3202 8139BE32
-3203 8139BE33
-3204 8139BE34
-3205 8139BE35
-3206 8139BE36
-3207 8139BE37
-3208 8139BE38
-3209 8139BE39
-320A 8139BF30
-320B 8139BF31
-320C 8139BF32
-320D 8139BF33
-320E 8139BF34
-320F 8139BF35
-3210 8139BF36
-3211 8139BF37
-3212 8139BF38
-3213 8139BF39
-3214 8139C030
-3215 8139C031
-3216 8139C032
-3217 8139C033
-3218 8139C034
-3219 8139C035
-321A 8139C036
-321B 8139C037
-321C 8139C038
-321D 8139C039
-321E 8139C130
-321F 8139C131
-3220 A2E5
-3221 A2E6
-3222 A2E7
-3223 A2E8
-3224 A2E9
-3225 A2EA
-3226 A2EB
-3227 A2EC
-3228 A2ED
-3229 A2EE
-322A 8139C132
-322B 8139C133
-322C 8139C134
-322D 8139C135
-322E 8139C136
-322F 8139C137
-3230 8139C138
-3231 A95A
-3232 8139C139
-3233 8139C230
-3234 8139C231
-3235 8139C232
-3236 8139C233
-3237 8139C234
-3238 8139C235
-3239 8139C236
-323A 8139C237
-323B 8139C238
-323C 8139C239
-323D 8139C330
-323E 8139C331
-323F 8139C332
-3240 8139C333
-3241 8139C334
-3242 8139C335
-3243 8139C336
-3244 8139C337
-3245 8139C338
-3246 8139C339
-3247 8139C430
-3248 8139C431
-3249 8139C432
-324A 8139C433
-324B 8139C434
-324C 8139C435
-324D 8139C436
-324E 8139C437
-324F 8139C438
-3250 8139C439
-3251 8139C530
-3252 8139C531
-3253 8139C532
-3254 8139C533
-3255 8139C534
-3256 8139C535
-3257 8139C536
-3258 8139C537
-3259 8139C538
-325A 8139C539
-325B 8139C630
-325C 8139C631
-325D 8139C632
-325E 8139C633
-325F 8139C634
-3260 8139C635
-3261 8139C636
-3262 8139C637
-3263 8139C638
-3264 8139C639
-3265 8139C730
-3266 8139C731
-3267 8139C732
-3268 8139C733
-3269 8139C734
-326A 8139C735
-326B 8139C736
-326C 8139C737
-326D 8139C738
-326E 8139C739
-326F 8139C830
-3270 8139C831
-3271 8139C832
-3272 8139C833
-3273 8139C834
-3274 8139C835
-3275 8139C836
-3276 8139C837
-3277 8139C838
-3278 8139C839
-3279 8139C930
-327A 8139C931
-327B 8139C932
-327C 8139C933
-327D 8139C934
-327E 8139C935
-327F 8139C936
-3280 8139C937
-3281 8139C938
-3282 8139C939
-3283 8139CA30
-3284 8139CA31
-3285 8139CA32
-3286 8139CA33
-3287 8139CA34
-3288 8139CA35
-3289 8139CA36
-328A 8139CA37
-328B 8139CA38
-328C 8139CA39
-328D 8139CB30
-328E 8139CB31
-328F 8139CB32
-3290 8139CB33
-3291 8139CB34
-3292 8139CB35
-3293 8139CB36
-3294 8139CB37
-3295 8139CB38
-3296 8139CB39
-3297 8139CC30
-3298 8139CC31
-3299 8139CC32
-329A 8139CC33
-329B 8139CC34
-329C 8139CC35
-329D 8139CC36
-329E 8139CC37
-329F 8139CC38
-32A0 8139CC39
-32A1 8139CD30
-32A2 8139CD31
-32A3 A949
-32A4 8139CD32
-32A5 8139CD33
-32A6 8139CD34
-32A7 8139CD35
-32A8 8139CD36
-32A9 8139CD37
-32AA 8139CD38
-32AB 8139CD39
-32AC 8139CE30
-32AD 8139CE31
-32AE 8139CE32
-32AF 8139CE33
-32B0 8139CE34
-32B1 8139CE35
-32B2 8139CE36
-32B3 8139CE37
-32B4 8139CE38
-32B5 8139CE39
-32B6 8139CF30
-32B7 8139CF31
-32B8 8139CF32
-32B9 8139CF33
-32BA 8139CF34
-32BB 8139CF35
-32BC 8139CF36
-32BD 8139CF37
-32BE 8139CF38
-32BF 8139CF39
-32C0 8139D030
-32C1 8139D031
-32C2 8139D032
-32C3 8139D033
-32C4 8139D034
-32C5 8139D035
-32C6 8139D036
-32C7 8139D037
-32C8 8139D038
-32C9 8139D039
-32CA 8139D130
-32CB 8139D131
-32CC 8139D132
-32CD 8139D133
-32CE 8139D134
-32CF 8139D135
-32D0 8139D136
-32D1 8139D137
-32D2 8139D138
-32D3 8139D139
-32D4 8139D230
-32D5 8139D231
-32D6 8139D232
-32D7 8139D233
-32D8 8139D234
-32D9 8139D235
-32DA 8139D236
-32DB 8139D237
-32DC 8139D238
-32DD 8139D239
-32DE 8139D330
-32DF 8139D331
-32E0 8139D332
-32E1 8139D333
-32E2 8139D334
-32E3 8139D335
-32E4 8139D336
-32E5 8139D337
-32E6 8139D338
-32E7 8139D339
-32E8 8139D430
-32E9 8139D431
-32EA 8139D432
-32EB 8139D433
-32EC 8139D434
-32ED 8139D435
-32EE 8139D436
-32EF 8139D437
-32F0 8139D438
-32F1 8139D439
-32F2 8139D530
-32F3 8139D531
-32F4 8139D532
-32F5 8139D533
-32F6 8139D534
-32F7 8139D535
-32F8 8139D536
-32F9 8139D537
-32FA 8139D538
-32FB 8139D539
-32FC 8139D630
-32FD 8139D631
-32FE 8139D632
-32FF 8139D633
-3300 8139D634
-3301 8139D635
-3302 8139D636
-3303 8139D637
-3304 8139D638
-3305 8139D639
-3306 8139D730
-3307 8139D731
-3308 8139D732
-3309 8139D733
-330A 8139D734
-330B 8139D735
-330C 8139D736
-330D 8139D737
-330E 8139D738
-330F 8139D739
-3310 8139D830
-3311 8139D831
-3312 8139D832
-3313 8139D833
-3314 8139D834
-3315 8139D835
-3316 8139D836
-3317 8139D837
-3318 8139D838
-3319 8139D839
-331A 8139D930
-331B 8139D931
-331C 8139D932
-331D 8139D933
-331E 8139D934
-331F 8139D935
-3320 8139D936
-3321 8139D937
-3322 8139D938
-3323 8139D939
-3324 8139DA30
-3325 8139DA31
-3326 8139DA32
-3327 8139DA33
-3328 8139DA34
-3329 8139DA35
-332A 8139DA36
-332B 8139DA37
-332C 8139DA38
-332D 8139DA39
-332E 8139DB30
-332F 8139DB31
-3330 8139DB32
-3331 8139DB33
-3332 8139DB34
-3333 8139DB35
-3334 8139DB36
-3335 8139DB37
-3336 8139DB38
-3337 8139DB39
-3338 8139DC30
-3339 8139DC31
-333A 8139DC32
-333B 8139DC33
-333C 8139DC34
-333D 8139DC35
-333E 8139DC36
-333F 8139DC37
-3340 8139DC38
-3341 8139DC39
-3342 8139DD30
-3343 8139DD31
-3344 8139DD32
-3345 8139DD33
-3346 8139DD34
-3347 8139DD35
-3348 8139DD36
-3349 8139DD37
-334A 8139DD38
-334B 8139DD39
-334C 8139DE30
-334D 8139DE31
-334E 8139DE32
-334F 8139DE33
-3350 8139DE34
-3351 8139DE35
-3352 8139DE36
-3353 8139DE37
-3354 8139DE38
-3355 8139DE39
-3356 8139DF30
-3357 8139DF31
-3358 8139DF32
-3359 8139DF33
-335A 8139DF34
-335B 8139DF35
-335C 8139DF36
-335D 8139DF37
-335E 8139DF38
-335F 8139DF39
-3360 8139E030
-3361 8139E031
-3362 8139E032
-3363 8139E033
-3364 8139E034
-3365 8139E035
-3366 8139E036
-3367 8139E037
-3368 8139E038
-3369 8139E039
-336A 8139E130
-336B 8139E131
-336C 8139E132
-336D 8139E133
-336E 8139E134
-336F 8139E135
-3370 8139E136
-3371 8139E137
-3372 8139E138
-3373 8139E139
-3374 8139E230
-3375 8139E231
-3376 8139E232
-3377 8139E233
-3378 8139E234
-3379 8139E235
-337A 8139E236
-337B 8139E237
-337C 8139E238
-337D 8139E239
-337E 8139E330
-337F 8139E331
-3380 8139E332
-3381 8139E333
-3382 8139E334
-3383 8139E335
-3384 8139E336
-3385 8139E337
-3386 8139E338
-3387 8139E339
-3388 8139E430
-3389 8139E431
-338A 8139E432
-338B 8139E433
-338C 8139E434
-338D 8139E435
-338E A94A
-338F A94B
-3390 8139E436
-3391 8139E437
-3392 8139E438
-3393 8139E439
-3394 8139E530
-3395 8139E531
-3396 8139E532
-3397 8139E533
-3398 8139E534
-3399 8139E535
-339A 8139E536
-339B 8139E537
-339C A94C
-339D A94D
-339E A94E
-339F 8139E538
-33A0 8139E539
-33A1 A94F
-33A2 8139E630
-33A3 8139E631
-33A4 8139E632
-33A5 8139E633
-33A6 8139E634
-33A7 8139E635
-33A8 8139E636
-33A9 8139E637
-33AA 8139E638
-33AB 8139E639
-33AC 8139E730
-33AD 8139E731
-33AE 8139E732
-33AF 8139E733
-33B0 8139E734
-33B1 8139E735
-33B2 8139E736
-33B3 8139E737
-33B4 8139E738
-33B5 8139E739
-33B6 8139E830
-33B7 8139E831
-33B8 8139E832
-33B9 8139E833
-33BA 8139E834
-33BB 8139E835
-33BC 8139E836
-33BD 8139E837
-33BE 8139E838
-33BF 8139E839
-33C0 8139E930
-33C1 8139E931
-33C2 8139E932
-33C3 8139E933
-33C4 A950
-33C5 8139E934
-33C6 8139E935
-33C7 8139E936
-33C8 8139E937
-33C9 8139E938
-33CA 8139E939
-33CB 8139EA30
-33CC 8139EA31
-33CD 8139EA32
-33CE A951
-33CF 8139EA33
-33D0 8139EA34
-33D1 A952
-33D2 A953
-33D3 8139EA35
-33D4 8139EA36
-33D5 A954
-33D6 8139EA37
-33D7 8139EA38
-33D8 8139EA39
-33D9 8139EB30
-33DA 8139EB31
-33DB 8139EB32
-33DC 8139EB33
-33DD 8139EB34
-33DE 8139EB35
-33DF 8139EB36
-33E0 8139EB37
-33E1 8139EB38
-33E2 8139EB39
-33E3 8139EC30
-33E4 8139EC31
-33E5 8139EC32
-33E6 8139EC33
-33E7 8139EC34
-33E8 8139EC35
-33E9 8139EC36
-33EA 8139EC37
-33EB 8139EC38
-33EC 8139EC39
-33ED 8139ED30
-33EE 8139ED31
-33EF 8139ED32
-33F0 8139ED33
-33F1 8139ED34
-33F2 8139ED35
-33F3 8139ED36
-33F4 8139ED37
-33F5 8139ED38
-33F6 8139ED39
-33F7 8139EE30
-33F8 8139EE31
-33F9 8139EE32
-33FA 8139EE33
-33FB 8139EE34
-33FC 8139EE35
-33FD 8139EE36
-33FE 8139EE37
-33FF 8139EE38
-3400 8139EE39
-3401 8139EF30
-3402 8139EF31
-3403 8139EF32
-3404 8139EF33
-3405 8139EF34
-3406 8139EF35
-3407 8139EF36
-3408 8139EF37
-3409 8139EF38
-340A 8139EF39
-340B 8139F030
-340C 8139F031
-340D 8139F032
-340E 8139F033
-340F 8139F034
-3410 8139F035
-3411 8139F036
-3412 8139F037
-3413 8139F038
-3414 8139F039
-3415 8139F130
-3416 8139F131
-3417 8139F132
-3418 8139F133
-3419 8139F134
-341A 8139F135
-341B 8139F136
-341C 8139F137
-341D 8139F138
-341E 8139F139
-341F 8139F230
-3420 8139F231
-3421 8139F232
-3422 8139F233
-3423 8139F234
-3424 8139F235
-3425 8139F236
-3426 8139F237
-3427 8139F238
-3428 8139F239
-3429 8139F330
-342A 8139F331
-342B 8139F332
-342C 8139F333
-342D 8139F334
-342E 8139F335
-342F 8139F336
-3430 8139F337
-3431 8139F338
-3432 8139F339
-3433 8139F430
-3434 8139F431
-3435 8139F432
-3436 8139F433
-3437 8139F434
-3438 8139F435
-3439 8139F436
-343A 8139F437
-343B 8139F438
-343C 8139F439
-343D 8139F530
-343E 8139F531
-343F 8139F532
-3440 8139F533
-3441 8139F534
-3442 8139F535
-3443 8139F536
-3444 8139F537
-3445 8139F538
-3446 8139F539
-3447 FE56
-3448 8139F630
-3449 8139F631
-344A 8139F632
-344B 8139F633
-344C 8139F634
-344D 8139F635
-344E 8139F636
-344F 8139F637
-3450 8139F638
-3451 8139F639
-3452 8139F730
-3453 8139F731
-3454 8139F732
-3455 8139F733
-3456 8139F734
-3457 8139F735
-3458 8139F736
-3459 8139F737
-345A 8139F738
-345B 8139F739
-345C 8139F830
-345D 8139F831
-345E 8139F832
-345F 8139F833
-3460 8139F834
-3461 8139F835
-3462 8139F836
-3463 8139F837
-3464 8139F838
-3465 8139F839
-3466 8139F930
-3467 8139F931
-3468 8139F932
-3469 8139F933
-346A 8139F934
-346B 8139F935
-346C 8139F936
-346D 8139F937
-346E 8139F938
-346F 8139F939
-3470 8139FA30
-3471 8139FA31
-3472 8139FA32
-3473 FE55
-3474 8139FA33
-3475 8139FA34
-3476 8139FA35
-3477 8139FA36
-3478 8139FA37
-3479 8139FA38
-347A 8139FA39
-347B 8139FB30
-347C 8139FB31
-347D 8139FB32
-347E 8139FB33
-347F 8139FB34
-3480 8139FB35
-3481 8139FB36
-3482 8139FB37
-3483 8139FB38
-3484 8139FB39
-3485 8139FC30
-3486 8139FC31
-3487 8139FC32
-3488 8139FC33
-3489 8139FC34
-348A 8139FC35
-348B 8139FC36
-348C 8139FC37
-348D 8139FC38
-348E 8139FC39
-348F 8139FD30
-3490 8139FD31
-3491 8139FD32
-3492 8139FD33
-3493 8139FD34
-3494 8139FD35
-3495 8139FD36
-3496 8139FD37
-3497 8139FD38
-3498 8139FD39
-3499 8139FE30
-349A 8139FE31
-349B 8139FE32
-349C 8139FE33
-349D 8139FE34
-349E 8139FE35
-349F 8139FE36
-34A0 8139FE37
-34A1 8139FE38
-34A2 8139FE39
-34A3 82308130
-34A4 82308131
-34A5 82308132
-34A6 82308133
-34A7 82308134
-34A8 82308135
-34A9 82308136
-34AA 82308137
-34AB 82308138
-34AC 82308139
-34AD 82308230
-34AE 82308231
-34AF 82308232
-34B0 82308233
-34B1 82308234
-34B2 82308235
-34B3 82308236
-34B4 82308237
-34B5 82308238
-34B6 82308239
-34B7 82308330
-34B8 82308331
-34B9 82308332
-34BA 82308333
-34BB 82308334
-34BC 82308335
-34BD 82308336
-34BE 82308337
-34BF 82308338
-34C0 82308339
-34C1 82308430
-34C2 82308431
-34C3 82308432
-34C4 82308433
-34C5 82308434
-34C6 82308435
-34C7 82308436
-34C8 82308437
-34C9 82308438
-34CA 82308439
-34CB 82308530
-34CC 82308531
-34CD 82308532
-34CE 82308533
-34CF 82308534
-34D0 82308535
-34D1 82308536
-34D2 82308537
-34D3 82308538
-34D4 82308539
-34D5 82308630
-34D6 82308631
-34D7 82308632
-34D8 82308633
-34D9 82308634
-34DA 82308635
-34DB 82308636
-34DC 82308637
-34DD 82308638
-34DE 82308639
-34DF 82308730
-34E0 82308731
-34E1 82308732
-34E2 82308733
-34E3 82308734
-34E4 82308735
-34E5 82308736
-34E6 82308737
-34E7 82308738
-34E8 82308739
-34E9 82308830
-34EA 82308831
-34EB 82308832
-34EC 82308833
-34ED 82308834
-34EE 82308835
-34EF 82308836
-34F0 82308837
-34F1 82308838
-34F2 82308839
-34F3 82308930
-34F4 82308931
-34F5 82308932
-34F6 82308933
-34F7 82308934
-34F8 82308935
-34F9 82308936
-34FA 82308937
-34FB 82308938
-34FC 82308939
-34FD 82308A30
-34FE 82308A31
-34FF 82308A32
-3500 82308A33
-3501 82308A34
-3502 82308A35
-3503 82308A36
-3504 82308A37
-3505 82308A38
-3506 82308A39
-3507 82308B30
-3508 82308B31
-3509 82308B32
-350A 82308B33
-350B 82308B34
-350C 82308B35
-350D 82308B36
-350E 82308B37
-350F 82308B38
-3510 82308B39
-3511 82308C30
-3512 82308C31
-3513 82308C32
-3514 82308C33
-3515 82308C34
-3516 82308C35
-3517 82308C36
-3518 82308C37
-3519 82308C38
-351A 82308C39
-351B 82308D30
-351C 82308D31
-351D 82308D32
-351E 82308D33
-351F 82308D34
-3520 82308D35
-3521 82308D36
-3522 82308D37
-3523 82308D38
-3524 82308D39
-3525 82308E30
-3526 82308E31
-3527 82308E32
-3528 82308E33
-3529 82308E34
-352A 82308E35
-352B 82308E36
-352C 82308E37
-352D 82308E38
-352E 82308E39
-352F 82308F30
-3530 82308F31
-3531 82308F32
-3532 82308F33
-3533 82308F34
-3534 82308F35
-3535 82308F36
-3536 82308F37
-3537 82308F38
-3538 82308F39
-3539 82309030
-353A 82309031
-353B 82309032
-353C 82309033
-353D 82309034
-353E 82309035
-353F 82309036
-3540 82309037
-3541 82309038
-3542 82309039
-3543 82309130
-3544 82309131
-3545 82309132
-3546 82309133
-3547 82309134
-3548 82309135
-3549 82309136
-354A 82309137
-354B 82309138
-354C 82309139
-354D 82309230
-354E 82309231
-354F 82309232
-3550 82309233
-3551 82309234
-3552 82309235
-3553 82309236
-3554 82309237
-3555 82309238
-3556 82309239
-3557 82309330
-3558 82309331
-3559 82309332
-355A 82309333
-355B 82309334
-355C 82309335
-355D 82309336
-355E 82309337
-355F 82309338
-3560 82309339
-3561 82309430
-3562 82309431
-3563 82309432
-3564 82309433
-3565 82309434
-3566 82309435
-3567 82309436
-3568 82309437
-3569 82309438
-356A 82309439
-356B 82309530
-356C 82309531
-356D 82309532
-356E 82309533
-356F 82309534
-3570 82309535
-3571 82309536
-3572 82309537
-3573 82309538
-3574 82309539
-3575 82309630
-3576 82309631
-3577 82309632
-3578 82309633
-3579 82309634
-357A 82309635
-357B 82309636
-357C 82309637
-357D 82309638
-357E 82309639
-357F 82309730
-3580 82309731
-3581 82309732
-3582 82309733
-3583 82309734
-3584 82309735
-3585 82309736
-3586 82309737
-3587 82309738
-3588 82309739
-3589 82309830
-358A 82309831
-358B 82309832
-358C 82309833
-358D 82309834
-358E 82309835
-358F 82309836
-3590 82309837
-3591 82309838
-3592 82309839
-3593 82309930
-3594 82309931
-3595 82309932
-3596 82309933
-3597 82309934
-3598 82309935
-3599 82309936
-359A 82309937
-359B 82309938
-359C 82309939
-359D 82309A30
-359E FE5A
-359F 82309A31
-35A0 82309A32
-35A1 82309A33
-35A2 82309A34
-35A3 82309A35
-35A4 82309A36
-35A5 82309A37
-35A6 82309A38
-35A7 82309A39
-35A8 82309B30
-35A9 82309B31
-35AA 82309B32
-35AB 82309B33
-35AC 82309B34
-35AD 82309B35
-35AE 82309B36
-35AF 82309B37
-35B0 82309B38
-35B1 82309B39
-35B2 82309C30
-35B3 82309C31
-35B4 82309C32
-35B5 82309C33
-35B6 82309C34
-35B7 82309C35
-35B8 82309C36
-35B9 82309C37
-35BA 82309C38
-35BB 82309C39
-35BC 82309D30
-35BD 82309D31
-35BE 82309D32
-35BF 82309D33
-35C0 82309D34
-35C1 82309D35
-35C2 82309D36
-35C3 82309D37
-35C4 82309D38
-35C5 82309D39
-35C6 82309E30
-35C7 82309E31
-35C8 82309E32
-35C9 82309E33
-35CA 82309E34
-35CB 82309E35
-35CC 82309E36
-35CD 82309E37
-35CE 82309E38
-35CF 82309E39
-35D0 82309F30
-35D1 82309F31
-35D2 82309F32
-35D3 82309F33
-35D4 82309F34
-35D5 82309F35
-35D6 82309F36
-35D7 82309F37
-35D8 82309F38
-35D9 82309F39
-35DA 8230A030
-35DB 8230A031
-35DC 8230A032
-35DD 8230A033
-35DE 8230A034
-35DF 8230A035
-35E0 8230A036
-35E1 8230A037
-35E2 8230A038
-35E3 8230A039
-35E4 8230A130
-35E5 8230A131
-35E6 8230A132
-35E7 8230A133
-35E8 8230A134
-35E9 8230A135
-35EA 8230A136
-35EB 8230A137
-35EC 8230A138
-35ED 8230A139
-35EE 8230A230
-35EF 8230A231
-35F0 8230A232
-35F1 8230A233
-35F2 8230A234
-35F3 8230A235
-35F4 8230A236
-35F5 8230A237
-35F6 8230A238
-35F7 8230A239
-35F8 8230A330
-35F9 8230A331
-35FA 8230A332
-35FB 8230A333
-35FC 8230A334
-35FD 8230A335
-35FE 8230A336
-35FF 8230A337
-3600 8230A338
-3601 8230A339
-3602 8230A430
-3603 8230A431
-3604 8230A432
-3605 8230A433
-3606 8230A434
-3607 8230A435
-3608 8230A436
-3609 8230A437
-360A 8230A438
-360B 8230A439
-360C 8230A530
-360D 8230A531
-360E FE5C
-360F 8230A532
-3610 8230A533
-3611 8230A534
-3612 8230A535
-3613 8230A536
-3614 8230A537
-3615 8230A538
-3616 8230A539
-3617 8230A630
-3618 8230A631
-3619 8230A632
-361A FE5B
-361B 8230A633
-361C 8230A634
-361D 8230A635
-361E 8230A636
-361F 8230A637
-3620 8230A638
-3621 8230A639
-3622 8230A730
-3623 8230A731
-3624 8230A732
-3625 8230A733
-3626 8230A734
-3627 8230A735
-3628 8230A736
-3629 8230A737
-362A 8230A738
-362B 8230A739
-362C 8230A830
-362D 8230A831
-362E 8230A832
-362F 8230A833
-3630 8230A834
-3631 8230A835
-3632 8230A836
-3633 8230A837
-3634 8230A838
-3635 8230A839
-3636 8230A930
-3637 8230A931
-3638 8230A932
-3639 8230A933
-363A 8230A934
-363B 8230A935
-363C 8230A936
-363D 8230A937
-363E 8230A938
-363F 8230A939
-3640 8230AA30
-3641 8230AA31
-3642 8230AA32
-3643 8230AA33
-3644 8230AA34
-3645 8230AA35
-3646 8230AA36
-3647 8230AA37
-3648 8230AA38
-3649 8230AA39
-364A 8230AB30
-364B 8230AB31
-364C 8230AB32
-364D 8230AB33
-364E 8230AB34
-364F 8230AB35
-3650 8230AB36
-3651 8230AB37
-3652 8230AB38
-3653 8230AB39
-3654 8230AC30
-3655 8230AC31
-3656 8230AC32
-3657 8230AC33
-3658 8230AC34
-3659 8230AC35
-365A 8230AC36
-365B 8230AC37
-365C 8230AC38
-365D 8230AC39
-365E 8230AD30
-365F 8230AD31
-3660 8230AD32
-3661 8230AD33
-3662 8230AD34
-3663 8230AD35
-3664 8230AD36
-3665 8230AD37
-3666 8230AD38
-3667 8230AD39
-3668 8230AE30
-3669 8230AE31
-366A 8230AE32
-366B 8230AE33
-366C 8230AE34
-366D 8230AE35
-366E 8230AE36
-366F 8230AE37
-3670 8230AE38
-3671 8230AE39
-3672 8230AF30
-3673 8230AF31
-3674 8230AF32
-3675 8230AF33
-3676 8230AF34
-3677 8230AF35
-3678 8230AF36
-3679 8230AF37
-367A 8230AF38
-367B 8230AF39
-367C 8230B030
-367D 8230B031
-367E 8230B032
-367F 8230B033
-3680 8230B034
-3681 8230B035
-3682 8230B036
-3683 8230B037
-3684 8230B038
-3685 8230B039
-3686 8230B130
-3687 8230B131
-3688 8230B132
-3689 8230B133
-368A 8230B134
-368B 8230B135
-368C 8230B136
-368D 8230B137
-368E 8230B138
-368F 8230B139
-3690 8230B230
-3691 8230B231
-3692 8230B232
-3693 8230B233
-3694 8230B234
-3695 8230B235
-3696 8230B236
-3697 8230B237
-3698 8230B238
-3699 8230B239
-369A 8230B330
-369B 8230B331
-369C 8230B332
-369D 8230B333
-369E 8230B334
-369F 8230B335
-36A0 8230B336
-36A1 8230B337
-36A2 8230B338
-36A3 8230B339
-36A4 8230B430
-36A5 8230B431
-36A6 8230B432
-36A7 8230B433
-36A8 8230B434
-36A9 8230B435
-36AA 8230B436
-36AB 8230B437
-36AC 8230B438
-36AD 8230B439
-36AE 8230B530
-36AF 8230B531
-36B0 8230B532
-36B1 8230B533
-36B2 8230B534
-36B3 8230B535
-36B4 8230B536
-36B5 8230B537
-36B6 8230B538
-36B7 8230B539
-36B8 8230B630
-36B9 8230B631
-36BA 8230B632
-36BB 8230B633
-36BC 8230B634
-36BD 8230B635
-36BE 8230B636
-36BF 8230B637
-36C0 8230B638
-36C1 8230B639
-36C2 8230B730
-36C3 8230B731
-36C4 8230B732
-36C5 8230B733
-36C6 8230B734
-36C7 8230B735
-36C8 8230B736
-36C9 8230B737
-36CA 8230B738
-36CB 8230B739
-36CC 8230B830
-36CD 8230B831
-36CE 8230B832
-36CF 8230B833
-36D0 8230B834
-36D1 8230B835
-36D2 8230B836
-36D3 8230B837
-36D4 8230B838
-36D5 8230B839
-36D6 8230B930
-36D7 8230B931
-36D8 8230B932
-36D9 8230B933
-36DA 8230B934
-36DB 8230B935
-36DC 8230B936
-36DD 8230B937
-36DE 8230B938
-36DF 8230B939
-36E0 8230BA30
-36E1 8230BA31
-36E2 8230BA32
-36E3 8230BA33
-36E4 8230BA34
-36E5 8230BA35
-36E6 8230BA36
-36E7 8230BA37
-36E8 8230BA38
-36E9 8230BA39
-36EA 8230BB30
-36EB 8230BB31
-36EC 8230BB32
-36ED 8230BB33
-36EE 8230BB34
-36EF 8230BB35
-36F0 8230BB36
-36F1 8230BB37
-36F2 8230BB38
-36F3 8230BB39
-36F4 8230BC30
-36F5 8230BC31
-36F6 8230BC32
-36F7 8230BC33
-36F8 8230BC34
-36F9 8230BC35
-36FA 8230BC36
-36FB 8230BC37
-36FC 8230BC38
-36FD 8230BC39
-36FE 8230BD30
-36FF 8230BD31
-3700 8230BD32
-3701 8230BD33
-3702 8230BD34
-3703 8230BD35
-3704 8230BD36
-3705 8230BD37
-3706 8230BD38
-3707 8230BD39
-3708 8230BE30
-3709 8230BE31
-370A 8230BE32
-370B 8230BE33
-370C 8230BE34
-370D 8230BE35
-370E 8230BE36
-370F 8230BE37
-3710 8230BE38
-3711 8230BE39
-3712 8230BF30
-3713 8230BF31
-3714 8230BF32
-3715 8230BF33
-3716 8230BF34
-3717 8230BF35
-3718 8230BF36
-3719 8230BF37
-371A 8230BF38
-371B 8230BF39
-371C 8230C030
-371D 8230C031
-371E 8230C032
-371F 8230C033
-3720 8230C034
-3721 8230C035
-3722 8230C036
-3723 8230C037
-3724 8230C038
-3725 8230C039
-3726 8230C130
-3727 8230C131
-3728 8230C132
-3729 8230C133
-372A 8230C134
-372B 8230C135
-372C 8230C136
-372D 8230C137
-372E 8230C138
-372F 8230C139
-3730 8230C230
-3731 8230C231
-3732 8230C232
-3733 8230C233
-3734 8230C234
-3735 8230C235
-3736 8230C236
-3737 8230C237
-3738 8230C238
-3739 8230C239
-373A 8230C330
-373B 8230C331
-373C 8230C332
-373D 8230C333
-373E 8230C334
-373F 8230C335
-3740 8230C336
-3741 8230C337
-3742 8230C338
-3743 8230C339
-3744 8230C430
-3745 8230C431
-3746 8230C432
-3747 8230C433
-3748 8230C434
-3749 8230C435
-374A 8230C436
-374B 8230C437
-374C 8230C438
-374D 8230C439
-374E 8230C530
-374F 8230C531
-3750 8230C532
-3751 8230C533
-3752 8230C534
-3753 8230C535
-3754 8230C536
-3755 8230C537
-3756 8230C538
-3757 8230C539
-3758 8230C630
-3759 8230C631
-375A 8230C632
-375B 8230C633
-375C 8230C634
-375D 8230C635
-375E 8230C636
-375F 8230C637
-3760 8230C638
-3761 8230C639
-3762 8230C730
-3763 8230C731
-3764 8230C732
-3765 8230C733
-3766 8230C734
-3767 8230C735
-3768 8230C736
-3769 8230C737
-376A 8230C738
-376B 8230C739
-376C 8230C830
-376D 8230C831
-376E 8230C832
-376F 8230C833
-3770 8230C834
-3771 8230C835
-3772 8230C836
-3773 8230C837
-3774 8230C838
-3775 8230C839
-3776 8230C930
-3777 8230C931
-3778 8230C932
-3779 8230C933
-377A 8230C934
-377B 8230C935
-377C 8230C936
-377D 8230C937
-377E 8230C938
-377F 8230C939
-3780 8230CA30
-3781 8230CA31
-3782 8230CA32
-3783 8230CA33
-3784 8230CA34
-3785 8230CA35
-3786 8230CA36
-3787 8230CA37
-3788 8230CA38
-3789 8230CA39
-378A 8230CB30
-378B 8230CB31
-378C 8230CB32
-378D 8230CB33
-378E 8230CB34
-378F 8230CB35
-3790 8230CB36
-3791 8230CB37
-3792 8230CB38
-3793 8230CB39
-3794 8230CC30
-3795 8230CC31
-3796 8230CC32
-3797 8230CC33
-3798 8230CC34
-3799 8230CC35
-379A 8230CC36
-379B 8230CC37
-379C 8230CC38
-379D 8230CC39
-379E 8230CD30
-379F 8230CD31
-37A0 8230CD32
-37A1 8230CD33
-37A2 8230CD34
-37A3 8230CD35
-37A4 8230CD36
-37A5 8230CD37
-37A6 8230CD38
-37A7 8230CD39
-37A8 8230CE30
-37A9 8230CE31
-37AA 8230CE32
-37AB 8230CE33
-37AC 8230CE34
-37AD 8230CE35
-37AE 8230CE36
-37AF 8230CE37
-37B0 8230CE38
-37B1 8230CE39
-37B2 8230CF30
-37B3 8230CF31
-37B4 8230CF32
-37B5 8230CF33
-37B6 8230CF34
-37B7 8230CF35
-37B8 8230CF36
-37B9 8230CF37
-37BA 8230CF38
-37BB 8230CF39
-37BC 8230D030
-37BD 8230D031
-37BE 8230D032
-37BF 8230D033
-37C0 8230D034
-37C1 8230D035
-37C2 8230D036
-37C3 8230D037
-37C4 8230D038
-37C5 8230D039
-37C6 8230D130
-37C7 8230D131
-37C8 8230D132
-37C9 8230D133
-37CA 8230D134
-37CB 8230D135
-37CC 8230D136
-37CD 8230D137
-37CE 8230D138
-37CF 8230D139
-37D0 8230D230
-37D1 8230D231
-37D2 8230D232
-37D3 8230D233
-37D4 8230D234
-37D5 8230D235
-37D6 8230D236
-37D7 8230D237
-37D8 8230D238
-37D9 8230D239
-37DA 8230D330
-37DB 8230D331
-37DC 8230D332
-37DD 8230D333
-37DE 8230D334
-37DF 8230D335
-37E0 8230D336
-37E1 8230D337
-37E2 8230D338
-37E3 8230D339
-37E4 8230D430
-37E5 8230D431
-37E6 8230D432
-37E7 8230D433
-37E8 8230D434
-37E9 8230D435
-37EA 8230D436
-37EB 8230D437
-37EC 8230D438
-37ED 8230D439
-37EE 8230D530
-37EF 8230D531
-37F0 8230D532
-37F1 8230D533
-37F2 8230D534
-37F3 8230D535
-37F4 8230D536
-37F5 8230D537
-37F6 8230D538
-37F7 8230D539
-37F8 8230D630
-37F9 8230D631
-37FA 8230D632
-37FB 8230D633
-37FC 8230D634
-37FD 8230D635
-37FE 8230D636
-37FF 8230D637
-3800 8230D638
-3801 8230D639
-3802 8230D730
-3803 8230D731
-3804 8230D732
-3805 8230D733
-3806 8230D734
-3807 8230D735
-3808 8230D736
-3809 8230D737
-380A 8230D738
-380B 8230D739
-380C 8230D830
-380D 8230D831
-380E 8230D832
-380F 8230D833
-3810 8230D834
-3811 8230D835
-3812 8230D836
-3813 8230D837
-3814 8230D838
-3815 8230D839
-3816 8230D930
-3817 8230D931
-3818 8230D932
-3819 8230D933
-381A 8230D934
-381B 8230D935
-381C 8230D936
-381D 8230D937
-381E 8230D938
-381F 8230D939
-3820 8230DA30
-3821 8230DA31
-3822 8230DA32
-3823 8230DA33
-3824 8230DA34
-3825 8230DA35
-3826 8230DA36
-3827 8230DA37
-3828 8230DA38
-3829 8230DA39
-382A 8230DB30
-382B 8230DB31
-382C 8230DB32
-382D 8230DB33
-382E 8230DB34
-382F 8230DB35
-3830 8230DB36
-3831 8230DB37
-3832 8230DB38
-3833 8230DB39
-3834 8230DC30
-3835 8230DC31
-3836 8230DC32
-3837 8230DC33
-3838 8230DC34
-3839 8230DC35
-383A 8230DC36
-383B 8230DC37
-383C 8230DC38
-383D 8230DC39
-383E 8230DD30
-383F 8230DD31
-3840 8230DD32
-3841 8230DD33
-3842 8230DD34
-3843 8230DD35
-3844 8230DD36
-3845 8230DD37
-3846 8230DD38
-3847 8230DD39
-3848 8230DE30
-3849 8230DE31
-384A 8230DE32
-384B 8230DE33
-384C 8230DE34
-384D 8230DE35
-384E 8230DE36
-384F 8230DE37
-3850 8230DE38
-3851 8230DE39
-3852 8230DF30
-3853 8230DF31
-3854 8230DF32
-3855 8230DF33
-3856 8230DF34
-3857 8230DF35
-3858 8230DF36
-3859 8230DF37
-385A 8230DF38
-385B 8230DF39
-385C 8230E030
-385D 8230E031
-385E 8230E032
-385F 8230E033
-3860 8230E034
-3861 8230E035
-3862 8230E036
-3863 8230E037
-3864 8230E038
-3865 8230E039
-3866 8230E130
-3867 8230E131
-3868 8230E132
-3869 8230E133
-386A 8230E134
-386B 8230E135
-386C 8230E136
-386D 8230E137
-386E 8230E138
-386F 8230E139
-3870 8230E230
-3871 8230E231
-3872 8230E232
-3873 8230E233
-3874 8230E234
-3875 8230E235
-3876 8230E236
-3877 8230E237
-3878 8230E238
-3879 8230E239
-387A 8230E330
-387B 8230E331
-387C 8230E332
-387D 8230E333
-387E 8230E334
-387F 8230E335
-3880 8230E336
-3881 8230E337
-3882 8230E338
-3883 8230E339
-3884 8230E430
-3885 8230E431
-3886 8230E432
-3887 8230E433
-3888 8230E434
-3889 8230E435
-388A 8230E436
-388B 8230E437
-388C 8230E438
-388D 8230E439
-388E 8230E530
-388F 8230E531
-3890 8230E532
-3891 8230E533
-3892 8230E534
-3893 8230E535
-3894 8230E536
-3895 8230E537
-3896 8230E538
-3897 8230E539
-3898 8230E630
-3899 8230E631
-389A 8230E632
-389B 8230E633
-389C 8230E634
-389D 8230E635
-389E 8230E636
-389F 8230E637
-38A0 8230E638
-38A1 8230E639
-38A2 8230E730
-38A3 8230E731
-38A4 8230E732
-38A5 8230E733
-38A6 8230E734
-38A7 8230E735
-38A8 8230E736
-38A9 8230E737
-38AA 8230E738
-38AB 8230E739
-38AC 8230E830
-38AD 8230E831
-38AE 8230E832
-38AF 8230E833
-38B0 8230E834
-38B1 8230E835
-38B2 8230E836
-38B3 8230E837
-38B4 8230E838
-38B5 8230E839
-38B6 8230E930
-38B7 8230E931
-38B8 8230E932
-38B9 8230E933
-38BA 8230E934
-38BB 8230E935
-38BC 8230E936
-38BD 8230E937
-38BE 8230E938
-38BF 8230E939
-38C0 8230EA30
-38C1 8230EA31
-38C2 8230EA32
-38C3 8230EA33
-38C4 8230EA34
-38C5 8230EA35
-38C6 8230EA36
-38C7 8230EA37
-38C8 8230EA38
-38C9 8230EA39
-38CA 8230EB30
-38CB 8230EB31
-38CC 8230EB32
-38CD 8230EB33
-38CE 8230EB34
-38CF 8230EB35
-38D0 8230EB36
-38D1 8230EB37
-38D2 8230EB38
-38D3 8230EB39
-38D4 8230EC30
-38D5 8230EC31
-38D6 8230EC32
-38D7 8230EC33
-38D8 8230EC34
-38D9 8230EC35
-38DA 8230EC36
-38DB 8230EC37
-38DC 8230EC38
-38DD 8230EC39
-38DE 8230ED30
-38DF 8230ED31
-38E0 8230ED32
-38E1 8230ED33
-38E2 8230ED34
-38E3 8230ED35
-38E4 8230ED36
-38E5 8230ED37
-38E6 8230ED38
-38E7 8230ED39
-38E8 8230EE30
-38E9 8230EE31
-38EA 8230EE32
-38EB 8230EE33
-38EC 8230EE34
-38ED 8230EE35
-38EE 8230EE36
-38EF 8230EE37
-38F0 8230EE38
-38F1 8230EE39
-38F2 8230EF30
-38F3 8230EF31
-38F4 8230EF32
-38F5 8230EF33
-38F6 8230EF34
-38F7 8230EF35
-38F8 8230EF36
-38F9 8230EF37
-38FA 8230EF38
-38FB 8230EF39
-38FC 8230F030
-38FD 8230F031
-38FE 8230F032
-38FF 8230F033
-3900 8230F034
-3901 8230F035
-3902 8230F036
-3903 8230F037
-3904 8230F038
-3905 8230F039
-3906 8230F130
-3907 8230F131
-3908 8230F132
-3909 8230F133
-390A 8230F134
-390B 8230F135
-390C 8230F136
-390D 8230F137
-390E 8230F138
-390F 8230F139
-3910 8230F230
-3911 8230F231
-3912 8230F232
-3913 8230F233
-3914 8230F234
-3915 8230F235
-3916 8230F236
-3917 8230F237
-3918 FE60
-3919 8230F238
-391A 8230F239
-391B 8230F330
-391C 8230F331
-391D 8230F332
-391E 8230F333
-391F 8230F334
-3920 8230F335
-3921 8230F336
-3922 8230F337
-3923 8230F338
-3924 8230F339
-3925 8230F430
-3926 8230F431
-3927 8230F432
-3928 8230F433
-3929 8230F434
-392A 8230F435
-392B 8230F436
-392C 8230F437
-392D 8230F438
-392E 8230F439
-392F 8230F530
-3930 8230F531
-3931 8230F532
-3932 8230F533
-3933 8230F534
-3934 8230F535
-3935 8230F536
-3936 8230F537
-3937 8230F538
-3938 8230F539
-3939 8230F630
-393A 8230F631
-393B 8230F632
-393C 8230F633
-393D 8230F634
-393E 8230F635
-393F 8230F636
-3940 8230F637
-3941 8230F638
-3942 8230F639
-3943 8230F730
-3944 8230F731
-3945 8230F732
-3946 8230F733
-3947 8230F734
-3948 8230F735
-3949 8230F736
-394A 8230F737
-394B 8230F738
-394C 8230F739
-394D 8230F830
-394E 8230F831
-394F 8230F832
-3950 8230F833
-3951 8230F834
-3952 8230F835
-3953 8230F836
-3954 8230F837
-3955 8230F838
-3956 8230F839
-3957 8230F930
-3958 8230F931
-3959 8230F932
-395A 8230F933
-395B 8230F934
-395C 8230F935
-395D 8230F936
-395E 8230F937
-395F 8230F938
-3960 8230F939
-3961 8230FA30
-3962 8230FA31
-3963 8230FA32
-3964 8230FA33
-3965 8230FA34
-3966 8230FA35
-3967 8230FA36
-3968 8230FA37
-3969 8230FA38
-396A 8230FA39
-396B 8230FB30
-396C 8230FB31
-396D 8230FB32
-396E FE5F
-396F 8230FB33
-3970 8230FB34
-3971 8230FB35
-3972 8230FB36
-3973 8230FB37
-3974 8230FB38
-3975 8230FB39
-3976 8230FC30
-3977 8230FC31
-3978 8230FC32
-3979 8230FC33
-397A 8230FC34
-397B 8230FC35
-397C 8230FC36
-397D 8230FC37
-397E 8230FC38
-397F 8230FC39
-3980 8230FD30
-3981 8230FD31
-3982 8230FD32
-3983 8230FD33
-3984 8230FD34
-3985 8230FD35
-3986 8230FD36
-3987 8230FD37
-3988 8230FD38
-3989 8230FD39
-398A 8230FE30
-398B 8230FE31
-398C 8230FE32
-398D 8230FE33
-398E 8230FE34
-398F 8230FE35
-3990 8230FE36
-3991 8230FE37
-3992 8230FE38
-3993 8230FE39
-3994 82318130
-3995 82318131
-3996 82318132
-3997 82318133
-3998 82318134
-3999 82318135
-399A 82318136
-399B 82318137
-399C 82318138
-399D 82318139
-399E 82318230
-399F 82318231
-39A0 82318232
-39A1 82318233
-39A2 82318234
-39A3 82318235
-39A4 82318236
-39A5 82318237
-39A6 82318238
-39A7 82318239
-39A8 82318330
-39A9 82318331
-39AA 82318332
-39AB 82318333
-39AC 82318334
-39AD 82318335
-39AE 82318336
-39AF 82318337
-39B0 82318338
-39B1 82318339
-39B2 82318430
-39B3 82318431
-39B4 82318432
-39B5 82318433
-39B6 82318434
-39B7 82318435
-39B8 82318436
-39B9 82318437
-39BA 82318438
-39BB 82318439
-39BC 82318530
-39BD 82318531
-39BE 82318532
-39BF 82318533
-39C0 82318534
-39C1 82318535
-39C2 82318536
-39C3 82318537
-39C4 82318538
-39C5 82318539
-39C6 82318630
-39C7 82318631
-39C8 82318632
-39C9 82318633
-39CA 82318634
-39CB 82318635
-39CC 82318636
-39CD 82318637
-39CE 82318638
-39CF FE62
-39D0 FE65
-39D1 82318639
-39D2 82318730
-39D3 82318731
-39D4 82318732
-39D5 82318733
-39D6 82318734
-39D7 82318735
-39D8 82318736
-39D9 82318737
-39DA 82318738
-39DB 82318739
-39DC 82318830
-39DD 82318831
-39DE 82318832
-39DF FE63
-39E0 82318833
-39E1 82318834
-39E2 82318835
-39E3 82318836
-39E4 82318837
-39E5 82318838
-39E6 82318839
-39E7 82318930
-39E8 82318931
-39E9 82318932
-39EA 82318933
-39EB 82318934
-39EC 82318935
-39ED 82318936
-39EE 82318937
-39EF 82318938
-39F0 82318939
-39F1 82318A30
-39F2 82318A31
-39F3 82318A32
-39F4 82318A33
-39F5 82318A34
-39F6 82318A35
-39F7 82318A36
-39F8 82318A37
-39F9 82318A38
-39FA 82318A39
-39FB 82318B30
-39FC 82318B31
-39FD 82318B32
-39FE 82318B33
-39FF 82318B34
-3A00 82318B35
-3A01 82318B36
-3A02 82318B37
-3A03 82318B38
-3A04 82318B39
-3A05 82318C30
-3A06 82318C31
-3A07 82318C32
-3A08 82318C33
-3A09 82318C34
-3A0A 82318C35
-3A0B 82318C36
-3A0C 82318C37
-3A0D 82318C38
-3A0E 82318C39
-3A0F 82318D30
-3A10 82318D31
-3A11 82318D32
-3A12 82318D33
-3A13 82318D34
-3A14 82318D35
-3A15 82318D36
-3A16 82318D37
-3A17 82318D38
-3A18 82318D39
-3A19 82318E30
-3A1A 82318E31
-3A1B 82318E32
-3A1C 82318E33
-3A1D 82318E34
-3A1E 82318E35
-3A1F 82318E36
-3A20 82318E37
-3A21 82318E38
-3A22 82318E39
-3A23 82318F30
-3A24 82318F31
-3A25 82318F32
-3A26 82318F33
-3A27 82318F34
-3A28 82318F35
-3A29 82318F36
-3A2A 82318F37
-3A2B 82318F38
-3A2C 82318F39
-3A2D 82319030
-3A2E 82319031
-3A2F 82319032
-3A30 82319033
-3A31 82319034
-3A32 82319035
-3A33 82319036
-3A34 82319037
-3A35 82319038
-3A36 82319039
-3A37 82319130
-3A38 82319131
-3A39 82319132
-3A3A 82319133
-3A3B 82319134
-3A3C 82319135
-3A3D 82319136
-3A3E 82319137
-3A3F 82319138
-3A40 82319139
-3A41 82319230
-3A42 82319231
-3A43 82319232
-3A44 82319233
-3A45 82319234
-3A46 82319235
-3A47 82319236
-3A48 82319237
-3A49 82319238
-3A4A 82319239
-3A4B 82319330
-3A4C 82319331
-3A4D 82319332
-3A4E 82319333
-3A4F 82319334
-3A50 82319335
-3A51 82319336
-3A52 82319337
-3A53 82319338
-3A54 82319339
-3A55 82319430
-3A56 82319431
-3A57 82319432
-3A58 82319433
-3A59 82319434
-3A5A 82319435
-3A5B 82319436
-3A5C 82319437
-3A5D 82319438
-3A5E 82319439
-3A5F 82319530
-3A60 82319531
-3A61 82319532
-3A62 82319533
-3A63 82319534
-3A64 82319535
-3A65 82319536
-3A66 82319537
-3A67 82319538
-3A68 82319539
-3A69 82319630
-3A6A 82319631
-3A6B 82319632
-3A6C 82319633
-3A6D 82319634
-3A6E 82319635
-3A6F 82319636
-3A70 82319637
-3A71 82319638
-3A72 82319639
-3A73 FE64
-3A74 82319730
-3A75 82319731
-3A76 82319732
-3A77 82319733
-3A78 82319734
-3A79 82319735
-3A7A 82319736
-3A7B 82319737
-3A7C 82319738
-3A7D 82319739
-3A7E 82319830
-3A7F 82319831
-3A80 82319832
-3A81 82319833
-3A82 82319834
-3A83 82319835
-3A84 82319836
-3A85 82319837
-3A86 82319838
-3A87 82319839
-3A88 82319930
-3A89 82319931
-3A8A 82319932
-3A8B 82319933
-3A8C 82319934
-3A8D 82319935
-3A8E 82319936
-3A8F 82319937
-3A90 82319938
-3A91 82319939
-3A92 82319A30
-3A93 82319A31
-3A94 82319A32
-3A95 82319A33
-3A96 82319A34
-3A97 82319A35
-3A98 82319A36
-3A99 82319A37
-3A9A 82319A38
-3A9B 82319A39
-3A9C 82319B30
-3A9D 82319B31
-3A9E 82319B32
-3A9F 82319B33
-3AA0 82319B34
-3AA1 82319B35
-3AA2 82319B36
-3AA3 82319B37
-3AA4 82319B38
-3AA5 82319B39
-3AA6 82319C30
-3AA7 82319C31
-3AA8 82319C32
-3AA9 82319C33
-3AAA 82319C34
-3AAB 82319C35
-3AAC 82319C36
-3AAD 82319C37
-3AAE 82319C38
-3AAF 82319C39
-3AB0 82319D30
-3AB1 82319D31
-3AB2 82319D32
-3AB3 82319D33
-3AB4 82319D34
-3AB5 82319D35
-3AB6 82319D36
-3AB7 82319D37
-3AB8 82319D38
-3AB9 82319D39
-3ABA 82319E30
-3ABB 82319E31
-3ABC 82319E32
-3ABD 82319E33
-3ABE 82319E34
-3ABF 82319E35
-3AC0 82319E36
-3AC1 82319E37
-3AC2 82319E38
-3AC3 82319E39
-3AC4 82319F30
-3AC5 82319F31
-3AC6 82319F32
-3AC7 82319F33
-3AC8 82319F34
-3AC9 82319F35
-3ACA 82319F36
-3ACB 82319F37
-3ACC 82319F38
-3ACD 82319F39
-3ACE 8231A030
-3ACF 8231A031
-3AD0 8231A032
-3AD1 8231A033
-3AD2 8231A034
-3AD3 8231A035
-3AD4 8231A036
-3AD5 8231A037
-3AD6 8231A038
-3AD7 8231A039
-3AD8 8231A130
-3AD9 8231A131
-3ADA 8231A132
-3ADB 8231A133
-3ADC 8231A134
-3ADD 8231A135
-3ADE 8231A136
-3ADF 8231A137
-3AE0 8231A138
-3AE1 8231A139
-3AE2 8231A230
-3AE3 8231A231
-3AE4 8231A232
-3AE5 8231A233
-3AE6 8231A234
-3AE7 8231A235
-3AE8 8231A236
-3AE9 8231A237
-3AEA 8231A238
-3AEB 8231A239
-3AEC 8231A330
-3AED 8231A331
-3AEE 8231A332
-3AEF 8231A333
-3AF0 8231A334
-3AF1 8231A335
-3AF2 8231A336
-3AF3 8231A337
-3AF4 8231A338
-3AF5 8231A339
-3AF6 8231A430
-3AF7 8231A431
-3AF8 8231A432
-3AF9 8231A433
-3AFA 8231A434
-3AFB 8231A435
-3AFC 8231A436
-3AFD 8231A437
-3AFE 8231A438
-3AFF 8231A439
-3B00 8231A530
-3B01 8231A531
-3B02 8231A532
-3B03 8231A533
-3B04 8231A534
-3B05 8231A535
-3B06 8231A536
-3B07 8231A537
-3B08 8231A538
-3B09 8231A539
-3B0A 8231A630
-3B0B 8231A631
-3B0C 8231A632
-3B0D 8231A633
-3B0E 8231A634
-3B0F 8231A635
-3B10 8231A636
-3B11 8231A637
-3B12 8231A638
-3B13 8231A639
-3B14 8231A730
-3B15 8231A731
-3B16 8231A732
-3B17 8231A733
-3B18 8231A734
-3B19 8231A735
-3B1A 8231A736
-3B1B 8231A737
-3B1C 8231A738
-3B1D 8231A739
-3B1E 8231A830
-3B1F 8231A831
-3B20 8231A832
-3B21 8231A833
-3B22 8231A834
-3B23 8231A835
-3B24 8231A836
-3B25 8231A837
-3B26 8231A838
-3B27 8231A839
-3B28 8231A930
-3B29 8231A931
-3B2A 8231A932
-3B2B 8231A933
-3B2C 8231A934
-3B2D 8231A935
-3B2E 8231A936
-3B2F 8231A937
-3B30 8231A938
-3B31 8231A939
-3B32 8231AA30
-3B33 8231AA31
-3B34 8231AA32
-3B35 8231AA33
-3B36 8231AA34
-3B37 8231AA35
-3B38 8231AA36
-3B39 8231AA37
-3B3A 8231AA38
-3B3B 8231AA39
-3B3C 8231AB30
-3B3D 8231AB31
-3B3E 8231AB32
-3B3F 8231AB33
-3B40 8231AB34
-3B41 8231AB35
-3B42 8231AB36
-3B43 8231AB37
-3B44 8231AB38
-3B45 8231AB39
-3B46 8231AC30
-3B47 8231AC31
-3B48 8231AC32
-3B49 8231AC33
-3B4A 8231AC34
-3B4B 8231AC35
-3B4C 8231AC36
-3B4D 8231AC37
-3B4E FE68
-3B4F 8231AC38
-3B50 8231AC39
-3B51 8231AD30
-3B52 8231AD31
-3B53 8231AD32
-3B54 8231AD33
-3B55 8231AD34
-3B56 8231AD35
-3B57 8231AD36
-3B58 8231AD37
-3B59 8231AD38
-3B5A 8231AD39
-3B5B 8231AE30
-3B5C 8231AE31
-3B5D 8231AE32
-3B5E 8231AE33
-3B5F 8231AE34
-3B60 8231AE35
-3B61 8231AE36
-3B62 8231AE37
-3B63 8231AE38
-3B64 8231AE39
-3B65 8231AF30
-3B66 8231AF31
-3B67 8231AF32
-3B68 8231AF33
-3B69 8231AF34
-3B6A 8231AF35
-3B6B 8231AF36
-3B6C 8231AF37
-3B6D 8231AF38
-3B6E 8231AF39
-3B6F 8231B030
-3B70 8231B031
-3B71 8231B032
-3B72 8231B033
-3B73 8231B034
-3B74 8231B035
-3B75 8231B036
-3B76 8231B037
-3B77 8231B038
-3B78 8231B039
-3B79 8231B130
-3B7A 8231B131
-3B7B 8231B132
-3B7C 8231B133
-3B7D 8231B134
-3B7E 8231B135
-3B7F 8231B136
-3B80 8231B137
-3B81 8231B138
-3B82 8231B139
-3B83 8231B230
-3B84 8231B231
-3B85 8231B232
-3B86 8231B233
-3B87 8231B234
-3B88 8231B235
-3B89 8231B236
-3B8A 8231B237
-3B8B 8231B238
-3B8C 8231B239
-3B8D 8231B330
-3B8E 8231B331
-3B8F 8231B332
-3B90 8231B333
-3B91 8231B334
-3B92 8231B335
-3B93 8231B336
-3B94 8231B337
-3B95 8231B338
-3B96 8231B339
-3B97 8231B430
-3B98 8231B431
-3B99 8231B432
-3B9A 8231B433
-3B9B 8231B434
-3B9C 8231B435
-3B9D 8231B436
-3B9E 8231B437
-3B9F 8231B438
-3BA0 8231B439
-3BA1 8231B530
-3BA2 8231B531
-3BA3 8231B532
-3BA4 8231B533
-3BA5 8231B534
-3BA6 8231B535
-3BA7 8231B536
-3BA8 8231B537
-3BA9 8231B538
-3BAA 8231B539
-3BAB 8231B630
-3BAC 8231B631
-3BAD 8231B632
-3BAE 8231B633
-3BAF 8231B634
-3BB0 8231B635
-3BB1 8231B636
-3BB2 8231B637
-3BB3 8231B638
-3BB4 8231B639
-3BB5 8231B730
-3BB6 8231B731
-3BB7 8231B732
-3BB8 8231B733
-3BB9 8231B734
-3BBA 8231B735
-3BBB 8231B736
-3BBC 8231B737
-3BBD 8231B738
-3BBE 8231B739
-3BBF 8231B830
-3BC0 8231B831
-3BC1 8231B832
-3BC2 8231B833
-3BC3 8231B834
-3BC4 8231B835
-3BC5 8231B836
-3BC6 8231B837
-3BC7 8231B838
-3BC8 8231B839
-3BC9 8231B930
-3BCA 8231B931
-3BCB 8231B932
-3BCC 8231B933
-3BCD 8231B934
-3BCE 8231B935
-3BCF 8231B936
-3BD0 8231B937
-3BD1 8231B938
-3BD2 8231B939
-3BD3 8231BA30
-3BD4 8231BA31
-3BD5 8231BA32
-3BD6 8231BA33
-3BD7 8231BA34
-3BD8 8231BA35
-3BD9 8231BA36
-3BDA 8231BA37
-3BDB 8231BA38
-3BDC 8231BA39
-3BDD 8231BB30
-3BDE 8231BB31
-3BDF 8231BB32
-3BE0 8231BB33
-3BE1 8231BB34
-3BE2 8231BB35
-3BE3 8231BB36
-3BE4 8231BB37
-3BE5 8231BB38
-3BE6 8231BB39
-3BE7 8231BC30
-3BE8 8231BC31
-3BE9 8231BC32
-3BEA 8231BC33
-3BEB 8231BC34
-3BEC 8231BC35
-3BED 8231BC36
-3BEE 8231BC37
-3BEF 8231BC38
-3BF0 8231BC39
-3BF1 8231BD30
-3BF2 8231BD31
-3BF3 8231BD32
-3BF4 8231BD33
-3BF5 8231BD34
-3BF6 8231BD35
-3BF7 8231BD36
-3BF8 8231BD37
-3BF9 8231BD38
-3BFA 8231BD39
-3BFB 8231BE30
-3BFC 8231BE31
-3BFD 8231BE32
-3BFE 8231BE33
-3BFF 8231BE34
-3C00 8231BE35
-3C01 8231BE36
-3C02 8231BE37
-3C03 8231BE38
-3C04 8231BE39
-3C05 8231BF30
-3C06 8231BF31
-3C07 8231BF32
-3C08 8231BF33
-3C09 8231BF34
-3C0A 8231BF35
-3C0B 8231BF36
-3C0C 8231BF37
-3C0D 8231BF38
-3C0E 8231BF39
-3C0F 8231C030
-3C10 8231C031
-3C11 8231C032
-3C12 8231C033
-3C13 8231C034
-3C14 8231C035
-3C15 8231C036
-3C16 8231C037
-3C17 8231C038
-3C18 8231C039
-3C19 8231C130
-3C1A 8231C131
-3C1B 8231C132
-3C1C 8231C133
-3C1D 8231C134
-3C1E 8231C135
-3C1F 8231C136
-3C20 8231C137
-3C21 8231C138
-3C22 8231C139
-3C23 8231C230
-3C24 8231C231
-3C25 8231C232
-3C26 8231C233
-3C27 8231C234
-3C28 8231C235
-3C29 8231C236
-3C2A 8231C237
-3C2B 8231C238
-3C2C 8231C239
-3C2D 8231C330
-3C2E 8231C331
-3C2F 8231C332
-3C30 8231C333
-3C31 8231C334
-3C32 8231C335
-3C33 8231C336
-3C34 8231C337
-3C35 8231C338
-3C36 8231C339
-3C37 8231C430
-3C38 8231C431
-3C39 8231C432
-3C3A 8231C433
-3C3B 8231C434
-3C3C 8231C435
-3C3D 8231C436
-3C3E 8231C437
-3C3F 8231C438
-3C40 8231C439
-3C41 8231C530
-3C42 8231C531
-3C43 8231C532
-3C44 8231C533
-3C45 8231C534
-3C46 8231C535
-3C47 8231C536
-3C48 8231C537
-3C49 8231C538
-3C4A 8231C539
-3C4B 8231C630
-3C4C 8231C631
-3C4D 8231C632
-3C4E 8231C633
-3C4F 8231C634
-3C50 8231C635
-3C51 8231C636
-3C52 8231C637
-3C53 8231C638
-3C54 8231C639
-3C55 8231C730
-3C56 8231C731
-3C57 8231C732
-3C58 8231C733
-3C59 8231C734
-3C5A 8231C735
-3C5B 8231C736
-3C5C 8231C737
-3C5D 8231C738
-3C5E 8231C739
-3C5F 8231C830
-3C60 8231C831
-3C61 8231C832
-3C62 8231C833
-3C63 8231C834
-3C64 8231C835
-3C65 8231C836
-3C66 8231C837
-3C67 8231C838
-3C68 8231C839
-3C69 8231C930
-3C6A 8231C931
-3C6B 8231C932
-3C6C 8231C933
-3C6D 8231C934
-3C6E FE69
-3C6F 8231C935
-3C70 8231C936
-3C71 8231C937
-3C72 8231C938
-3C73 8231C939
-3C74 8231CA30
-3C75 8231CA31
-3C76 8231CA32
-3C77 8231CA33
-3C78 8231CA34
-3C79 8231CA35
-3C7A 8231CA36
-3C7B 8231CA37
-3C7C 8231CA38
-3C7D 8231CA39
-3C7E 8231CB30
-3C7F 8231CB31
-3C80 8231CB32
-3C81 8231CB33
-3C82 8231CB34
-3C83 8231CB35
-3C84 8231CB36
-3C85 8231CB37
-3C86 8231CB38
-3C87 8231CB39
-3C88 8231CC30
-3C89 8231CC31
-3C8A 8231CC32
-3C8B 8231CC33
-3C8C 8231CC34
-3C8D 8231CC35
-3C8E 8231CC36
-3C8F 8231CC37
-3C90 8231CC38
-3C91 8231CC39
-3C92 8231CD30
-3C93 8231CD31
-3C94 8231CD32
-3C95 8231CD33
-3C96 8231CD34
-3C97 8231CD35
-3C98 8231CD36
-3C99 8231CD37
-3C9A 8231CD38
-3C9B 8231CD39
-3C9C 8231CE30
-3C9D 8231CE31
-3C9E 8231CE32
-3C9F 8231CE33
-3CA0 8231CE34
-3CA1 8231CE35
-3CA2 8231CE36
-3CA3 8231CE37
-3CA4 8231CE38
-3CA5 8231CE39
-3CA6 8231CF30
-3CA7 8231CF31
-3CA8 8231CF32
-3CA9 8231CF33
-3CAA 8231CF34
-3CAB 8231CF35
-3CAC 8231CF36
-3CAD 8231CF37
-3CAE 8231CF38
-3CAF 8231CF39
-3CB0 8231D030
-3CB1 8231D031
-3CB2 8231D032
-3CB3 8231D033
-3CB4 8231D034
-3CB5 8231D035
-3CB6 8231D036
-3CB7 8231D037
-3CB8 8231D038
-3CB9 8231D039
-3CBA 8231D130
-3CBB 8231D131
-3CBC 8231D132
-3CBD 8231D133
-3CBE 8231D134
-3CBF 8231D135
-3CC0 8231D136
-3CC1 8231D137
-3CC2 8231D138
-3CC3 8231D139
-3CC4 8231D230
-3CC5 8231D231
-3CC6 8231D232
-3CC7 8231D233
-3CC8 8231D234
-3CC9 8231D235
-3CCA 8231D236
-3CCB 8231D237
-3CCC 8231D238
-3CCD 8231D239
-3CCE 8231D330
-3CCF 8231D331
-3CD0 8231D332
-3CD1 8231D333
-3CD2 8231D334
-3CD3 8231D335
-3CD4 8231D336
-3CD5 8231D337
-3CD6 8231D338
-3CD7 8231D339
-3CD8 8231D430
-3CD9 8231D431
-3CDA 8231D432
-3CDB 8231D433
-3CDC 8231D434
-3CDD 8231D435
-3CDE 8231D436
-3CDF 8231D437
-3CE0 FE6A
-3CE1 8231D438
-3CE2 8231D439
-3CE3 8231D530
-3CE4 8231D531
-3CE5 8231D532
-3CE6 8231D533
-3CE7 8231D534
-3CE8 8231D535
-3CE9 8231D536
-3CEA 8231D537
-3CEB 8231D538
-3CEC 8231D539
-3CED 8231D630
-3CEE 8231D631
-3CEF 8231D632
-3CF0 8231D633
-3CF1 8231D634
-3CF2 8231D635
-3CF3 8231D636
-3CF4 8231D637
-3CF5 8231D638
-3CF6 8231D639
-3CF7 8231D730
-3CF8 8231D731
-3CF9 8231D732
-3CFA 8231D733
-3CFB 8231D734
-3CFC 8231D735
-3CFD 8231D736
-3CFE 8231D737
-3CFF 8231D738
-3D00 8231D739
-3D01 8231D830
-3D02 8231D831
-3D03 8231D832
-3D04 8231D833
-3D05 8231D834
-3D06 8231D835
-3D07 8231D836
-3D08 8231D837
-3D09 8231D838
-3D0A 8231D839
-3D0B 8231D930
-3D0C 8231D931
-3D0D 8231D932
-3D0E 8231D933
-3D0F 8231D934
-3D10 8231D935
-3D11 8231D936
-3D12 8231D937
-3D13 8231D938
-3D14 8231D939
-3D15 8231DA30
-3D16 8231DA31
-3D17 8231DA32
-3D18 8231DA33
-3D19 8231DA34
-3D1A 8231DA35
-3D1B 8231DA36
-3D1C 8231DA37
-3D1D 8231DA38
-3D1E 8231DA39
-3D1F 8231DB30
-3D20 8231DB31
-3D21 8231DB32
-3D22 8231DB33
-3D23 8231DB34
-3D24 8231DB35
-3D25 8231DB36
-3D26 8231DB37
-3D27 8231DB38
-3D28 8231DB39
-3D29 8231DC30
-3D2A 8231DC31
-3D2B 8231DC32
-3D2C 8231DC33
-3D2D 8231DC34
-3D2E 8231DC35
-3D2F 8231DC36
-3D30 8231DC37
-3D31 8231DC38
-3D32 8231DC39
-3D33 8231DD30
-3D34 8231DD31
-3D35 8231DD32
-3D36 8231DD33
-3D37 8231DD34
-3D38 8231DD35
-3D39 8231DD36
-3D3A 8231DD37
-3D3B 8231DD38
-3D3C 8231DD39
-3D3D 8231DE30
-3D3E 8231DE31
-3D3F 8231DE32
-3D40 8231DE33
-3D41 8231DE34
-3D42 8231DE35
-3D43 8231DE36
-3D44 8231DE37
-3D45 8231DE38
-3D46 8231DE39
-3D47 8231DF30
-3D48 8231DF31
-3D49 8231DF32
-3D4A 8231DF33
-3D4B 8231DF34
-3D4C 8231DF35
-3D4D 8231DF36
-3D4E 8231DF37
-3D4F 8231DF38
-3D50 8231DF39
-3D51 8231E030
-3D52 8231E031
-3D53 8231E032
-3D54 8231E033
-3D55 8231E034
-3D56 8231E035
-3D57 8231E036
-3D58 8231E037
-3D59 8231E038
-3D5A 8231E039
-3D5B 8231E130
-3D5C 8231E131
-3D5D 8231E132
-3D5E 8231E133
-3D5F 8231E134
-3D60 8231E135
-3D61 8231E136
-3D62 8231E137
-3D63 8231E138
-3D64 8231E139
-3D65 8231E230
-3D66 8231E231
-3D67 8231E232
-3D68 8231E233
-3D69 8231E234
-3D6A 8231E235
-3D6B 8231E236
-3D6C 8231E237
-3D6D 8231E238
-3D6E 8231E239
-3D6F 8231E330
-3D70 8231E331
-3D71 8231E332
-3D72 8231E333
-3D73 8231E334
-3D74 8231E335
-3D75 8231E336
-3D76 8231E337
-3D77 8231E338
-3D78 8231E339
-3D79 8231E430
-3D7A 8231E431
-3D7B 8231E432
-3D7C 8231E433
-3D7D 8231E434
-3D7E 8231E435
-3D7F 8231E436
-3D80 8231E437
-3D81 8231E438
-3D82 8231E439
-3D83 8231E530
-3D84 8231E531
-3D85 8231E532
-3D86 8231E533
-3D87 8231E534
-3D88 8231E535
-3D89 8231E536
-3D8A 8231E537
-3D8B 8231E538
-3D8C 8231E539
-3D8D 8231E630
-3D8E 8231E631
-3D8F 8231E632
-3D90 8231E633
-3D91 8231E634
-3D92 8231E635
-3D93 8231E636
-3D94 8231E637
-3D95 8231E638
-3D96 8231E639
-3D97 8231E730
-3D98 8231E731
-3D99 8231E732
-3D9A 8231E733
-3D9B 8231E734
-3D9C 8231E735
-3D9D 8231E736
-3D9E 8231E737
-3D9F 8231E738
-3DA0 8231E739
-3DA1 8231E830
-3DA2 8231E831
-3DA3 8231E832
-3DA4 8231E833
-3DA5 8231E834
-3DA6 8231E835
-3DA7 8231E836
-3DA8 8231E837
-3DA9 8231E838
-3DAA 8231E839
-3DAB 8231E930
-3DAC 8231E931
-3DAD 8231E932
-3DAE 8231E933
-3DAF 8231E934
-3DB0 8231E935
-3DB1 8231E936
-3DB2 8231E937
-3DB3 8231E938
-3DB4 8231E939
-3DB5 8231EA30
-3DB6 8231EA31
-3DB7 8231EA32
-3DB8 8231EA33
-3DB9 8231EA34
-3DBA 8231EA35
-3DBB 8231EA36
-3DBC 8231EA37
-3DBD 8231EA38
-3DBE 8231EA39
-3DBF 8231EB30
-3DC0 8231EB31
-3DC1 8231EB32
-3DC2 8231EB33
-3DC3 8231EB34
-3DC4 8231EB35
-3DC5 8231EB36
-3DC6 8231EB37
-3DC7 8231EB38
-3DC8 8231EB39
-3DC9 8231EC30
-3DCA 8231EC31
-3DCB 8231EC32
-3DCC 8231EC33
-3DCD 8231EC34
-3DCE 8231EC35
-3DCF 8231EC36
-3DD0 8231EC37
-3DD1 8231EC38
-3DD2 8231EC39
-3DD3 8231ED30
-3DD4 8231ED31
-3DD5 8231ED32
-3DD6 8231ED33
-3DD7 8231ED34
-3DD8 8231ED35
-3DD9 8231ED36
-3DDA 8231ED37
-3DDB 8231ED38
-3DDC 8231ED39
-3DDD 8231EE30
-3DDE 8231EE31
-3DDF 8231EE32
-3DE0 8231EE33
-3DE1 8231EE34
-3DE2 8231EE35
-3DE3 8231EE36
-3DE4 8231EE37
-3DE5 8231EE38
-3DE6 8231EE39
-3DE7 8231EF30
-3DE8 8231EF31
-3DE9 8231EF32
-3DEA 8231EF33
-3DEB 8231EF34
-3DEC 8231EF35
-3DED 8231EF36
-3DEE 8231EF37
-3DEF 8231EF38
-3DF0 8231EF39
-3DF1 8231F030
-3DF2 8231F031
-3DF3 8231F032
-3DF4 8231F033
-3DF5 8231F034
-3DF6 8231F035
-3DF7 8231F036
-3DF8 8231F037
-3DF9 8231F038
-3DFA 8231F039
-3DFB 8231F130
-3DFC 8231F131
-3DFD 8231F132
-3DFE 8231F133
-3DFF 8231F134
-3E00 8231F135
-3E01 8231F136
-3E02 8231F137
-3E03 8231F138
-3E04 8231F139
-3E05 8231F230
-3E06 8231F231
-3E07 8231F232
-3E08 8231F233
-3E09 8231F234
-3E0A 8231F235
-3E0B 8231F236
-3E0C 8231F237
-3E0D 8231F238
-3E0E 8231F239
-3E0F 8231F330
-3E10 8231F331
-3E11 8231F332
-3E12 8231F333
-3E13 8231F334
-3E14 8231F335
-3E15 8231F336
-3E16 8231F337
-3E17 8231F338
-3E18 8231F339
-3E19 8231F430
-3E1A 8231F431
-3E1B 8231F432
-3E1C 8231F433
-3E1D 8231F434
-3E1E 8231F435
-3E1F 8231F436
-3E20 8231F437
-3E21 8231F438
-3E22 8231F439
-3E23 8231F530
-3E24 8231F531
-3E25 8231F532
-3E26 8231F533
-3E27 8231F534
-3E28 8231F535
-3E29 8231F536
-3E2A 8231F537
-3E2B 8231F538
-3E2C 8231F539
-3E2D 8231F630
-3E2E 8231F631
-3E2F 8231F632
-3E30 8231F633
-3E31 8231F634
-3E32 8231F635
-3E33 8231F636
-3E34 8231F637
-3E35 8231F638
-3E36 8231F639
-3E37 8231F730
-3E38 8231F731
-3E39 8231F732
-3E3A 8231F733
-3E3B 8231F734
-3E3C 8231F735
-3E3D 8231F736
-3E3E 8231F737
-3E3F 8231F738
-3E40 8231F739
-3E41 8231F830
-3E42 8231F831
-3E43 8231F832
-3E44 8231F833
-3E45 8231F834
-3E46 8231F835
-3E47 8231F836
-3E48 8231F837
-3E49 8231F838
-3E4A 8231F839
-3E4B 8231F930
-3E4C 8231F931
-3E4D 8231F932
-3E4E 8231F933
-3E4F 8231F934
-3E50 8231F935
-3E51 8231F936
-3E52 8231F937
-3E53 8231F938
-3E54 8231F939
-3E55 8231FA30
-3E56 8231FA31
-3E57 8231FA32
-3E58 8231FA33
-3E59 8231FA34
-3E5A 8231FA35
-3E5B 8231FA36
-3E5C 8231FA37
-3E5D 8231FA38
-3E5E 8231FA39
-3E5F 8231FB30
-3E60 8231FB31
-3E61 8231FB32
-3E62 8231FB33
-3E63 8231FB34
-3E64 8231FB35
-3E65 8231FB36
-3E66 8231FB37
-3E67 8231FB38
-3E68 8231FB39
-3E69 8231FC30
-3E6A 8231FC31
-3E6B 8231FC32
-3E6C 8231FC33
-3E6D 8231FC34
-3E6E 8231FC35
-3E6F 8231FC36
-3E70 8231FC37
-3E71 8231FC38
-3E72 8231FC39
-3E73 8231FD30
-3E74 8231FD31
-3E75 8231FD32
-3E76 8231FD33
-3E77 8231FD34
-3E78 8231FD35
-3E79 8231FD36
-3E7A 8231FD37
-3E7B 8231FD38
-3E7C 8231FD39
-3E7D 8231FE30
-3E7E 8231FE31
-3E7F 8231FE32
-3E80 8231FE33
-3E81 8231FE34
-3E82 8231FE35
-3E83 8231FE36
-3E84 8231FE37
-3E85 8231FE38
-3E86 8231FE39
-3E87 82328130
-3E88 82328131
-3E89 82328132
-3E8A 82328133
-3E8B 82328134
-3E8C 82328135
-3E8D 82328136
-3E8E 82328137
-3E8F 82328138
-3E90 82328139
-3E91 82328230
-3E92 82328231
-3E93 82328232
-3E94 82328233
-3E95 82328234
-3E96 82328235
-3E97 82328236
-3E98 82328237
-3E99 82328238
-3E9A 82328239
-3E9B 82328330
-3E9C 82328331
-3E9D 82328332
-3E9E 82328333
-3E9F 82328334
-3EA0 82328335
-3EA1 82328336
-3EA2 82328337
-3EA3 82328338
-3EA4 82328339
-3EA5 82328430
-3EA6 82328431
-3EA7 82328432
-3EA8 82328433
-3EA9 82328434
-3EAA 82328435
-3EAB 82328436
-3EAC 82328437
-3EAD 82328438
-3EAE 82328439
-3EAF 82328530
-3EB0 82328531
-3EB1 82328532
-3EB2 82328533
-3EB3 82328534
-3EB4 82328535
-3EB5 82328536
-3EB6 82328537
-3EB7 82328538
-3EB8 82328539
-3EB9 82328630
-3EBA 82328631
-3EBB 82328632
-3EBC 82328633
-3EBD 82328634
-3EBE 82328635
-3EBF 82328636
-3EC0 82328637
-3EC1 82328638
-3EC2 82328639
-3EC3 82328730
-3EC4 82328731
-3EC5 82328732
-3EC6 82328733
-3EC7 82328734
-3EC8 82328735
-3EC9 82328736
-3ECA 82328737
-3ECB 82328738
-3ECC 82328739
-3ECD 82328830
-3ECE 82328831
-3ECF 82328832
-3ED0 82328833
-3ED1 82328834
-3ED2 82328835
-3ED3 82328836
-3ED4 82328837
-3ED5 82328838
-3ED6 82328839
-3ED7 82328930
-3ED8 82328931
-3ED9 82328932
-3EDA 82328933
-3EDB 82328934
-3EDC 82328935
-3EDD 82328936
-3EDE 82328937
-3EDF 82328938
-3EE0 82328939
-3EE1 82328A30
-3EE2 82328A31
-3EE3 82328A32
-3EE4 82328A33
-3EE5 82328A34
-3EE6 82328A35
-3EE7 82328A36
-3EE8 82328A37
-3EE9 82328A38
-3EEA 82328A39
-3EEB 82328B30
-3EEC 82328B31
-3EED 82328B32
-3EEE 82328B33
-3EEF 82328B34
-3EF0 82328B35
-3EF1 82328B36
-3EF2 82328B37
-3EF3 82328B38
-3EF4 82328B39
-3EF5 82328C30
-3EF6 82328C31
-3EF7 82328C32
-3EF8 82328C33
-3EF9 82328C34
-3EFA 82328C35
-3EFB 82328C36
-3EFC 82328C37
-3EFD 82328C38
-3EFE 82328C39
-3EFF 82328D30
-3F00 82328D31
-3F01 82328D32
-3F02 82328D33
-3F03 82328D34
-3F04 82328D35
-3F05 82328D36
-3F06 82328D37
-3F07 82328D38
-3F08 82328D39
-3F09 82328E30
-3F0A 82328E31
-3F0B 82328E32
-3F0C 82328E33
-3F0D 82328E34
-3F0E 82328E35
-3F0F 82328E36
-3F10 82328E37
-3F11 82328E38
-3F12 82328E39
-3F13 82328F30
-3F14 82328F31
-3F15 82328F32
-3F16 82328F33
-3F17 82328F34
-3F18 82328F35
-3F19 82328F36
-3F1A 82328F37
-3F1B 82328F38
-3F1C 82328F39
-3F1D 82329030
-3F1E 82329031
-3F1F 82329032
-3F20 82329033
-3F21 82329034
-3F22 82329035
-3F23 82329036
-3F24 82329037
-3F25 82329038
-3F26 82329039
-3F27 82329130
-3F28 82329131
-3F29 82329132
-3F2A 82329133
-3F2B 82329134
-3F2C 82329135
-3F2D 82329136
-3F2E 82329137
-3F2F 82329138
-3F30 82329139
-3F31 82329230
-3F32 82329231
-3F33 82329232
-3F34 82329233
-3F35 82329234
-3F36 82329235
-3F37 82329236
-3F38 82329237
-3F39 82329238
-3F3A 82329239
-3F3B 82329330
-3F3C 82329331
-3F3D 82329332
-3F3E 82329333
-3F3F 82329334
-3F40 82329335
-3F41 82329336
-3F42 82329337
-3F43 82329338
-3F44 82329339
-3F45 82329430
-3F46 82329431
-3F47 82329432
-3F48 82329433
-3F49 82329434
-3F4A 82329435
-3F4B 82329436
-3F4C 82329437
-3F4D 82329438
-3F4E 82329439
-3F4F 82329530
-3F50 82329531
-3F51 82329532
-3F52 82329533
-3F53 82329534
-3F54 82329535
-3F55 82329536
-3F56 82329537
-3F57 82329538
-3F58 82329539
-3F59 82329630
-3F5A 82329631
-3F5B 82329632
-3F5C 82329633
-3F5D 82329634
-3F5E 82329635
-3F5F 82329636
-3F60 82329637
-3F61 82329638
-3F62 82329639
-3F63 82329730
-3F64 82329731
-3F65 82329732
-3F66 82329733
-3F67 82329734
-3F68 82329735
-3F69 82329736
-3F6A 82329737
-3F6B 82329738
-3F6C 82329739
-3F6D 82329830
-3F6E 82329831
-3F6F 82329832
-3F70 82329833
-3F71 82329834
-3F72 82329835
-3F73 82329836
-3F74 82329837
-3F75 82329838
-3F76 82329839
-3F77 82329930
-3F78 82329931
-3F79 82329932
-3F7A 82329933
-3F7B 82329934
-3F7C 82329935
-3F7D 82329936
-3F7E 82329937
-3F7F 82329938
-3F80 82329939
-3F81 82329A30
-3F82 82329A31
-3F83 82329A32
-3F84 82329A33
-3F85 82329A34
-3F86 82329A35
-3F87 82329A36
-3F88 82329A37
-3F89 82329A38
-3F8A 82329A39
-3F8B 82329B30
-3F8C 82329B31
-3F8D 82329B32
-3F8E 82329B33
-3F8F 82329B34
-3F90 82329B35
-3F91 82329B36
-3F92 82329B37
-3F93 82329B38
-3F94 82329B39
-3F95 82329C30
-3F96 82329C31
-3F97 82329C32
-3F98 82329C33
-3F99 82329C34
-3F9A 82329C35
-3F9B 82329C36
-3F9C 82329C37
-3F9D 82329C38
-3F9E 82329C39
-3F9F 82329D30
-3FA0 82329D31
-3FA1 82329D32
-3FA2 82329D33
-3FA3 82329D34
-3FA4 82329D35
-3FA5 82329D36
-3FA6 82329D37
-3FA7 82329D38
-3FA8 82329D39
-3FA9 82329E30
-3FAA 82329E31
-3FAB 82329E32
-3FAC 82329E33
-3FAD 82329E34
-3FAE 82329E35
-3FAF 82329E36
-3FB0 82329E37
-3FB1 82329E38
-3FB2 82329E39
-3FB3 82329F30
-3FB4 82329F31
-3FB5 82329F32
-3FB6 82329F33
-3FB7 82329F34
-3FB8 82329F35
-3FB9 82329F36
-3FBA 82329F37
-3FBB 82329F38
-3FBC 82329F39
-3FBD 8232A030
-3FBE 8232A031
-3FBF 8232A032
-3FC0 8232A033
-3FC1 8232A034
-3FC2 8232A035
-3FC3 8232A036
-3FC4 8232A037
-3FC5 8232A038
-3FC6 8232A039
-3FC7 8232A130
-3FC8 8232A131
-3FC9 8232A132
-3FCA 8232A133
-3FCB 8232A134
-3FCC 8232A135
-3FCD 8232A136
-3FCE 8232A137
-3FCF 8232A138
-3FD0 8232A139
-3FD1 8232A230
-3FD2 8232A231
-3FD3 8232A232
-3FD4 8232A233
-3FD5 8232A234
-3FD6 8232A235
-3FD7 8232A236
-3FD8 8232A237
-3FD9 8232A238
-3FDA 8232A239
-3FDB 8232A330
-3FDC 8232A331
-3FDD 8232A332
-3FDE 8232A333
-3FDF 8232A334
-3FE0 8232A335
-3FE1 8232A336
-3FE2 8232A337
-3FE3 8232A338
-3FE4 8232A339
-3FE5 8232A430
-3FE6 8232A431
-3FE7 8232A432
-3FE8 8232A433
-3FE9 8232A434
-3FEA 8232A435
-3FEB 8232A436
-3FEC 8232A437
-3FED 8232A438
-3FEE 8232A439
-3FEF 8232A530
-3FF0 8232A531
-3FF1 8232A532
-3FF2 8232A533
-3FF3 8232A534
-3FF4 8232A535
-3FF5 8232A536
-3FF6 8232A537
-3FF7 8232A538
-3FF8 8232A539
-3FF9 8232A630
-3FFA 8232A631
-3FFB 8232A632
-3FFC 8232A633
-3FFD 8232A634
-3FFE 8232A635
-3FFF 8232A636
-4000 8232A637
-4001 8232A638
-4002 8232A639
-4003 8232A730
-4004 8232A731
-4005 8232A732
-4006 8232A733
-4007 8232A734
-4008 8232A735
-4009 8232A736
-400A 8232A737
-400B 8232A738
-400C 8232A739
-400D 8232A830
-400E 8232A831
-400F 8232A832
-4010 8232A833
-4011 8232A834
-4012 8232A835
-4013 8232A836
-4014 8232A837
-4015 8232A838
-4016 8232A839
-4017 8232A930
-4018 8232A931
-4019 8232A932
-401A 8232A933
-401B 8232A934
-401C 8232A935
-401D 8232A936
-401E 8232A937
-401F 8232A938
-4020 8232A939
-4021 8232AA30
-4022 8232AA31
-4023 8232AA32
-4024 8232AA33
-4025 8232AA34
-4026 8232AA35
-4027 8232AA36
-4028 8232AA37
-4029 8232AA38
-402A 8232AA39
-402B 8232AB30
-402C 8232AB31
-402D 8232AB32
-402E 8232AB33
-402F 8232AB34
-4030 8232AB35
-4031 8232AB36
-4032 8232AB37
-4033 8232AB38
-4034 8232AB39
-4035 8232AC30
-4036 8232AC31
-4037 8232AC32
-4038 8232AC33
-4039 8232AC34
-403A 8232AC35
-403B 8232AC36
-403C 8232AC37
-403D 8232AC38
-403E 8232AC39
-403F 8232AD30
-4040 8232AD31
-4041 8232AD32
-4042 8232AD33
-4043 8232AD34
-4044 8232AD35
-4045 8232AD36
-4046 8232AD37
-4047 8232AD38
-4048 8232AD39
-4049 8232AE30
-404A 8232AE31
-404B 8232AE32
-404C 8232AE33
-404D 8232AE34
-404E 8232AE35
-404F 8232AE36
-4050 8232AE37
-4051 8232AE38
-4052 8232AE39
-4053 8232AF30
-4054 8232AF31
-4055 8232AF32
-4056 FE6F
-4057 8232AF33
-4058 8232AF34
-4059 8232AF35
-405A 8232AF36
-405B 8232AF37
-405C 8232AF38
-405D 8232AF39
-405E 8232B030
-405F 8232B031
-4060 8232B032
-4061 8232B033
-4062 8232B034
-4063 8232B035
-4064 8232B036
-4065 8232B037
-4066 8232B038
-4067 8232B039
-4068 8232B130
-4069 8232B131
-406A 8232B132
-406B 8232B133
-406C 8232B134
-406D 8232B135
-406E 8232B136
-406F 8232B137
-4070 8232B138
-4071 8232B139
-4072 8232B230
-4073 8232B231
-4074 8232B232
-4075 8232B233
-4076 8232B234
-4077 8232B235
-4078 8232B236
-4079 8232B237
-407A 8232B238
-407B 8232B239
-407C 8232B330
-407D 8232B331
-407E 8232B332
-407F 8232B333
-4080 8232B334
-4081 8232B335
-4082 8232B336
-4083 8232B337
-4084 8232B338
-4085 8232B339
-4086 8232B430
-4087 8232B431
-4088 8232B432
-4089 8232B433
-408A 8232B434
-408B 8232B435
-408C 8232B436
-408D 8232B437
-408E 8232B438
-408F 8232B439
-4090 8232B530
-4091 8232B531
-4092 8232B532
-4093 8232B533
-4094 8232B534
-4095 8232B535
-4096 8232B536
-4097 8232B537
-4098 8232B538
-4099 8232B539
-409A 8232B630
-409B 8232B631
-409C 8232B632
-409D 8232B633
-409E 8232B634
-409F 8232B635
-40A0 8232B636
-40A1 8232B637
-40A2 8232B638
-40A3 8232B639
-40A4 8232B730
-40A5 8232B731
-40A6 8232B732
-40A7 8232B733
-40A8 8232B734
-40A9 8232B735
-40AA 8232B736
-40AB 8232B737
-40AC 8232B738
-40AD 8232B739
-40AE 8232B830
-40AF 8232B831
-40B0 8232B832
-40B1 8232B833
-40B2 8232B834
-40B3 8232B835
-40B4 8232B836
-40B5 8232B837
-40B6 8232B838
-40B7 8232B839
-40B8 8232B930
-40B9 8232B931
-40BA 8232B932
-40BB 8232B933
-40BC 8232B934
-40BD 8232B935
-40BE 8232B936
-40BF 8232B937
-40C0 8232B938
-40C1 8232B939
-40C2 8232BA30
-40C3 8232BA31
-40C4 8232BA32
-40C5 8232BA33
-40C6 8232BA34
-40C7 8232BA35
-40C8 8232BA36
-40C9 8232BA37
-40CA 8232BA38
-40CB 8232BA39
-40CC 8232BB30
-40CD 8232BB31
-40CE 8232BB32
-40CF 8232BB33
-40D0 8232BB34
-40D1 8232BB35
-40D2 8232BB36
-40D3 8232BB37
-40D4 8232BB38
-40D5 8232BB39
-40D6 8232BC30
-40D7 8232BC31
-40D8 8232BC32
-40D9 8232BC33
-40DA 8232BC34
-40DB 8232BC35
-40DC 8232BC36
-40DD 8232BC37
-40DE 8232BC38
-40DF 8232BC39
-40E0 8232BD30
-40E1 8232BD31
-40E2 8232BD32
-40E3 8232BD33
-40E4 8232BD34
-40E5 8232BD35
-40E6 8232BD36
-40E7 8232BD37
-40E8 8232BD38
-40E9 8232BD39
-40EA 8232BE30
-40EB 8232BE31
-40EC 8232BE32
-40ED 8232BE33
-40EE 8232BE34
-40EF 8232BE35
-40F0 8232BE36
-40F1 8232BE37
-40F2 8232BE38
-40F3 8232BE39
-40F4 8232BF30
-40F5 8232BF31
-40F6 8232BF32
-40F7 8232BF33
-40F8 8232BF34
-40F9 8232BF35
-40FA 8232BF36
-40FB 8232BF37
-40FC 8232BF38
-40FD 8232BF39
-40FE 8232C030
-40FF 8232C031
-4100 8232C032
-4101 8232C033
-4102 8232C034
-4103 8232C035
-4104 8232C036
-4105 8232C037
-4106 8232C038
-4107 8232C039
-4108 8232C130
-4109 8232C131
-410A 8232C132
-410B 8232C133
-410C 8232C134
-410D 8232C135
-410E 8232C136
-410F 8232C137
-4110 8232C138
-4111 8232C139
-4112 8232C230
-4113 8232C231
-4114 8232C232
-4115 8232C233
-4116 8232C234
-4117 8232C235
-4118 8232C236
-4119 8232C237
-411A 8232C238
-411B 8232C239
-411C 8232C330
-411D 8232C331
-411E 8232C332
-411F 8232C333
-4120 8232C334
-4121 8232C335
-4122 8232C336
-4123 8232C337
-4124 8232C338
-4125 8232C339
-4126 8232C430
-4127 8232C431
-4128 8232C432
-4129 8232C433
-412A 8232C434
-412B 8232C435
-412C 8232C436
-412D 8232C437
-412E 8232C438
-412F 8232C439
-4130 8232C530
-4131 8232C531
-4132 8232C532
-4133 8232C533
-4134 8232C534
-4135 8232C535
-4136 8232C536
-4137 8232C537
-4138 8232C538
-4139 8232C539
-413A 8232C630
-413B 8232C631
-413C 8232C632
-413D 8232C633
-413E 8232C634
-413F 8232C635
-4140 8232C636
-4141 8232C637
-4142 8232C638
-4143 8232C639
-4144 8232C730
-4145 8232C731
-4146 8232C732
-4147 8232C733
-4148 8232C734
-4149 8232C735
-414A 8232C736
-414B 8232C737
-414C 8232C738
-414D 8232C739
-414E 8232C830
-414F 8232C831
-4150 8232C832
-4151 8232C833
-4152 8232C834
-4153 8232C835
-4154 8232C836
-4155 8232C837
-4156 8232C838
-4157 8232C839
-4158 8232C930
-4159 8232C931
-415A 8232C932
-415B 8232C933
-415C 8232C934
-415D 8232C935
-415E 8232C936
-415F FE70
-4160 8232C937
-4161 8232C938
-4162 8232C939
-4163 8232CA30
-4164 8232CA31
-4165 8232CA32
-4166 8232CA33
-4167 8232CA34
-4168 8232CA35
-4169 8232CA36
-416A 8232CA37
-416B 8232CA38
-416C 8232CA39
-416D 8232CB30
-416E 8232CB31
-416F 8232CB32
-4170 8232CB33
-4171 8232CB34
-4172 8232CB35
-4173 8232CB36
-4174 8232CB37
-4175 8232CB38
-4176 8232CB39
-4177 8232CC30
-4178 8232CC31
-4179 8232CC32
-417A 8232CC33
-417B 8232CC34
-417C 8232CC35
-417D 8232CC36
-417E 8232CC37
-417F 8232CC38
-4180 8232CC39
-4181 8232CD30
-4182 8232CD31
-4183 8232CD32
-4184 8232CD33
-4185 8232CD34
-4186 8232CD35
-4187 8232CD36
-4188 8232CD37
-4189 8232CD38
-418A 8232CD39
-418B 8232CE30
-418C 8232CE31
-418D 8232CE32
-418E 8232CE33
-418F 8232CE34
-4190 8232CE35
-4191 8232CE36
-4192 8232CE37
-4193 8232CE38
-4194 8232CE39
-4195 8232CF30
-4196 8232CF31
-4197 8232CF32
-4198 8232CF33
-4199 8232CF34
-419A 8232CF35
-419B 8232CF36
-419C 8232CF37
-419D 8232CF38
-419E 8232CF39
-419F 8232D030
-41A0 8232D031
-41A1 8232D032
-41A2 8232D033
-41A3 8232D034
-41A4 8232D035
-41A5 8232D036
-41A6 8232D037
-41A7 8232D038
-41A8 8232D039
-41A9 8232D130
-41AA 8232D131
-41AB 8232D132
-41AC 8232D133
-41AD 8232D134
-41AE 8232D135
-41AF 8232D136
-41B0 8232D137
-41B1 8232D138
-41B2 8232D139
-41B3 8232D230
-41B4 8232D231
-41B5 8232D232
-41B6 8232D233
-41B7 8232D234
-41B8 8232D235
-41B9 8232D236
-41BA 8232D237
-41BB 8232D238
-41BC 8232D239
-41BD 8232D330
-41BE 8232D331
-41BF 8232D332
-41C0 8232D333
-41C1 8232D334
-41C2 8232D335
-41C3 8232D336
-41C4 8232D337
-41C5 8232D338
-41C6 8232D339
-41C7 8232D430
-41C8 8232D431
-41C9 8232D432
-41CA 8232D433
-41CB 8232D434
-41CC 8232D435
-41CD 8232D436
-41CE 8232D437
-41CF 8232D438
-41D0 8232D439
-41D1 8232D530
-41D2 8232D531
-41D3 8232D532
-41D4 8232D533
-41D5 8232D534
-41D6 8232D535
-41D7 8232D536
-41D8 8232D537
-41D9 8232D538
-41DA 8232D539
-41DB 8232D630
-41DC 8232D631
-41DD 8232D632
-41DE 8232D633
-41DF 8232D634
-41E0 8232D635
-41E1 8232D636
-41E2 8232D637
-41E3 8232D638
-41E4 8232D639
-41E5 8232D730
-41E6 8232D731
-41E7 8232D732
-41E8 8232D733
-41E9 8232D734
-41EA 8232D735
-41EB 8232D736
-41EC 8232D737
-41ED 8232D738
-41EE 8232D739
-41EF 8232D830
-41F0 8232D831
-41F1 8232D832
-41F2 8232D833
-41F3 8232D834
-41F4 8232D835
-41F5 8232D836
-41F6 8232D837
-41F7 8232D838
-41F8 8232D839
-41F9 8232D930
-41FA 8232D931
-41FB 8232D932
-41FC 8232D933
-41FD 8232D934
-41FE 8232D935
-41FF 8232D936
-4200 8232D937
-4201 8232D938
-4202 8232D939
-4203 8232DA30
-4204 8232DA31
-4205 8232DA32
-4206 8232DA33
-4207 8232DA34
-4208 8232DA35
-4209 8232DA36
-420A 8232DA37
-420B 8232DA38
-420C 8232DA39
-420D 8232DB30
-420E 8232DB31
-420F 8232DB32
-4210 8232DB33
-4211 8232DB34
-4212 8232DB35
-4213 8232DB36
-4214 8232DB37
-4215 8232DB38
-4216 8232DB39
-4217 8232DC30
-4218 8232DC31
-4219 8232DC32
-421A 8232DC33
-421B 8232DC34
-421C 8232DC35
-421D 8232DC36
-421E 8232DC37
-421F 8232DC38
-4220 8232DC39
-4221 8232DD30
-4222 8232DD31
-4223 8232DD32
-4224 8232DD33
-4225 8232DD34
-4226 8232DD35
-4227 8232DD36
-4228 8232DD37
-4229 8232DD38
-422A 8232DD39
-422B 8232DE30
-422C 8232DE31
-422D 8232DE32
-422E 8232DE33
-422F 8232DE34
-4230 8232DE35
-4231 8232DE36
-4232 8232DE37
-4233 8232DE38
-4234 8232DE39
-4235 8232DF30
-4236 8232DF31
-4237 8232DF32
-4238 8232DF33
-4239 8232DF34
-423A 8232DF35
-423B 8232DF36
-423C 8232DF37
-423D 8232DF38
-423E 8232DF39
-423F 8232E030
-4240 8232E031
-4241 8232E032
-4242 8232E033
-4243 8232E034
-4244 8232E035
-4245 8232E036
-4246 8232E037
-4247 8232E038
-4248 8232E039
-4249 8232E130
-424A 8232E131
-424B 8232E132
-424C 8232E133
-424D 8232E134
-424E 8232E135
-424F 8232E136
-4250 8232E137
-4251 8232E138
-4252 8232E139
-4253 8232E230
-4254 8232E231
-4255 8232E232
-4256 8232E233
-4257 8232E234
-4258 8232E235
-4259 8232E236
-425A 8232E237
-425B 8232E238
-425C 8232E239
-425D 8232E330
-425E 8232E331
-425F 8232E332
-4260 8232E333
-4261 8232E334
-4262 8232E335
-4263 8232E336
-4264 8232E337
-4265 8232E338
-4266 8232E339
-4267 8232E430
-4268 8232E431
-4269 8232E432
-426A 8232E433
-426B 8232E434
-426C 8232E435
-426D 8232E436
-426E 8232E437
-426F 8232E438
-4270 8232E439
-4271 8232E530
-4272 8232E531
-4273 8232E532
-4274 8232E533
-4275 8232E534
-4276 8232E535
-4277 8232E536
-4278 8232E537
-4279 8232E538
-427A 8232E539
-427B 8232E630
-427C 8232E631
-427D 8232E632
-427E 8232E633
-427F 8232E634
-4280 8232E635
-4281 8232E636
-4282 8232E637
-4283 8232E638
-4284 8232E639
-4285 8232E730
-4286 8232E731
-4287 8232E732
-4288 8232E733
-4289 8232E734
-428A 8232E735
-428B 8232E736
-428C 8232E737
-428D 8232E738
-428E 8232E739
-428F 8232E830
-4290 8232E831
-4291 8232E832
-4292 8232E833
-4293 8232E834
-4294 8232E835
-4295 8232E836
-4296 8232E837
-4297 8232E838
-4298 8232E839
-4299 8232E930
-429A 8232E931
-429B 8232E932
-429C 8232E933
-429D 8232E934
-429E 8232E935
-429F 8232E936
-42A0 8232E937
-42A1 8232E938
-42A2 8232E939
-42A3 8232EA30
-42A4 8232EA31
-42A5 8232EA32
-42A6 8232EA33
-42A7 8232EA34
-42A8 8232EA35
-42A9 8232EA36
-42AA 8232EA37
-42AB 8232EA38
-42AC 8232EA39
-42AD 8232EB30
-42AE 8232EB31
-42AF 8232EB32
-42B0 8232EB33
-42B1 8232EB34
-42B2 8232EB35
-42B3 8232EB36
-42B4 8232EB37
-42B5 8232EB38
-42B6 8232EB39
-42B7 8232EC30
-42B8 8232EC31
-42B9 8232EC32
-42BA 8232EC33
-42BB 8232EC34
-42BC 8232EC35
-42BD 8232EC36
-42BE 8232EC37
-42BF 8232EC38
-42C0 8232EC39
-42C1 8232ED30
-42C2 8232ED31
-42C3 8232ED32
-42C4 8232ED33
-42C5 8232ED34
-42C6 8232ED35
-42C7 8232ED36
-42C8 8232ED37
-42C9 8232ED38
-42CA 8232ED39
-42CB 8232EE30
-42CC 8232EE31
-42CD 8232EE32
-42CE 8232EE33
-42CF 8232EE34
-42D0 8232EE35
-42D1 8232EE36
-42D2 8232EE37
-42D3 8232EE38
-42D4 8232EE39
-42D5 8232EF30
-42D6 8232EF31
-42D7 8232EF32
-42D8 8232EF33
-42D9 8232EF34
-42DA 8232EF35
-42DB 8232EF36
-42DC 8232EF37
-42DD 8232EF38
-42DE 8232EF39
-42DF 8232F030
-42E0 8232F031
-42E1 8232F032
-42E2 8232F033
-42E3 8232F034
-42E4 8232F035
-42E5 8232F036
-42E6 8232F037
-42E7 8232F038
-42E8 8232F039
-42E9 8232F130
-42EA 8232F131
-42EB 8232F132
-42EC 8232F133
-42ED 8232F134
-42EE 8232F135
-42EF 8232F136
-42F0 8232F137
-42F1 8232F138
-42F2 8232F139
-42F3 8232F230
-42F4 8232F231
-42F5 8232F232
-42F6 8232F233
-42F7 8232F234
-42F8 8232F235
-42F9 8232F236
-42FA 8232F237
-42FB 8232F238
-42FC 8232F239
-42FD 8232F330
-42FE 8232F331
-42FF 8232F332
-4300 8232F333
-4301 8232F334
-4302 8232F335
-4303 8232F336
-4304 8232F337
-4305 8232F338
-4306 8232F339
-4307 8232F430
-4308 8232F431
-4309 8232F432
-430A 8232F433
-430B 8232F434
-430C 8232F435
-430D 8232F436
-430E 8232F437
-430F 8232F438
-4310 8232F439
-4311 8232F530
-4312 8232F531
-4313 8232F532
-4314 8232F533
-4315 8232F534
-4316 8232F535
-4317 8232F536
-4318 8232F537
-4319 8232F538
-431A 8232F539
-431B 8232F630
-431C 8232F631
-431D 8232F632
-431E 8232F633
-431F 8232F634
-4320 8232F635
-4321 8232F636
-4322 8232F637
-4323 8232F638
-4324 8232F639
-4325 8232F730
-4326 8232F731
-4327 8232F732
-4328 8232F733
-4329 8232F734
-432A 8232F735
-432B 8232F736
-432C 8232F737
-432D 8232F738
-432E 8232F739
-432F 8232F830
-4330 8232F831
-4331 8232F832
-4332 8232F833
-4333 8232F834
-4334 8232F835
-4335 8232F836
-4336 8232F837
-4337 FE72
-4338 8232F838
-4339 8232F839
-433A 8232F930
-433B 8232F931
-433C 8232F932
-433D 8232F933
-433E 8232F934
-433F 8232F935
-4340 8232F936
-4341 8232F937
-4342 8232F938
-4343 8232F939
-4344 8232FA30
-4345 8232FA31
-4346 8232FA32
-4347 8232FA33
-4348 8232FA34
-4349 8232FA35
-434A 8232FA36
-434B 8232FA37
-434C 8232FA38
-434D 8232FA39
-434E 8232FB30
-434F 8232FB31
-4350 8232FB32
-4351 8232FB33
-4352 8232FB34
-4353 8232FB35
-4354 8232FB36
-4355 8232FB37
-4356 8232FB38
-4357 8232FB39
-4358 8232FC30
-4359 8232FC31
-435A 8232FC32
-435B 8232FC33
-435C 8232FC34
-435D 8232FC35
-435E 8232FC36
-435F 8232FC37
-4360 8232FC38
-4361 8232FC39
-4362 8232FD30
-4363 8232FD31
-4364 8232FD32
-4365 8232FD33
-4366 8232FD34
-4367 8232FD35
-4368 8232FD36
-4369 8232FD37
-436A 8232FD38
-436B 8232FD39
-436C 8232FE30
-436D 8232FE31
-436E 8232FE32
-436F 8232FE33
-4370 8232FE34
-4371 8232FE35
-4372 8232FE36
-4373 8232FE37
-4374 8232FE38
-4375 8232FE39
-4376 82338130
-4377 82338131
-4378 82338132
-4379 82338133
-437A 82338134
-437B 82338135
-437C 82338136
-437D 82338137
-437E 82338138
-437F 82338139
-4380 82338230
-4381 82338231
-4382 82338232
-4383 82338233
-4384 82338234
-4385 82338235
-4386 82338236
-4387 82338237
-4388 82338238
-4389 82338239
-438A 82338330
-438B 82338331
-438C 82338332
-438D 82338333
-438E 82338334
-438F 82338335
-4390 82338336
-4391 82338337
-4392 82338338
-4393 82338339
-4394 82338430
-4395 82338431
-4396 82338432
-4397 82338433
-4398 82338434
-4399 82338435
-439A 82338436
-439B 82338437
-439C 82338438
-439D 82338439
-439E 82338530
-439F 82338531
-43A0 82338532
-43A1 82338533
-43A2 82338534
-43A3 82338535
-43A4 82338536
-43A5 82338537
-43A6 82338538
-43A7 82338539
-43A8 82338630
-43A9 82338631
-43AA 82338632
-43AB 82338633
-43AC FE78
-43AD 82338634
-43AE 82338635
-43AF 82338636
-43B0 82338637
-43B1 FE77
-43B2 82338638
-43B3 82338639
-43B4 82338730
-43B5 82338731
-43B6 82338732
-43B7 82338733
-43B8 82338734
-43B9 82338735
-43BA 82338736
-43BB 82338737
-43BC 82338738
-43BD 82338739
-43BE 82338830
-43BF 82338831
-43C0 82338832
-43C1 82338833
-43C2 82338834
-43C3 82338835
-43C4 82338836
-43C5 82338837
-43C6 82338838
-43C7 82338839
-43C8 82338930
-43C9 82338931
-43CA 82338932
-43CB 82338933
-43CC 82338934
-43CD 82338935
-43CE 82338936
-43CF 82338937
-43D0 82338938
-43D1 82338939
-43D2 82338A30
-43D3 82338A31
-43D4 82338A32
-43D5 82338A33
-43D6 82338A34
-43D7 82338A35
-43D8 82338A36
-43D9 82338A37
-43DA 82338A38
-43DB 82338A39
-43DC 82338B30
-43DD FE7A
-43DE 82338B31
-43DF 82338B32
-43E0 82338B33
-43E1 82338B34
-43E2 82338B35
-43E3 82338B36
-43E4 82338B37
-43E5 82338B38
-43E6 82338B39
-43E7 82338C30
-43E8 82338C31
-43E9 82338C32
-43EA 82338C33
-43EB 82338C34
-43EC 82338C35
-43ED 82338C36
-43EE 82338C37
-43EF 82338C38
-43F0 82338C39
-43F1 82338D30
-43F2 82338D31
-43F3 82338D32
-43F4 82338D33
-43F5 82338D34
-43F6 82338D35
-43F7 82338D36
-43F8 82338D37
-43F9 82338D38
-43FA 82338D39
-43FB 82338E30
-43FC 82338E31
-43FD 82338E32
-43FE 82338E33
-43FF 82338E34
-4400 82338E35
-4401 82338E36
-4402 82338E37
-4403 82338E38
-4404 82338E39
-4405 82338F30
-4406 82338F31
-4407 82338F32
-4408 82338F33
-4409 82338F34
-440A 82338F35
-440B 82338F36
-440C 82338F37
-440D 82338F38
-440E 82338F39
-440F 82339030
-4410 82339031
-4411 82339032
-4412 82339033
-4413 82339034
-4414 82339035
-4415 82339036
-4416 82339037
-4417 82339038
-4418 82339039
-4419 82339130
-441A 82339131
-441B 82339132
-441C 82339133
-441D 82339134
-441E 82339135
-441F 82339136
-4420 82339137
-4421 82339138
-4422 82339139
-4423 82339230
-4424 82339231
-4425 82339232
-4426 82339233
-4427 82339234
-4428 82339235
-4429 82339236
-442A 82339237
-442B 82339238
-442C 82339239
-442D 82339330
-442E 82339331
-442F 82339332
-4430 82339333
-4431 82339334
-4432 82339335
-4433 82339336
-4434 82339337
-4435 82339338
-4436 82339339
-4437 82339430
-4438 82339431
-4439 82339432
-443A 82339433
-443B 82339434
-443C 82339435
-443D 82339436
-443E 82339437
-443F 82339438
-4440 82339439
-4441 82339530
-4442 82339531
-4443 82339532
-4444 82339533
-4445 82339534
-4446 82339535
-4447 82339536
-4448 82339537
-4449 82339538
-444A 82339539
-444B 82339630
-444C 82339631
-444D 82339632
-444E 82339633
-444F 82339634
-4450 82339635
-4451 82339636
-4452 82339637
-4453 82339638
-4454 82339639
-4455 82339730
-4456 82339731
-4457 82339732
-4458 82339733
-4459 82339734
-445A 82339735
-445B 82339736
-445C 82339737
-445D 82339738
-445E 82339739
-445F 82339830
-4460 82339831
-4461 82339832
-4462 82339833
-4463 82339834
-4464 82339835
-4465 82339836
-4466 82339837
-4467 82339838
-4468 82339839
-4469 82339930
-446A 82339931
-446B 82339932
-446C 82339933
-446D 82339934
-446E 82339935
-446F 82339936
-4470 82339937
-4471 82339938
-4472 82339939
-4473 82339A30
-4474 82339A31
-4475 82339A32
-4476 82339A33
-4477 82339A34
-4478 82339A35
-4479 82339A36
-447A 82339A37
-447B 82339A38
-447C 82339A39
-447D 82339B30
-447E 82339B31
-447F 82339B32
-4480 82339B33
-4481 82339B34
-4482 82339B35
-4483 82339B36
-4484 82339B37
-4485 82339B38
-4486 82339B39
-4487 82339C30
-4488 82339C31
-4489 82339C32
-448A 82339C33
-448B 82339C34
-448C 82339C35
-448D 82339C36
-448E 82339C37
-448F 82339C38
-4490 82339C39
-4491 82339D30
-4492 82339D31
-4493 82339D32
-4494 82339D33
-4495 82339D34
-4496 82339D35
-4497 82339D36
-4498 82339D37
-4499 82339D38
-449A 82339D39
-449B 82339E30
-449C 82339E31
-449D 82339E32
-449E 82339E33
-449F 82339E34
-44A0 82339E35
-44A1 82339E36
-44A2 82339E37
-44A3 82339E38
-44A4 82339E39
-44A5 82339F30
-44A6 82339F31
-44A7 82339F32
-44A8 82339F33
-44A9 82339F34
-44AA 82339F35
-44AB 82339F36
-44AC 82339F37
-44AD 82339F38
-44AE 82339F39
-44AF 8233A030
-44B0 8233A031
-44B1 8233A032
-44B2 8233A033
-44B3 8233A034
-44B4 8233A035
-44B5 8233A036
-44B6 8233A037
-44B7 8233A038
-44B8 8233A039
-44B9 8233A130
-44BA 8233A131
-44BB 8233A132
-44BC 8233A133
-44BD 8233A134
-44BE 8233A135
-44BF 8233A136
-44C0 8233A137
-44C1 8233A138
-44C2 8233A139
-44C3 8233A230
-44C4 8233A231
-44C5 8233A232
-44C6 8233A233
-44C7 8233A234
-44C8 8233A235
-44C9 8233A236
-44CA 8233A237
-44CB 8233A238
-44CC 8233A239
-44CD 8233A330
-44CE 8233A331
-44CF 8233A332
-44D0 8233A333
-44D1 8233A334
-44D2 8233A335
-44D3 8233A336
-44D4 8233A337
-44D5 8233A338
-44D6 FE7B
-44D7 8233A339
-44D8 8233A430
-44D9 8233A431
-44DA 8233A432
-44DB 8233A433
-44DC 8233A434
-44DD 8233A435
-44DE 8233A436
-44DF 8233A437
-44E0 8233A438
-44E1 8233A439
-44E2 8233A530
-44E3 8233A531
-44E4 8233A532
-44E5 8233A533
-44E6 8233A534
-44E7 8233A535
-44E8 8233A536
-44E9 8233A537
-44EA 8233A538
-44EB 8233A539
-44EC 8233A630
-44ED 8233A631
-44EE 8233A632
-44EF 8233A633
-44F0 8233A634
-44F1 8233A635
-44F2 8233A636
-44F3 8233A637
-44F4 8233A638
-44F5 8233A639
-44F6 8233A730
-44F7 8233A731
-44F8 8233A732
-44F9 8233A733
-44FA 8233A734
-44FB 8233A735
-44FC 8233A736
-44FD 8233A737
-44FE 8233A738
-44FF 8233A739
-4500 8233A830
-4501 8233A831
-4502 8233A832
-4503 8233A833
-4504 8233A834
-4505 8233A835
-4506 8233A836
-4507 8233A837
-4508 8233A838
-4509 8233A839
-450A 8233A930
-450B 8233A931
-450C 8233A932
-450D 8233A933
-450E 8233A934
-450F 8233A935
-4510 8233A936
-4511 8233A937
-4512 8233A938
-4513 8233A939
-4514 8233AA30
-4515 8233AA31
-4516 8233AA32
-4517 8233AA33
-4518 8233AA34
-4519 8233AA35
-451A 8233AA36
-451B 8233AA37
-451C 8233AA38
-451D 8233AA39
-451E 8233AB30
-451F 8233AB31
-4520 8233AB32
-4521 8233AB33
-4522 8233AB34
-4523 8233AB35
-4524 8233AB36
-4525 8233AB37
-4526 8233AB38
-4527 8233AB39
-4528 8233AC30
-4529 8233AC31
-452A 8233AC32
-452B 8233AC33
-452C 8233AC34
-452D 8233AC35
-452E 8233AC36
-452F 8233AC37
-4530 8233AC38
-4531 8233AC39
-4532 8233AD30
-4533 8233AD31
-4534 8233AD32
-4535 8233AD33
-4536 8233AD34
-4537 8233AD35
-4538 8233AD36
-4539 8233AD37
-453A 8233AD38
-453B 8233AD39
-453C 8233AE30
-453D 8233AE31
-453E 8233AE32
-453F 8233AE33
-4540 8233AE34
-4541 8233AE35
-4542 8233AE36
-4543 8233AE37
-4544 8233AE38
-4545 8233AE39
-4546 8233AF30
-4547 8233AF31
-4548 8233AF32
-4549 8233AF33
-454A 8233AF34
-454B 8233AF35
-454C 8233AF36
-454D 8233AF37
-454E 8233AF38
-454F 8233AF39
-4550 8233B030
-4551 8233B031
-4552 8233B032
-4553 8233B033
-4554 8233B034
-4555 8233B035
-4556 8233B036
-4557 8233B037
-4558 8233B038
-4559 8233B039
-455A 8233B130
-455B 8233B131
-455C 8233B132
-455D 8233B133
-455E 8233B134
-455F 8233B135
-4560 8233B136
-4561 8233B137
-4562 8233B138
-4563 8233B139
-4564 8233B230
-4565 8233B231
-4566 8233B232
-4567 8233B233
-4568 8233B234
-4569 8233B235
-456A 8233B236
-456B 8233B237
-456C 8233B238
-456D 8233B239
-456E 8233B330
-456F 8233B331
-4570 8233B332
-4571 8233B333
-4572 8233B334
-4573 8233B335
-4574 8233B336
-4575 8233B337
-4576 8233B338
-4577 8233B339
-4578 8233B430
-4579 8233B431
-457A 8233B432
-457B 8233B433
-457C 8233B434
-457D 8233B435
-457E 8233B436
-457F 8233B437
-4580 8233B438
-4581 8233B439
-4582 8233B530
-4583 8233B531
-4584 8233B532
-4585 8233B533
-4586 8233B534
-4587 8233B535
-4588 8233B536
-4589 8233B537
-458A 8233B538
-458B 8233B539
-458C 8233B630
-458D 8233B631
-458E 8233B632
-458F 8233B633
-4590 8233B634
-4591 8233B635
-4592 8233B636
-4593 8233B637
-4594 8233B638
-4595 8233B639
-4596 8233B730
-4597 8233B731
-4598 8233B732
-4599 8233B733
-459A 8233B734
-459B 8233B735
-459C 8233B736
-459D 8233B737
-459E 8233B738
-459F 8233B739
-45A0 8233B830
-45A1 8233B831
-45A2 8233B832
-45A3 8233B833
-45A4 8233B834
-45A5 8233B835
-45A6 8233B836
-45A7 8233B837
-45A8 8233B838
-45A9 8233B839
-45AA 8233B930
-45AB 8233B931
-45AC 8233B932
-45AD 8233B933
-45AE 8233B934
-45AF 8233B935
-45B0 8233B936
-45B1 8233B937
-45B2 8233B938
-45B3 8233B939
-45B4 8233BA30
-45B5 8233BA31
-45B6 8233BA32
-45B7 8233BA33
-45B8 8233BA34
-45B9 8233BA35
-45BA 8233BA36
-45BB 8233BA37
-45BC 8233BA38
-45BD 8233BA39
-45BE 8233BB30
-45BF 8233BB31
-45C0 8233BB32
-45C1 8233BB33
-45C2 8233BB34
-45C3 8233BB35
-45C4 8233BB36
-45C5 8233BB37
-45C6 8233BB38
-45C7 8233BB39
-45C8 8233BC30
-45C9 8233BC31
-45CA 8233BC32
-45CB 8233BC33
-45CC 8233BC34
-45CD 8233BC35
-45CE 8233BC36
-45CF 8233BC37
-45D0 8233BC38
-45D1 8233BC39
-45D2 8233BD30
-45D3 8233BD31
-45D4 8233BD32
-45D5 8233BD33
-45D6 8233BD34
-45D7 8233BD35
-45D8 8233BD36
-45D9 8233BD37
-45DA 8233BD38
-45DB 8233BD39
-45DC 8233BE30
-45DD 8233BE31
-45DE 8233BE32
-45DF 8233BE33
-45E0 8233BE34
-45E1 8233BE35
-45E2 8233BE36
-45E3 8233BE37
-45E4 8233BE38
-45E5 8233BE39
-45E6 8233BF30
-45E7 8233BF31
-45E8 8233BF32
-45E9 8233BF33
-45EA 8233BF34
-45EB 8233BF35
-45EC 8233BF36
-45ED 8233BF37
-45EE 8233BF38
-45EF 8233BF39
-45F0 8233C030
-45F1 8233C031
-45F2 8233C032
-45F3 8233C033
-45F4 8233C034
-45F5 8233C035
-45F6 8233C036
-45F7 8233C037
-45F8 8233C038
-45F9 8233C039
-45FA 8233C130
-45FB 8233C131
-45FC 8233C132
-45FD 8233C133
-45FE 8233C134
-45FF 8233C135
-4600 8233C136
-4601 8233C137
-4602 8233C138
-4603 8233C139
-4604 8233C230
-4605 8233C231
-4606 8233C232
-4607 8233C233
-4608 8233C234
-4609 8233C235
-460A 8233C236
-460B 8233C237
-460C 8233C238
-460D 8233C239
-460E 8233C330
-460F 8233C331
-4610 8233C332
-4611 8233C333
-4612 8233C334
-4613 8233C335
-4614 8233C336
-4615 8233C337
-4616 8233C338
-4617 8233C339
-4618 8233C430
-4619 8233C431
-461A 8233C432
-461B 8233C433
-461C 8233C434
-461D 8233C435
-461E 8233C436
-461F 8233C437
-4620 8233C438
-4621 8233C439
-4622 8233C530
-4623 8233C531
-4624 8233C532
-4625 8233C533
-4626 8233C534
-4627 8233C535
-4628 8233C536
-4629 8233C537
-462A 8233C538
-462B 8233C539
-462C 8233C630
-462D 8233C631
-462E 8233C632
-462F 8233C633
-4630 8233C634
-4631 8233C635
-4632 8233C636
-4633 8233C637
-4634 8233C638
-4635 8233C639
-4636 8233C730
-4637 8233C731
-4638 8233C732
-4639 8233C733
-463A 8233C734
-463B 8233C735
-463C 8233C736
-463D 8233C737
-463E 8233C738
-463F 8233C739
-4640 8233C830
-4641 8233C831
-4642 8233C832
-4643 8233C833
-4644 8233C834
-4645 8233C835
-4646 8233C836
-4647 8233C837
-4648 8233C838
-4649 8233C839
-464A 8233C930
-464B 8233C931
-464C FE7D
-464D 8233C932
-464E 8233C933
-464F 8233C934
-4650 8233C935
-4651 8233C936
-4652 8233C937
-4653 8233C938
-4654 8233C939
-4655 8233CA30
-4656 8233CA31
-4657 8233CA32
-4658 8233CA33
-4659 8233CA34
-465A 8233CA35
-465B 8233CA36
-465C 8233CA37
-465D 8233CA38
-465E 8233CA39
-465F 8233CB30
-4660 8233CB31
-4661 FE7C
-4662 8233CB32
-4663 8233CB33
-4664 8233CB34
-4665 8233CB35
-4666 8233CB36
-4667 8233CB37
-4668 8233CB38
-4669 8233CB39
-466A 8233CC30
-466B 8233CC31
-466C 8233CC32
-466D 8233CC33
-466E 8233CC34
-466F 8233CC35
-4670 8233CC36
-4671 8233CC37
-4672 8233CC38
-4673 8233CC39
-4674 8233CD30
-4675 8233CD31
-4676 8233CD32
-4677 8233CD33
-4678 8233CD34
-4679 8233CD35
-467A 8233CD36
-467B 8233CD37
-467C 8233CD38
-467D 8233CD39
-467E 8233CE30
-467F 8233CE31
-4680 8233CE32
-4681 8233CE33
-4682 8233CE34
-4683 8233CE35
-4684 8233CE36
-4685 8233CE37
-4686 8233CE38
-4687 8233CE39
-4688 8233CF30
-4689 8233CF31
-468A 8233CF32
-468B 8233CF33
-468C 8233CF34
-468D 8233CF35
-468E 8233CF36
-468F 8233CF37
-4690 8233CF38
-4691 8233CF39
-4692 8233D030
-4693 8233D031
-4694 8233D032
-4695 8233D033
-4696 8233D034
-4697 8233D035
-4698 8233D036
-4699 8233D037
-469A 8233D038
-469B 8233D039
-469C 8233D130
-469D 8233D131
-469E 8233D132
-469F 8233D133
-46A0 8233D134
-46A1 8233D135
-46A2 8233D136
-46A3 8233D137
-46A4 8233D138
-46A5 8233D139
-46A6 8233D230
-46A7 8233D231
-46A8 8233D232
-46A9 8233D233
-46AA 8233D234
-46AB 8233D235
-46AC 8233D236
-46AD 8233D237
-46AE 8233D238
-46AF 8233D239
-46B0 8233D330
-46B1 8233D331
-46B2 8233D332
-46B3 8233D333
-46B4 8233D334
-46B5 8233D335
-46B6 8233D336
-46B7 8233D337
-46B8 8233D338
-46B9 8233D339
-46BA 8233D430
-46BB 8233D431
-46BC 8233D432
-46BD 8233D433
-46BE 8233D434
-46BF 8233D435
-46C0 8233D436
-46C1 8233D437
-46C2 8233D438
-46C3 8233D439
-46C4 8233D530
-46C5 8233D531
-46C6 8233D532
-46C7 8233D533
-46C8 8233D534
-46C9 8233D535
-46CA 8233D536
-46CB 8233D537
-46CC 8233D538
-46CD 8233D539
-46CE 8233D630
-46CF 8233D631
-46D0 8233D632
-46D1 8233D633
-46D2 8233D634
-46D3 8233D635
-46D4 8233D636
-46D5 8233D637
-46D6 8233D638
-46D7 8233D639
-46D8 8233D730
-46D9 8233D731
-46DA 8233D732
-46DB 8233D733
-46DC 8233D734
-46DD 8233D735
-46DE 8233D736
-46DF 8233D737
-46E0 8233D738
-46E1 8233D739
-46E2 8233D830
-46E3 8233D831
-46E4 8233D832
-46E5 8233D833
-46E6 8233D834
-46E7 8233D835
-46E8 8233D836
-46E9 8233D837
-46EA 8233D838
-46EB 8233D839
-46EC 8233D930
-46ED 8233D931
-46EE 8233D932
-46EF 8233D933
-46F0 8233D934
-46F1 8233D935
-46F2 8233D936
-46F3 8233D937
-46F4 8233D938
-46F5 8233D939
-46F6 8233DA30
-46F7 8233DA31
-46F8 8233DA32
-46F9 8233DA33
-46FA 8233DA34
-46FB 8233DA35
-46FC 8233DA36
-46FD 8233DA37
-46FE 8233DA38
-46FF 8233DA39
-4700 8233DB30
-4701 8233DB31
-4702 8233DB32
-4703 8233DB33
-4704 8233DB34
-4705 8233DB35
-4706 8233DB36
-4707 8233DB37
-4708 8233DB38
-4709 8233DB39
-470A 8233DC30
-470B 8233DC31
-470C 8233DC32
-470D 8233DC33
-470E 8233DC34
-470F 8233DC35
-4710 8233DC36
-4711 8233DC37
-4712 8233DC38
-4713 8233DC39
-4714 8233DD30
-4715 8233DD31
-4716 8233DD32
-4717 8233DD33
-4718 8233DD34
-4719 8233DD35
-471A 8233DD36
-471B 8233DD37
-471C 8233DD38
-471D 8233DD39
-471E 8233DE30
-471F 8233DE31
-4720 8233DE32
-4721 8233DE33
-4722 8233DE34
-4723 FE80
-4724 8233DE35
-4725 8233DE36
-4726 8233DE37
-4727 8233DE38
-4728 8233DE39
-4729 FE81
-472A 8233DF30
-472B 8233DF31
-472C 8233DF32
-472D 8233DF33
-472E 8233DF34
-472F 8233DF35
-4730 8233DF36
-4731 8233DF37
-4732 8233DF38
-4733 8233DF39
-4734 8233E030
-4735 8233E031
-4736 8233E032
-4737 8233E033
-4738 8233E034
-4739 8233E035
-473A 8233E036
-473B 8233E037
-473C 8233E038
-473D 8233E039
-473E 8233E130
-473F 8233E131
-4740 8233E132
-4741 8233E133
-4742 8233E134
-4743 8233E135
-4744 8233E136
-4745 8233E137
-4746 8233E138
-4747 8233E139
-4748 8233E230
-4749 8233E231
-474A 8233E232
-474B 8233E233
-474C 8233E234
-474D 8233E235
-474E 8233E236
-474F 8233E237
-4750 8233E238
-4751 8233E239
-4752 8233E330
-4753 8233E331
-4754 8233E332
-4755 8233E333
-4756 8233E334
-4757 8233E335
-4758 8233E336
-4759 8233E337
-475A 8233E338
-475B 8233E339
-475C 8233E430
-475D 8233E431
-475E 8233E432
-475F 8233E433
-4760 8233E434
-4761 8233E435
-4762 8233E436
-4763 8233E437
-4764 8233E438
-4765 8233E439
-4766 8233E530
-4767 8233E531
-4768 8233E532
-4769 8233E533
-476A 8233E534
-476B 8233E535
-476C 8233E536
-476D 8233E537
-476E 8233E538
-476F 8233E539
-4770 8233E630
-4771 8233E631
-4772 8233E632
-4773 8233E633
-4774 8233E634
-4775 8233E635
-4776 8233E636
-4777 8233E637
-4778 8233E638
-4779 8233E639
-477A 8233E730
-477B 8233E731
-477C FE82
-477D 8233E732
-477E 8233E733
-477F 8233E734
-4780 8233E735
-4781 8233E736
-4782 8233E737
-4783 8233E738
-4784 8233E739
-4785 8233E830
-4786 8233E831
-4787 8233E832
-4788 8233E833
-4789 8233E834
-478A 8233E835
-478B 8233E836
-478C 8233E837
-478D FE83
-478E 8233E838
-478F 8233E839
-4790 8233E930
-4791 8233E931
-4792 8233E932
-4793 8233E933
-4794 8233E934
-4795 8233E935
-4796 8233E936
-4797 8233E937
-4798 8233E938
-4799 8233E939
-479A 8233EA30
-479B 8233EA31
-479C 8233EA32
-479D 8233EA33
-479E 8233EA34
-479F 8233EA35
-47A0 8233EA36
-47A1 8233EA37
-47A2 8233EA38
-47A3 8233EA39
-47A4 8233EB30
-47A5 8233EB31
-47A6 8233EB32
-47A7 8233EB33
-47A8 8233EB34
-47A9 8233EB35
-47AA 8233EB36
-47AB 8233EB37
-47AC 8233EB38
-47AD 8233EB39
-47AE 8233EC30
-47AF 8233EC31
-47B0 8233EC32
-47B1 8233EC33
-47B2 8233EC34
-47B3 8233EC35
-47B4 8233EC36
-47B5 8233EC37
-47B6 8233EC38
-47B7 8233EC39
-47B8 8233ED30
-47B9 8233ED31
-47BA 8233ED32
-47BB 8233ED33
-47BC 8233ED34
-47BD 8233ED35
-47BE 8233ED36
-47BF 8233ED37
-47C0 8233ED38
-47C1 8233ED39
-47C2 8233EE30
-47C3 8233EE31
-47C4 8233EE32
-47C5 8233EE33
-47C6 8233EE34
-47C7 8233EE35
-47C8 8233EE36
-47C9 8233EE37
-47CA 8233EE38
-47CB 8233EE39
-47CC 8233EF30
-47CD 8233EF31
-47CE 8233EF32
-47CF 8233EF33
-47D0 8233EF34
-47D1 8233EF35
-47D2 8233EF36
-47D3 8233EF37
-47D4 8233EF38
-47D5 8233EF39
-47D6 8233F030
-47D7 8233F031
-47D8 8233F032
-47D9 8233F033
-47DA 8233F034
-47DB 8233F035
-47DC 8233F036
-47DD 8233F037
-47DE 8233F038
-47DF 8233F039
-47E0 8233F130
-47E1 8233F131
-47E2 8233F132
-47E3 8233F133
-47E4 8233F134
-47E5 8233F135
-47E6 8233F136
-47E7 8233F137
-47E8 8233F138
-47E9 8233F139
-47EA 8233F230
-47EB 8233F231
-47EC 8233F232
-47ED 8233F233
-47EE 8233F234
-47EF 8233F235
-47F0 8233F236
-47F1 8233F237
-47F2 8233F238
-47F3 8233F239
-47F4 8233F330
-47F5 8233F331
-47F6 8233F332
-47F7 8233F333
-47F8 8233F334
-47F9 8233F335
-47FA 8233F336
-47FB 8233F337
-47FC 8233F338
-47FD 8233F339
-47FE 8233F430
-47FF 8233F431
-4800 8233F432
-4801 8233F433
-4802 8233F434
-4803 8233F435
-4804 8233F436
-4805 8233F437
-4806 8233F438
-4807 8233F439
-4808 8233F530
-4809 8233F531
-480A 8233F532
-480B 8233F533
-480C 8233F534
-480D 8233F535
-480E 8233F536
-480F 8233F537
-4810 8233F538
-4811 8233F539
-4812 8233F630
-4813 8233F631
-4814 8233F632
-4815 8233F633
-4816 8233F634
-4817 8233F635
-4818 8233F636
-4819 8233F637
-481A 8233F638
-481B 8233F639
-481C 8233F730
-481D 8233F731
-481E 8233F732
-481F 8233F733
-4820 8233F734
-4821 8233F735
-4822 8233F736
-4823 8233F737
-4824 8233F738
-4825 8233F739
-4826 8233F830
-4827 8233F831
-4828 8233F832
-4829 8233F833
-482A 8233F834
-482B 8233F835
-482C 8233F836
-482D 8233F837
-482E 8233F838
-482F 8233F839
-4830 8233F930
-4831 8233F931
-4832 8233F932
-4833 8233F933
-4834 8233F934
-4835 8233F935
-4836 8233F936
-4837 8233F937
-4838 8233F938
-4839 8233F939
-483A 8233FA30
-483B 8233FA31
-483C 8233FA32
-483D 8233FA33
-483E 8233FA34
-483F 8233FA35
-4840 8233FA36
-4841 8233FA37
-4842 8233FA38
-4843 8233FA39
-4844 8233FB30
-4845 8233FB31
-4846 8233FB32
-4847 8233FB33
-4848 8233FB34
-4849 8233FB35
-484A 8233FB36
-484B 8233FB37
-484C 8233FB38
-484D 8233FB39
-484E 8233FC30
-484F 8233FC31
-4850 8233FC32
-4851 8233FC33
-4852 8233FC34
-4853 8233FC35
-4854 8233FC36
-4855 8233FC37
-4856 8233FC38
-4857 8233FC39
-4858 8233FD30
-4859 8233FD31
-485A 8233FD32
-485B 8233FD33
-485C 8233FD34
-485D 8233FD35
-485E 8233FD36
-485F 8233FD37
-4860 8233FD38
-4861 8233FD39
-4862 8233FE30
-4863 8233FE31
-4864 8233FE32
-4865 8233FE33
-4866 8233FE34
-4867 8233FE35
-4868 8233FE36
-4869 8233FE37
-486A 8233FE38
-486B 8233FE39
-486C 82348130
-486D 82348131
-486E 82348132
-486F 82348133
-4870 82348134
-4871 82348135
-4872 82348136
-4873 82348137
-4874 82348138
-4875 82348139
-4876 82348230
-4877 82348231
-4878 82348232
-4879 82348233
-487A 82348234
-487B 82348235
-487C 82348236
-487D 82348237
-487E 82348238
-487F 82348239
-4880 82348330
-4881 82348331
-4882 82348332
-4883 82348333
-4884 82348334
-4885 82348335
-4886 82348336
-4887 82348337
-4888 82348338
-4889 82348339
-488A 82348430
-488B 82348431
-488C 82348432
-488D 82348433
-488E 82348434
-488F 82348435
-4890 82348436
-4891 82348437
-4892 82348438
-4893 82348439
-4894 82348530
-4895 82348531
-4896 82348532
-4897 82348533
-4898 82348534
-4899 82348535
-489A 82348536
-489B 82348537
-489C 82348538
-489D 82348539
-489E 82348630
-489F 82348631
-48A0 82348632
-48A1 82348633
-48A2 82348634
-48A3 82348635
-48A4 82348636
-48A5 82348637
-48A6 82348638
-48A7 82348639
-48A8 82348730
-48A9 82348731
-48AA 82348732
-48AB 82348733
-48AC 82348734
-48AD 82348735
-48AE 82348736
-48AF 82348737
-48B0 82348738
-48B1 82348739
-48B2 82348830
-48B3 82348831
-48B4 82348832
-48B5 82348833
-48B6 82348834
-48B7 82348835
-48B8 82348836
-48B9 82348837
-48BA 82348838
-48BB 82348839
-48BC 82348930
-48BD 82348931
-48BE 82348932
-48BF 82348933
-48C0 82348934
-48C1 82348935
-48C2 82348936
-48C3 82348937
-48C4 82348938
-48C5 82348939
-48C6 82348A30
-48C7 82348A31
-48C8 82348A32
-48C9 82348A33
-48CA 82348A34
-48CB 82348A35
-48CC 82348A36
-48CD 82348A37
-48CE 82348A38
-48CF 82348A39
-48D0 82348B30
-48D1 82348B31
-48D2 82348B32
-48D3 82348B33
-48D4 82348B34
-48D5 82348B35
-48D6 82348B36
-48D7 82348B37
-48D8 82348B38
-48D9 82348B39
-48DA 82348C30
-48DB 82348C31
-48DC 82348C32
-48DD 82348C33
-48DE 82348C34
-48DF 82348C35
-48E0 82348C36
-48E1 82348C37
-48E2 82348C38
-48E3 82348C39
-48E4 82348D30
-48E5 82348D31
-48E6 82348D32
-48E7 82348D33
-48E8 82348D34
-48E9 82348D35
-48EA 82348D36
-48EB 82348D37
-48EC 82348D38
-48ED 82348D39
-48EE 82348E30
-48EF 82348E31
-48F0 82348E32
-48F1 82348E33
-48F2 82348E34
-48F3 82348E35
-48F4 82348E36
-48F5 82348E37
-48F6 82348E38
-48F7 82348E39
-48F8 82348F30
-48F9 82348F31
-48FA 82348F32
-48FB 82348F33
-48FC 82348F34
-48FD 82348F35
-48FE 82348F36
-48FF 82348F37
-4900 82348F38
-4901 82348F39
-4902 82349030
-4903 82349031
-4904 82349032
-4905 82349033
-4906 82349034
-4907 82349035
-4908 82349036
-4909 82349037
-490A 82349038
-490B 82349039
-490C 82349130
-490D 82349131
-490E 82349132
-490F 82349133
-4910 82349134
-4911 82349135
-4912 82349136
-4913 82349137
-4914 82349138
-4915 82349139
-4916 82349230
-4917 82349231
-4918 82349232
-4919 82349233
-491A 82349234
-491B 82349235
-491C 82349236
-491D 82349237
-491E 82349238
-491F 82349239
-4920 82349330
-4921 82349331
-4922 82349332
-4923 82349333
-4924 82349334
-4925 82349335
-4926 82349336
-4927 82349337
-4928 82349338
-4929 82349339
-492A 82349430
-492B 82349431
-492C 82349432
-492D 82349433
-492E 82349434
-492F 82349435
-4930 82349436
-4931 82349437
-4932 82349438
-4933 82349439
-4934 82349530
-4935 82349531
-4936 82349532
-4937 82349533
-4938 82349534
-4939 82349535
-493A 82349536
-493B 82349537
-493C 82349538
-493D 82349539
-493E 82349630
-493F 82349631
-4940 82349632
-4941 82349633
-4942 82349634
-4943 82349635
-4944 82349636
-4945 82349637
-4946 82349638
-4947 FE85
-4948 82349639
-4949 82349730
-494A 82349731
-494B 82349732
-494C 82349733
-494D 82349734
-494E 82349735
-494F 82349736
-4950 82349737
-4951 82349738
-4952 82349739
-4953 82349830
-4954 82349831
-4955 82349832
-4956 82349833
-4957 82349834
-4958 82349835
-4959 82349836
-495A 82349837
-495B 82349838
-495C 82349839
-495D 82349930
-495E 82349931
-495F 82349932
-4960 82349933
-4961 82349934
-4962 82349935
-4963 82349936
-4964 82349937
-4965 82349938
-4966 82349939
-4967 82349A30
-4968 82349A31
-4969 82349A32
-496A 82349A33
-496B 82349A34
-496C 82349A35
-496D 82349A36
-496E 82349A37
-496F 82349A38
-4970 82349A39
-4971 82349B30
-4972 82349B31
-4973 82349B32
-4974 82349B33
-4975 82349B34
-4976 82349B35
-4977 82349B36
-4978 82349B37
-4979 82349B38
-497A FE86
-497B 82349B39
-497C 82349C30
-497D FE87
-497E 82349C31
-497F 82349C32
-4980 82349C33
-4981 82349C34
-4982 FE88
-4983 FE89
-4984 82349C35
-4985 FE8A
-4986 FE8B
-4987 82349C36
-4988 82349C37
-4989 82349C38
-498A 82349C39
-498B 82349D30
-498C 82349D31
-498D 82349D32
-498E 82349D33
-498F 82349D34
-4990 82349D35
-4991 82349D36
-4992 82349D37
-4993 82349D38
-4994 82349D39
-4995 82349E30
-4996 82349E31
-4997 82349E32
-4998 82349E33
-4999 82349E34
-499A 82349E35
-499B FE8D
-499C 82349E36
-499D 82349E37
-499E 82349E38
-499F FE8C
-49A0 82349E39
-49A1 82349F30
-49A2 82349F31
-49A3 82349F32
-49A4 82349F33
-49A5 82349F34
-49A6 82349F35
-49A7 82349F36
-49A8 82349F37
-49A9 82349F38
-49AA 82349F39
-49AB 8234A030
-49AC 8234A031
-49AD 8234A032
-49AE 8234A033
-49AF 8234A034
-49B0 8234A035
-49B1 8234A036
-49B2 8234A037
-49B3 8234A038
-49B4 8234A039
-49B5 8234A130
-49B6 FE8F
-49B7 FE8E
-49B8 8234A131
-49B9 8234A132
-49BA 8234A133
-49BB 8234A134
-49BC 8234A135
-49BD 8234A136
-49BE 8234A137
-49BF 8234A138
-49C0 8234A139
-49C1 8234A230
-49C2 8234A231
-49C3 8234A232
-49C4 8234A233
-49C5 8234A234
-49C6 8234A235
-49C7 8234A236
-49C8 8234A237
-49C9 8234A238
-49CA 8234A239
-49CB 8234A330
-49CC 8234A331
-49CD 8234A332
-49CE 8234A333
-49CF 8234A334
-49D0 8234A335
-49D1 8234A336
-49D2 8234A337
-49D3 8234A338
-49D4 8234A339
-49D5 8234A430
-49D6 8234A431
-49D7 8234A432
-49D8 8234A433
-49D9 8234A434
-49DA 8234A435
-49DB 8234A436
-49DC 8234A437
-49DD 8234A438
-49DE 8234A439
-49DF 8234A530
-49E0 8234A531
-49E1 8234A532
-49E2 8234A533
-49E3 8234A534
-49E4 8234A535
-49E5 8234A536
-49E6 8234A537
-49E7 8234A538
-49E8 8234A539
-49E9 8234A630
-49EA 8234A631
-49EB 8234A632
-49EC 8234A633
-49ED 8234A634
-49EE 8234A635
-49EF 8234A636
-49F0 8234A637
-49F1 8234A638
-49F2 8234A639
-49F3 8234A730
-49F4 8234A731
-49F5 8234A732
-49F6 8234A733
-49F7 8234A734
-49F8 8234A735
-49F9 8234A736
-49FA 8234A737
-49FB 8234A738
-49FC 8234A739
-49FD 8234A830
-49FE 8234A831
-49FF 8234A832
-4A00 8234A833
-4A01 8234A834
-4A02 8234A835
-4A03 8234A836
-4A04 8234A837
-4A05 8234A838
-4A06 8234A839
-4A07 8234A930
-4A08 8234A931
-4A09 8234A932
-4A0A 8234A933
-4A0B 8234A934
-4A0C 8234A935
-4A0D 8234A936
-4A0E 8234A937
-4A0F 8234A938
-4A10 8234A939
-4A11 8234AA30
-4A12 8234AA31
-4A13 8234AA32
-4A14 8234AA33
-4A15 8234AA34
-4A16 8234AA35
-4A17 8234AA36
-4A18 8234AA37
-4A19 8234AA38
-4A1A 8234AA39
-4A1B 8234AB30
-4A1C 8234AB31
-4A1D 8234AB32
-4A1E 8234AB33
-4A1F 8234AB34
-4A20 8234AB35
-4A21 8234AB36
-4A22 8234AB37
-4A23 8234AB38
-4A24 8234AB39
-4A25 8234AC30
-4A26 8234AC31
-4A27 8234AC32
-4A28 8234AC33
-4A29 8234AC34
-4A2A 8234AC35
-4A2B 8234AC36
-4A2C 8234AC37
-4A2D 8234AC38
-4A2E 8234AC39
-4A2F 8234AD30
-4A30 8234AD31
-4A31 8234AD32
-4A32 8234AD33
-4A33 8234AD34
-4A34 8234AD35
-4A35 8234AD36
-4A36 8234AD37
-4A37 8234AD38
-4A38 8234AD39
-4A39 8234AE30
-4A3A 8234AE31
-4A3B 8234AE32
-4A3C 8234AE33
-4A3D 8234AE34
-4A3E 8234AE35
-4A3F 8234AE36
-4A40 8234AE37
-4A41 8234AE38
-4A42 8234AE39
-4A43 8234AF30
-4A44 8234AF31
-4A45 8234AF32
-4A46 8234AF33
-4A47 8234AF34
-4A48 8234AF35
-4A49 8234AF36
-4A4A 8234AF37
-4A4B 8234AF38
-4A4C 8234AF39
-4A4D 8234B030
-4A4E 8234B031
-4A4F 8234B032
-4A50 8234B033
-4A51 8234B034
-4A52 8234B035
-4A53 8234B036
-4A54 8234B037
-4A55 8234B038
-4A56 8234B039
-4A57 8234B130
-4A58 8234B131
-4A59 8234B132
-4A5A 8234B133
-4A5B 8234B134
-4A5C 8234B135
-4A5D 8234B136
-4A5E 8234B137
-4A5F 8234B138
-4A60 8234B139
-4A61 8234B230
-4A62 8234B231
-4A63 8234B232
-4A64 8234B233
-4A65 8234B234
-4A66 8234B235
-4A67 8234B236
-4A68 8234B237
-4A69 8234B238
-4A6A 8234B239
-4A6B 8234B330
-4A6C 8234B331
-4A6D 8234B332
-4A6E 8234B333
-4A6F 8234B334
-4A70 8234B335
-4A71 8234B336
-4A72 8234B337
-4A73 8234B338
-4A74 8234B339
-4A75 8234B430
-4A76 8234B431
-4A77 8234B432
-4A78 8234B433
-4A79 8234B434
-4A7A 8234B435
-4A7B 8234B436
-4A7C 8234B437
-4A7D 8234B438
-4A7E 8234B439
-4A7F 8234B530
-4A80 8234B531
-4A81 8234B532
-4A82 8234B533
-4A83 8234B534
-4A84 8234B535
-4A85 8234B536
-4A86 8234B537
-4A87 8234B538
-4A88 8234B539
-4A89 8234B630
-4A8A 8234B631
-4A8B 8234B632
-4A8C 8234B633
-4A8D 8234B634
-4A8E 8234B635
-4A8F 8234B636
-4A90 8234B637
-4A91 8234B638
-4A92 8234B639
-4A93 8234B730
-4A94 8234B731
-4A95 8234B732
-4A96 8234B733
-4A97 8234B734
-4A98 8234B735
-4A99 8234B736
-4A9A 8234B737
-4A9B 8234B738
-4A9C 8234B739
-4A9D 8234B830
-4A9E 8234B831
-4A9F 8234B832
-4AA0 8234B833
-4AA1 8234B834
-4AA2 8234B835
-4AA3 8234B836
-4AA4 8234B837
-4AA5 8234B838
-4AA6 8234B839
-4AA7 8234B930
-4AA8 8234B931
-4AA9 8234B932
-4AAA 8234B933
-4AAB 8234B934
-4AAC 8234B935
-4AAD 8234B936
-4AAE 8234B937
-4AAF 8234B938
-4AB0 8234B939
-4AB1 8234BA30
-4AB2 8234BA31
-4AB3 8234BA32
-4AB4 8234BA33
-4AB5 8234BA34
-4AB6 8234BA35
-4AB7 8234BA36
-4AB8 8234BA37
-4AB9 8234BA38
-4ABA 8234BA39
-4ABB 8234BB30
-4ABC 8234BB31
-4ABD 8234BB32
-4ABE 8234BB33
-4ABF 8234BB34
-4AC0 8234BB35
-4AC1 8234BB36
-4AC2 8234BB37
-4AC3 8234BB38
-4AC4 8234BB39
-4AC5 8234BC30
-4AC6 8234BC31
-4AC7 8234BC32
-4AC8 8234BC33
-4AC9 8234BC34
-4ACA 8234BC35
-4ACB 8234BC36
-4ACC 8234BC37
-4ACD 8234BC38
-4ACE 8234BC39
-4ACF 8234BD30
-4AD0 8234BD31
-4AD1 8234BD32
-4AD2 8234BD33
-4AD3 8234BD34
-4AD4 8234BD35
-4AD5 8234BD36
-4AD6 8234BD37
-4AD7 8234BD38
-4AD8 8234BD39
-4AD9 8234BE30
-4ADA 8234BE31
-4ADB 8234BE32
-4ADC 8234BE33
-4ADD 8234BE34
-4ADE 8234BE35
-4ADF 8234BE36
-4AE0 8234BE37
-4AE1 8234BE38
-4AE2 8234BE39
-4AE3 8234BF30
-4AE4 8234BF31
-4AE5 8234BF32
-4AE6 8234BF33
-4AE7 8234BF34
-4AE8 8234BF35
-4AE9 8234BF36
-4AEA 8234BF37
-4AEB 8234BF38
-4AEC 8234BF39
-4AED 8234C030
-4AEE 8234C031
-4AEF 8234C032
-4AF0 8234C033
-4AF1 8234C034
-4AF2 8234C035
-4AF3 8234C036
-4AF4 8234C037
-4AF5 8234C038
-4AF6 8234C039
-4AF7 8234C130
-4AF8 8234C131
-4AF9 8234C132
-4AFA 8234C133
-4AFB 8234C134
-4AFC 8234C135
-4AFD 8234C136
-4AFE 8234C137
-4AFF 8234C138
-4B00 8234C139
-4B01 8234C230
-4B02 8234C231
-4B03 8234C232
-4B04 8234C233
-4B05 8234C234
-4B06 8234C235
-4B07 8234C236
-4B08 8234C237
-4B09 8234C238
-4B0A 8234C239
-4B0B 8234C330
-4B0C 8234C331
-4B0D 8234C332
-4B0E 8234C333
-4B0F 8234C334
-4B10 8234C335
-4B11 8234C336
-4B12 8234C337
-4B13 8234C338
-4B14 8234C339
-4B15 8234C430
-4B16 8234C431
-4B17 8234C432
-4B18 8234C433
-4B19 8234C434
-4B1A 8234C435
-4B1B 8234C436
-4B1C 8234C437
-4B1D 8234C438
-4B1E 8234C439
-4B1F 8234C530
-4B20 8234C531
-4B21 8234C532
-4B22 8234C533
-4B23 8234C534
-4B24 8234C535
-4B25 8234C536
-4B26 8234C537
-4B27 8234C538
-4B28 8234C539
-4B29 8234C630
-4B2A 8234C631
-4B2B 8234C632
-4B2C 8234C633
-4B2D 8234C634
-4B2E 8234C635
-4B2F 8234C636
-4B30 8234C637
-4B31 8234C638
-4B32 8234C639
-4B33 8234C730
-4B34 8234C731
-4B35 8234C732
-4B36 8234C733
-4B37 8234C734
-4B38 8234C735
-4B39 8234C736
-4B3A 8234C737
-4B3B 8234C738
-4B3C 8234C739
-4B3D 8234C830
-4B3E 8234C831
-4B3F 8234C832
-4B40 8234C833
-4B41 8234C834
-4B42 8234C835
-4B43 8234C836
-4B44 8234C837
-4B45 8234C838
-4B46 8234C839
-4B47 8234C930
-4B48 8234C931
-4B49 8234C932
-4B4A 8234C933
-4B4B 8234C934
-4B4C 8234C935
-4B4D 8234C936
-4B4E 8234C937
-4B4F 8234C938
-4B50 8234C939
-4B51 8234CA30
-4B52 8234CA31
-4B53 8234CA32
-4B54 8234CA33
-4B55 8234CA34
-4B56 8234CA35
-4B57 8234CA36
-4B58 8234CA37
-4B59 8234CA38
-4B5A 8234CA39
-4B5B 8234CB30
-4B5C 8234CB31
-4B5D 8234CB32
-4B5E 8234CB33
-4B5F 8234CB34
-4B60 8234CB35
-4B61 8234CB36
-4B62 8234CB37
-4B63 8234CB38
-4B64 8234CB39
-4B65 8234CC30
-4B66 8234CC31
-4B67 8234CC32
-4B68 8234CC33
-4B69 8234CC34
-4B6A 8234CC35
-4B6B 8234CC36
-4B6C 8234CC37
-4B6D 8234CC38
-4B6E 8234CC39
-4B6F 8234CD30
-4B70 8234CD31
-4B71 8234CD32
-4B72 8234CD33
-4B73 8234CD34
-4B74 8234CD35
-4B75 8234CD36
-4B76 8234CD37
-4B77 8234CD38
-4B78 8234CD39
-4B79 8234CE30
-4B7A 8234CE31
-4B7B 8234CE32
-4B7C 8234CE33
-4B7D 8234CE34
-4B7E 8234CE35
-4B7F 8234CE36
-4B80 8234CE37
-4B81 8234CE38
-4B82 8234CE39
-4B83 8234CF30
-4B84 8234CF31
-4B85 8234CF32
-4B86 8234CF33
-4B87 8234CF34
-4B88 8234CF35
-4B89 8234CF36
-4B8A 8234CF37
-4B8B 8234CF38
-4B8C 8234CF39
-4B8D 8234D030
-4B8E 8234D031
-4B8F 8234D032
-4B90 8234D033
-4B91 8234D034
-4B92 8234D035
-4B93 8234D036
-4B94 8234D037
-4B95 8234D038
-4B96 8234D039
-4B97 8234D130
-4B98 8234D131
-4B99 8234D132
-4B9A 8234D133
-4B9B 8234D134
-4B9C 8234D135
-4B9D 8234D136
-4B9E 8234D137
-4B9F 8234D138
-4BA0 8234D139
-4BA1 8234D230
-4BA2 8234D231
-4BA3 8234D232
-4BA4 8234D233
-4BA5 8234D234
-4BA6 8234D235
-4BA7 8234D236
-4BA8 8234D237
-4BA9 8234D238
-4BAA 8234D239
-4BAB 8234D330
-4BAC 8234D331
-4BAD 8234D332
-4BAE 8234D333
-4BAF 8234D334
-4BB0 8234D335
-4BB1 8234D336
-4BB2 8234D337
-4BB3 8234D338
-4BB4 8234D339
-4BB5 8234D430
-4BB6 8234D431
-4BB7 8234D432
-4BB8 8234D433
-4BB9 8234D434
-4BBA 8234D435
-4BBB 8234D436
-4BBC 8234D437
-4BBD 8234D438
-4BBE 8234D439
-4BBF 8234D530
-4BC0 8234D531
-4BC1 8234D532
-4BC2 8234D533
-4BC3 8234D534
-4BC4 8234D535
-4BC5 8234D536
-4BC6 8234D537
-4BC7 8234D538
-4BC8 8234D539
-4BC9 8234D630
-4BCA 8234D631
-4BCB 8234D632
-4BCC 8234D633
-4BCD 8234D634
-4BCE 8234D635
-4BCF 8234D636
-4BD0 8234D637
-4BD1 8234D638
-4BD2 8234D639
-4BD3 8234D730
-4BD4 8234D731
-4BD5 8234D732
-4BD6 8234D733
-4BD7 8234D734
-4BD8 8234D735
-4BD9 8234D736
-4BDA 8234D737
-4BDB 8234D738
-4BDC 8234D739
-4BDD 8234D830
-4BDE 8234D831
-4BDF 8234D832
-4BE0 8234D833
-4BE1 8234D834
-4BE2 8234D835
-4BE3 8234D836
-4BE4 8234D837
-4BE5 8234D838
-4BE6 8234D839
-4BE7 8234D930
-4BE8 8234D931
-4BE9 8234D932
-4BEA 8234D933
-4BEB 8234D934
-4BEC 8234D935
-4BED 8234D936
-4BEE 8234D937
-4BEF 8234D938
-4BF0 8234D939
-4BF1 8234DA30
-4BF2 8234DA31
-4BF3 8234DA32
-4BF4 8234DA33
-4BF5 8234DA34
-4BF6 8234DA35
-4BF7 8234DA36
-4BF8 8234DA37
-4BF9 8234DA38
-4BFA 8234DA39
-4BFB 8234DB30
-4BFC 8234DB31
-4BFD 8234DB32
-4BFE 8234DB33
-4BFF 8234DB34
-4C00 8234DB35
-4C01 8234DB36
-4C02 8234DB37
-4C03 8234DB38
-4C04 8234DB39
-4C05 8234DC30
-4C06 8234DC31
-4C07 8234DC32
-4C08 8234DC33
-4C09 8234DC34
-4C0A 8234DC35
-4C0B 8234DC36
-4C0C 8234DC37
-4C0D 8234DC38
-4C0E 8234DC39
-4C0F 8234DD30
-4C10 8234DD31
-4C11 8234DD32
-4C12 8234DD33
-4C13 8234DD34
-4C14 8234DD35
-4C15 8234DD36
-4C16 8234DD37
-4C17 8234DD38
-4C18 8234DD39
-4C19 8234DE30
-4C1A 8234DE31
-4C1B 8234DE32
-4C1C 8234DE33
-4C1D 8234DE34
-4C1E 8234DE35
-4C1F 8234DE36
-4C20 8234DE37
-4C21 8234DE38
-4C22 8234DE39
-4C23 8234DF30
-4C24 8234DF31
-4C25 8234DF32
-4C26 8234DF33
-4C27 8234DF34
-4C28 8234DF35
-4C29 8234DF36
-4C2A 8234DF37
-4C2B 8234DF38
-4C2C 8234DF39
-4C2D 8234E030
-4C2E 8234E031
-4C2F 8234E032
-4C30 8234E033
-4C31 8234E034
-4C32 8234E035
-4C33 8234E036
-4C34 8234E037
-4C35 8234E038
-4C36 8234E039
-4C37 8234E130
-4C38 8234E131
-4C39 8234E132
-4C3A 8234E133
-4C3B 8234E134
-4C3C 8234E135
-4C3D 8234E136
-4C3E 8234E137
-4C3F 8234E138
-4C40 8234E139
-4C41 8234E230
-4C42 8234E231
-4C43 8234E232
-4C44 8234E233
-4C45 8234E234
-4C46 8234E235
-4C47 8234E236
-4C48 8234E237
-4C49 8234E238
-4C4A 8234E239
-4C4B 8234E330
-4C4C 8234E331
-4C4D 8234E332
-4C4E 8234E333
-4C4F 8234E334
-4C50 8234E335
-4C51 8234E336
-4C52 8234E337
-4C53 8234E338
-4C54 8234E339
-4C55 8234E430
-4C56 8234E431
-4C57 8234E432
-4C58 8234E433
-4C59 8234E434
-4C5A 8234E435
-4C5B 8234E436
-4C5C 8234E437
-4C5D 8234E438
-4C5E 8234E439
-4C5F 8234E530
-4C60 8234E531
-4C61 8234E532
-4C62 8234E533
-4C63 8234E534
-4C64 8234E535
-4C65 8234E536
-4C66 8234E537
-4C67 8234E538
-4C68 8234E539
-4C69 8234E630
-4C6A 8234E631
-4C6B 8234E632
-4C6C 8234E633
-4C6D 8234E634
-4C6E 8234E635
-4C6F 8234E636
-4C70 8234E637
-4C71 8234E638
-4C72 8234E639
-4C73 8234E730
-4C74 8234E731
-4C75 8234E732
-4C76 8234E733
-4C77 FE96
-4C78 8234E734
-4C79 8234E735
-4C7A 8234E736
-4C7B 8234E737
-4C7C 8234E738
-4C7D 8234E739
-4C7E 8234E830
-4C7F 8234E831
-4C80 8234E832
-4C81 8234E833
-4C82 8234E834
-4C83 8234E835
-4C84 8234E836
-4C85 8234E837
-4C86 8234E838
-4C87 8234E839
-4C88 8234E930
-4C89 8234E931
-4C8A 8234E932
-4C8B 8234E933
-4C8C 8234E934
-4C8D 8234E935
-4C8E 8234E936
-4C8F 8234E937
-4C90 8234E938
-4C91 8234E939
-4C92 8234EA30
-4C93 8234EA31
-4C94 8234EA32
-4C95 8234EA33
-4C96 8234EA34
-4C97 8234EA35
-4C98 8234EA36
-4C99 8234EA37
-4C9A 8234EA38
-4C9B 8234EA39
-4C9C 8234EB30
-4C9D 8234EB31
-4C9E 8234EB32
-4C9F FE93
-4CA0 FE94
-4CA1 FE95
-4CA2 FE97
-4CA3 FE92
-4CA4 8234EB33
-4CA5 8234EB34
-4CA6 8234EB35
-4CA7 8234EB36
-4CA8 8234EB37
-4CA9 8234EB38
-4CAA 8234EB39
-4CAB 8234EC30
-4CAC 8234EC31
-4CAD 8234EC32
-4CAE 8234EC33
-4CAF 8234EC34
-4CB0 8234EC35
-4CB1 8234EC36
-4CB2 8234EC37
-4CB3 8234EC38
-4CB4 8234EC39
-4CB5 8234ED30
-4CB6 8234ED31
-4CB7 8234ED32
-4CB8 8234ED33
-4CB9 8234ED34
-4CBA 8234ED35
-4CBB 8234ED36
-4CBC 8234ED37
-4CBD 8234ED38
-4CBE 8234ED39
-4CBF 8234EE30
-4CC0 8234EE31
-4CC1 8234EE32
-4CC2 8234EE33
-4CC3 8234EE34
-4CC4 8234EE35
-4CC5 8234EE36
-4CC6 8234EE37
-4CC7 8234EE38
-4CC8 8234EE39
-4CC9 8234EF30
-4CCA 8234EF31
-4CCB 8234EF32
-4CCC 8234EF33
-4CCD 8234EF34
-4CCE 8234EF35
-4CCF 8234EF36
-4CD0 8234EF37
-4CD1 8234EF38
-4CD2 8234EF39
-4CD3 8234F030
-4CD4 8234F031
-4CD5 8234F032
-4CD6 8234F033
-4CD7 8234F034
-4CD8 8234F035
-4CD9 8234F036
-4CDA 8234F037
-4CDB 8234F038
-4CDC 8234F039
-4CDD 8234F130
-4CDE 8234F131
-4CDF 8234F132
-4CE0 8234F133
-4CE1 8234F134
-4CE2 8234F135
-4CE3 8234F136
-4CE4 8234F137
-4CE5 8234F138
-4CE6 8234F139
-4CE7 8234F230
-4CE8 8234F231
-4CE9 8234F232
-4CEA 8234F233
-4CEB 8234F234
-4CEC 8234F235
-4CED 8234F236
-4CEE 8234F237
-4CEF 8234F238
-4CF0 8234F239
-4CF1 8234F330
-4CF2 8234F331
-4CF3 8234F332
-4CF4 8234F333
-4CF5 8234F334
-4CF6 8234F335
-4CF7 8234F336
-4CF8 8234F337
-4CF9 8234F338
-4CFA 8234F339
-4CFB 8234F430
-4CFC 8234F431
-4CFD 8234F432
-4CFE 8234F433
-4CFF 8234F434
-4D00 8234F435
-4D01 8234F436
-4D02 8234F437
-4D03 8234F438
-4D04 8234F439
-4D05 8234F530
-4D06 8234F531
-4D07 8234F532
-4D08 8234F533
-4D09 8234F534
-4D0A 8234F535
-4D0B 8234F536
-4D0C 8234F537
-4D0D 8234F538
-4D0E 8234F539
-4D0F 8234F630
-4D10 8234F631
-4D11 8234F632
-4D12 8234F633
-4D13 FE98
-4D14 FE99
-4D15 FE9A
-4D16 FE9B
-4D17 FE9C
-4D18 FE9D
-4D19 FE9E
-4D1A 8234F634
-4D1B 8234F635
-4D1C 8234F636
-4D1D 8234F637
-4D1E 8234F638
-4D1F 8234F639
-4D20 8234F730
-4D21 8234F731
-4D22 8234F732
-4D23 8234F733
-4D24 8234F734
-4D25 8234F735
-4D26 8234F736
-4D27 8234F737
-4D28 8234F738
-4D29 8234F739
-4D2A 8234F830
-4D2B 8234F831
-4D2C 8234F832
-4D2D 8234F833
-4D2E 8234F834
-4D2F 8234F835
-4D30 8234F836
-4D31 8234F837
-4D32 8234F838
-4D33 8234F839
-4D34 8234F930
-4D35 8234F931
-4D36 8234F932
-4D37 8234F933
-4D38 8234F934
-4D39 8234F935
-4D3A 8234F936
-4D3B 8234F937
-4D3C 8234F938
-4D3D 8234F939
-4D3E 8234FA30
-4D3F 8234FA31
-4D40 8234FA32
-4D41 8234FA33
-4D42 8234FA34
-4D43 8234FA35
-4D44 8234FA36
-4D45 8234FA37
-4D46 8234FA38
-4D47 8234FA39
-4D48 8234FB30
-4D49 8234FB31
-4D4A 8234FB32
-4D4B 8234FB33
-4D4C 8234FB34
-4D4D 8234FB35
-4D4E 8234FB36
-4D4F 8234FB37
-4D50 8234FB38
-4D51 8234FB39
-4D52 8234FC30
-4D53 8234FC31
-4D54 8234FC32
-4D55 8234FC33
-4D56 8234FC34
-4D57 8234FC35
-4D58 8234FC36
-4D59 8234FC37
-4D5A 8234FC38
-4D5B 8234FC39
-4D5C 8234FD30
-4D5D 8234FD31
-4D5E 8234FD32
-4D5F 8234FD33
-4D60 8234FD34
-4D61 8234FD35
-4D62 8234FD36
-4D63 8234FD37
-4D64 8234FD38
-4D65 8234FD39
-4D66 8234FE30
-4D67 8234FE31
-4D68 8234FE32
-4D69 8234FE33
-4D6A 8234FE34
-4D6B 8234FE35
-4D6C 8234FE36
-4D6D 8234FE37
-4D6E 8234FE38
-4D6F 8234FE39
-4D70 82358130
-4D71 82358131
-4D72 82358132
-4D73 82358133
-4D74 82358134
-4D75 82358135
-4D76 82358136
-4D77 82358137
-4D78 82358138
-4D79 82358139
-4D7A 82358230
-4D7B 82358231
-4D7C 82358232
-4D7D 82358233
-4D7E 82358234
-4D7F 82358235
-4D80 82358236
-4D81 82358237
-4D82 82358238
-4D83 82358239
-4D84 82358330
-4D85 82358331
-4D86 82358332
-4D87 82358333
-4D88 82358334
-4D89 82358335
-4D8A 82358336
-4D8B 82358337
-4D8C 82358338
-4D8D 82358339
-4D8E 82358430
-4D8F 82358431
-4D90 82358432
-4D91 82358433
-4D92 82358434
-4D93 82358435
-4D94 82358436
-4D95 82358437
-4D96 82358438
-4D97 82358439
-4D98 82358530
-4D99 82358531
-4D9A 82358532
-4D9B 82358533
-4D9C 82358534
-4D9D 82358535
-4D9E 82358536
-4D9F 82358537
-4DA0 82358538
-4DA1 82358539
-4DA2 82358630
-4DA3 82358631
-4DA4 82358632
-4DA5 82358633
-4DA6 82358634
-4DA7 82358635
-4DA8 82358636
-4DA9 82358637
-4DAA 82358638
-4DAB 82358639
-4DAC 82358730
-4DAD 82358731
-4DAE FE9F
-4DAF 82358732
-4DB0 82358733
-4DB1 82358734
-4DB2 82358735
-4DB3 82358736
-4DB4 82358737
-4DB5 82358738
-4DB6 82358739
-4DB7 82358830
-4DB8 82358831
-4DB9 82358832
-4DBA 82358833
-4DBB 82358834
-4DBC 82358835
-4DBD 82358836
-4DBE 82358837
-4DBF 82358838
-4DC0 82358839
-4DC1 82358930
-4DC2 82358931
-4DC3 82358932
-4DC4 82358933
-4DC5 82358934
-4DC6 82358935
-4DC7 82358936
-4DC8 82358937
-4DC9 82358938
-4DCA 82358939
-4DCB 82358A30
-4DCC 82358A31
-4DCD 82358A32
-4DCE 82358A33
-4DCF 82358A34
-4DD0 82358A35
-4DD1 82358A36
-4DD2 82358A37
-4DD3 82358A38
-4DD4 82358A39
-4DD5 82358B30
-4DD6 82358B31
-4DD7 82358B32
-4DD8 82358B33
-4DD9 82358B34
-4DDA 82358B35
-4DDB 82358B36
-4DDC 82358B37
-4DDD 82358B38
-4DDE 82358B39
-4DDF 82358C30
-4DE0 82358C31
-4DE1 82358C32
-4DE2 82358C33
-4DE3 82358C34
-4DE4 82358C35
-4DE5 82358C36
-4DE6 82358C37
-4DE7 82358C38
-4DE8 82358C39
-4DE9 82358D30
-4DEA 82358D31
-4DEB 82358D32
-4DEC 82358D33
-4DED 82358D34
-4DEE 82358D35
-4DEF 82358D36
-4DF0 82358D37
-4DF1 82358D38
-4DF2 82358D39
-4DF3 82358E30
-4DF4 82358E31
-4DF5 82358E32
-4DF6 82358E33
-4DF7 82358E34
-4DF8 82358E35
-4DF9 82358E36
-4DFA 82358E37
-4DFB 82358E38
-4DFC 82358E39
-4DFD 82358F30
-4DFE 82358F31
-4DFF 82358F32
-4E00 D2BB
-4E01 B6A1
-4E02 8140
-4E03 C6DF
-4E04 8141
-4E05 8142
-4E06 8143
-4E07 CDF2
-4E08 D5C9
-4E09 C8FD
-4E0A C9CF
-4E0B CFC2
-4E0C D8A2
-4E0D B2BB
-4E0E D3EB
-4E0F 8144
-4E10 D8A4
-4E11 B3F3
-4E12 8145
-4E13 D7A8
-4E14 C7D2
-4E15 D8A7
-4E16 CAC0
-4E17 8146
-4E18 C7F0
-4E19 B1FB
-4E1A D2B5
-4E1B B4D4
-4E1C B6AB
-4E1D CBBF
-4E1E D8A9
-4E1F 8147
-4E20 8148
-4E21 8149
-4E22 B6AA
-4E23 814A
-4E24 C1BD
-4E25 D1CF
-4E26 814B
-4E27 C9A5
-4E28 D8AD
-4E29 814C
-4E2A B8F6
-4E2B D1BE
-4E2C E3DC
-4E2D D6D0
-4E2E 814D
-4E2F 814E
-4E30 B7E1
-4E31 814F
-4E32 B4AE
-4E33 8150
-4E34 C1D9
-4E35 8151
-4E36 D8BC
-4E37 8152
-4E38 CDE8
-4E39 B5A4
-4E3A CEAA
-4E3B D6F7
-4E3C 8153
-4E3D C0F6
-4E3E BED9
-4E3F D8AF
-4E40 8154
-4E41 8155
-4E42 8156
-4E43 C4CB
-4E44 8157
-4E45 BEC3
-4E46 8158
-4E47 D8B1
-4E48 C3B4
-4E49 D2E5
-4E4A 8159
-4E4B D6AE
-4E4C CEDA
-4E4D D5A7
-4E4E BAF5
-4E4F B7A6
-4E50 C0D6
-4E51 815A
-4E52 C6B9
-4E53 C5D2
-4E54 C7C7
-4E55 815B
-4E56 B9D4
-4E57 815C
-4E58 B3CB
-4E59 D2D2
-4E5A 815D
-4E5B 815E
-4E5C D8BF
-4E5D BEC5
-4E5E C6F2
-4E5F D2B2
-4E60 CFB0
-4E61 CFE7
-4E62 815F
-4E63 8160
-4E64 8161
-4E65 8162
-4E66 CAE9
-4E67 8163
-4E68 8164
-4E69 D8C0
-4E6A 8165
-4E6B 8166
-4E6C 8167
-4E6D 8168
-4E6E 8169
-4E6F 816A
-4E70 C2F2
-4E71 C2D2
-4E72 816B
-4E73 C8E9
-4E74 816C
-4E75 816D
-4E76 816E
-4E77 816F
-4E78 8170
-4E79 8171
-4E7A 8172
-4E7B 8173
-4E7C 8174
-4E7D 8175
-4E7E C7AC
-4E7F 8176
-4E80 8177
-4E81 8178
-4E82 8179
-4E83 817A
-4E84 817B
-4E85 817C
-4E86 C1CB
-4E87 817D
-4E88 D3E8
-4E89 D5F9
-4E8A 817E
-4E8B CAC2
-4E8C B6FE
-4E8D D8A1
-4E8E D3DA
-4E8F BFF7
-4E90 8180
-4E91 D4C6
-4E92 BBA5
-4E93 D8C1
-4E94 CEE5
-4E95 BEAE
-4E96 8181
-4E97 8182
-4E98 D8A8
-4E99 8183
-4E9A D1C7
-4E9B D0A9
-4E9C 8184
-4E9D 8185
-4E9E 8186
-4E9F D8BD
-4EA0 D9EF
-4EA1 CDF6
-4EA2 BFBA
-4EA3 8187
-4EA4 BDBB
-4EA5 BAA5
-4EA6 D2E0
-4EA7 B2FA
-4EA8 BAE0
-4EA9 C4B6
-4EAA 8188
-4EAB CFED
-4EAC BEA9
-4EAD CDA4
-4EAE C1C1
-4EAF 8189
-4EB0 818A
-4EB1 818B
-4EB2 C7D7
-4EB3 D9F1
-4EB4 818C
-4EB5 D9F4
-4EB6 818D
-4EB7 818E
-4EB8 818F
-4EB9 8190
-4EBA C8CB
-4EBB D8E9
-4EBC 8191
-4EBD 8192
-4EBE 8193
-4EBF D2DA
-4EC0 CAB2
-4EC1 C8CA
-4EC2 D8EC
-4EC3 D8EA
-4EC4 D8C6
-4EC5 BDF6
-4EC6 C6CD
-4EC7 B3F0
-4EC8 8194
-4EC9 D8EB
-4ECA BDF1
-4ECB BDE9
-4ECC 8195
-4ECD C8D4
-4ECE B4D3
-4ECF 8196
-4ED0 8197
-4ED1 C2D8
-4ED2 8198
-4ED3 B2D6
-4ED4 D7D0
-4ED5 CACB
-4ED6 CBFB
-4ED7 D5CC
-4ED8 B8B6
-4ED9 CFC9
-4EDA 8199
-4EDB 819A
-4EDC 819B
-4EDD D9DA
-4EDE D8F0
-4EDF C7AA
-4EE0 819C
-4EE1 D8EE
-4EE2 819D
-4EE3 B4FA
-4EE4 C1EE
-4EE5 D2D4
-4EE6 819E
-4EE7 819F
-4EE8 D8ED
-4EE9 81A0
-4EEA D2C7
-4EEB D8EF
-4EEC C3C7
-4EED 81A1
-4EEE 81A2
-4EEF 81A3
-4EF0 D1F6
-4EF1 81A4
-4EF2 D6D9
-4EF3 D8F2
-4EF4 81A5
-4EF5 D8F5
-4EF6 BCFE
-4EF7 BCDB
-4EF8 81A6
-4EF9 81A7
-4EFA 81A8
-4EFB C8CE
-4EFC 81A9
-4EFD B7DD
-4EFE 81AA
-4EFF B7C2
-4F00 81AB
-4F01 C6F3
-4F02 81AC
-4F03 81AD
-4F04 81AE
-4F05 81AF
-4F06 81B0
-4F07 81B1
-4F08 81B2
-4F09 D8F8
-4F0A D2C1
-4F0B 81B3
-4F0C 81B4
-4F0D CEE9
-4F0E BCBF
-4F0F B7FC
-4F10 B7A5
-4F11 D0DD
-4F12 81B5
-4F13 81B6
-4F14 81B7
-4F15 81B8
-4F16 81B9
-4F17 D6DA
-4F18 D3C5
-4F19 BBEF
-4F1A BBE1
-4F1B D8F1
-4F1C 81BA
-4F1D 81BB
-4F1E C9A1
-4F1F CEB0
-4F20 B4AB
-4F21 81BC
-4F22 D8F3
-4F23 81BD
-4F24 C9CB
-4F25 D8F6
-4F26 C2D7
-4F27 D8F7
-4F28 81BE
-4F29 81BF
-4F2A CEB1
-4F2B D8F9
-4F2C 81C0
-4F2D 81C1
-4F2E 81C2
-4F2F B2AE
-4F30 B9C0
-4F31 81C3
-4F32 D9A3
-4F33 81C4
-4F34 B0E9
-4F35 81C5
-4F36 C1E6
-4F37 81C6
-4F38 C9EC
-4F39 81C7
-4F3A CBC5
-4F3B 81C8
-4F3C CBC6
-4F3D D9A4
-4F3E 81C9
-4F3F 81CA
-4F40 81CB
-4F41 81CC
-4F42 81CD
-4F43 B5E8
-4F44 81CE
-4F45 81CF
-4F46 B5AB
-4F47 81D0
-4F48 81D1
-4F49 81D2
-4F4A 81D3
-4F4B 81D4
-4F4C 81D5
-4F4D CEBB
-4F4E B5CD
-4F4F D7A1
-4F50 D7F4
-4F51 D3D3
-4F52 81D6
-4F53 CCE5
-4F54 81D7
-4F55 BACE
-4F56 81D8
-4F57 D9A2
-4F58 D9DC
-4F59 D3E0
-4F5A D8FD
-4F5B B7F0
-4F5C D7F7
-4F5D D8FE
-4F5E D8FA
-4F5F D9A1
-4F60 C4E3
-4F61 81D9
-4F62 81DA
-4F63 D3B6
-4F64 D8F4
-4F65 D9DD
-4F66 81DB
-4F67 D8FB
-4F68 81DC
-4F69 C5E5
-4F6A 81DD
-4F6B 81DE
-4F6C C0D0
-4F6D 81DF
-4F6E 81E0
-4F6F D1F0
-4F70 B0DB
-4F71 81E1
-4F72 81E2
-4F73 BCD1
-4F74 D9A6
-4F75 81E3
-4F76 D9A5
-4F77 81E4
-4F78 81E5
-4F79 81E6
-4F7A 81E7
-4F7B D9AC
-4F7C D9AE
-4F7D 81E8
-4F7E D9AB
-4F7F CAB9
-4F80 81E9
-4F81 81EA
-4F82 81EB
-4F83 D9A9
-4F84 D6B6
-4F85 81EC
-4F86 81ED
-4F87 81EE
-4F88 B3DE
-4F89 D9A8
-4F8A 81EF
-4F8B C0FD
-4F8C 81F0
-4F8D CACC
-4F8E 81F1
-4F8F D9AA
-4F90 81F2
-4F91 D9A7
-4F92 81F3
-4F93 81F4
-4F94 D9B0
-4F95 81F5
-4F96 81F6
-4F97 B6B1
-4F98 81F7
-4F99 81F8
-4F9A 81F9
-4F9B B9A9
-4F9C 81FA
-4F9D D2C0
-4F9E 81FB
-4F9F 81FC
-4FA0 CFC0
-4FA1 81FD
-4FA2 81FE
-4FA3 C2C2
-4FA4 8240
-4FA5 BDC4
-4FA6 D5EC
-4FA7 B2E0
-4FA8 C7C8
-4FA9 BFEB
-4FAA D9AD
-4FAB 8241
-4FAC D9AF
-4FAD 8242
-4FAE CEEA
-4FAF BAEE
-4FB0 8243
-4FB1 8244
-4FB2 8245
-4FB3 8246
-4FB4 8247
-4FB5 C7D6
-4FB6 8248
-4FB7 8249
-4FB8 824A
-4FB9 824B
-4FBA 824C
-4FBB 824D
-4FBC 824E
-4FBD 824F
-4FBE 8250
-4FBF B1E3
-4FC0 8251
-4FC1 8252
-4FC2 8253
-4FC3 B4D9
-4FC4 B6ED
-4FC5 D9B4
-4FC6 8254
-4FC7 8255
-4FC8 8256
-4FC9 8257
-4FCA BFA1
-4FCB 8258
-4FCC 8259
-4FCD 825A
-4FCE D9DE
-4FCF C7CE
-4FD0 C0FE
-4FD1 D9B8
-4FD2 825B
-4FD3 825C
-4FD4 825D
-4FD5 825E
-4FD6 825F
-4FD7 CBD7
-4FD8 B7FD
-4FD9 8260
-4FDA D9B5
-4FDB 8261
-4FDC D9B7
-4FDD B1A3
-4FDE D3E1
-4FDF D9B9
-4FE0 8262
-4FE1 D0C5
-4FE2 8263
-4FE3 D9B6
-4FE4 8264
-4FE5 8265
-4FE6 D9B1
-4FE7 8266
-4FE8 D9B2
-4FE9 C1A9
-4FEA D9B3
-4FEB 8267
-4FEC 8268
-4FED BCF3
-4FEE D0DE
-4FEF B8A9
-4FF0 8269
-4FF1 BEE3
-4FF2 826A
-4FF3 D9BD
-4FF4 826B
-4FF5 826C
-4FF6 826D
-4FF7 826E
-4FF8 D9BA
-4FF9 826F
-4FFA B0B3
-4FFB 8270
-4FFC 8271
-4FFD 8272
-4FFE D9C2
-4FFF 8273
-5000 8274
-5001 8275
-5002 8276
-5003 8277
-5004 8278
-5005 8279
-5006 827A
-5007 827B
-5008 827C
-5009 827D
-500A 827E
-500B 8280
-500C D9C4
-500D B1B6
-500E 8281
-500F D9BF
-5010 8282
-5011 8283
-5012 B5B9
-5013 8284
-5014 BEF3
-5015 8285
-5016 8286
-5017 8287
-5018 CCC8
-5019 BAF2
-501A D2D0
-501B 8288
-501C D9C3
-501D 8289
-501E 828A
-501F BDE8
-5020 828B
-5021 B3AB
-5022 828C
-5023 828D
-5024 828E
-5025 D9C5
-5026 BEEB
-5027 828F
-5028 D9C6
-5029 D9BB
-502A C4DF
-502B 8290
-502C D9BE
-502D D9C1
-502E D9C0
-502F 8291
-5030 8292
-5031 8293
-5032 8294
-5033 8295
-5034 8296
-5035 8297
-5036 8298
-5037 8299
-5038 829A
-5039 829B
-503A D5AE
-503B 829C
-503C D6B5
-503D 829D
-503E C7E3
-503F 829E
-5040 829F
-5041 82A0
-5042 82A1
-5043 D9C8
-5044 82A2
-5045 82A3
-5046 82A4
-5047 BCD9
-5048 D9CA
-5049 82A5
-504A 82A6
-504B 82A7
-504C D9BC
-504D 82A8
-504E D9CB
-504F C6AB
-5050 82A9
-5051 82AA
-5052 82AB
-5053 82AC
-5054 82AD
-5055 D9C9
-5056 82AE
-5057 82AF
-5058 82B0
-5059 82B1
-505A D7F6
-505B 82B2
-505C CDA3
-505D 82B3
-505E 82B4
-505F 82B5
-5060 82B6
-5061 82B7
-5062 82B8
-5063 82B9
-5064 82BA
-5065 BDA1
-5066 82BB
-5067 82BC
-5068 82BD
-5069 82BE
-506A 82BF
-506B 82C0
-506C D9CC
-506D 82C1
-506E 82C2
-506F 82C3
-5070 82C4
-5071 82C5
-5072 82C6
-5073 82C7
-5074 82C8
-5075 82C9
-5076 C5BC
-5077 CDB5
-5078 82CA
-5079 82CB
-507A 82CC
-507B D9CD
-507C 82CD
-507D 82CE
-507E D9C7
-507F B3A5
-5080 BFFE
-5081 82CF
-5082 82D0
-5083 82D1
-5084 82D2
-5085 B8B5
-5086 82D3
-5087 82D4
-5088 C0FC
-5089 82D5
-508A 82D6
-508B 82D7
-508C 82D8
-508D B0F8
-508E 82D9
-508F 82DA
-5090 82DB
-5091 82DC
-5092 82DD
-5093 82DE
-5094 82DF
-5095 82E0
-5096 82E1
-5097 82E2
-5098 82E3
-5099 82E4
-509A 82E5
-509B 82E6
-509C 82E7
-509D 82E8
-509E 82E9
-509F 82EA
-50A0 82EB
-50A1 82EC
-50A2 82ED
-50A3 B4F6
-50A4 82EE
-50A5 D9CE
-50A6 82EF
-50A7 D9CF
-50A8 B4A2
-50A9 D9D0
-50AA 82F0
-50AB 82F1
-50AC B4DF
-50AD 82F2
-50AE 82F3
-50AF 82F4
-50B0 82F5
-50B1 82F6
-50B2 B0C1
-50B3 82F7
-50B4 82F8
-50B5 82F9
-50B6 82FA
-50B7 82FB
-50B8 82FC
-50B9 82FD
-50BA D9D1
-50BB C9B5
-50BC 82FE
-50BD 8340
-50BE 8341
-50BF 8342
-50C0 8343
-50C1 8344
-50C2 8345
-50C3 8346
-50C4 8347
-50C5 8348
-50C6 8349
-50C7 834A
-50C8 834B
-50C9 834C
-50CA 834D
-50CB 834E
-50CC 834F
-50CD 8350
-50CE 8351
-50CF CFF1
-50D0 8352
-50D1 8353
-50D2 8354
-50D3 8355
-50D4 8356
-50D5 8357
-50D6 D9D2
-50D7 8358
-50D8 8359
-50D9 835A
-50DA C1C5
-50DB 835B
-50DC 835C
-50DD 835D
-50DE 835E
-50DF 835F
-50E0 8360
-50E1 8361
-50E2 8362
-50E3 8363
-50E4 8364
-50E5 8365
-50E6 D9D6
-50E7 C9AE
-50E8 8366
-50E9 8367
-50EA 8368
-50EB 8369
-50EC D9D5
-50ED D9D4
-50EE D9D7
-50EF 836A
-50F0 836B
-50F1 836C
-50F2 836D
-50F3 CBDB
-50F4 836E
-50F5 BDA9
-50F6 836F
-50F7 8370
-50F8 8371
-50F9 8372
-50FA 8373
-50FB C6A7
-50FC 8374
-50FD 8375
-50FE 8376
-50FF 8377
-5100 8378
-5101 8379
-5102 837A
-5103 837B
-5104 837C
-5105 837D
-5106 D9D3
-5107 D9D8
-5108 837E
-5109 8380
-510A 8381
-510B D9D9
-510C 8382
-510D 8383
-510E 8384
-510F 8385
-5110 8386
-5111 8387
-5112 C8E5
-5113 8388
-5114 8389
-5115 838A
-5116 838B
-5117 838C
-5118 838D
-5119 838E
-511A 838F
-511B 8390
-511C 8391
-511D 8392
-511E 8393
-511F 8394
-5120 8395
-5121 C0DC
-5122 8396
-5123 8397
-5124 8398
-5125 8399
-5126 839A
-5127 839B
-5128 839C
-5129 839D
-512A 839E
-512B 839F
-512C 83A0
-512D 83A1
-512E 83A2
-512F 83A3
-5130 83A4
-5131 83A5
-5132 83A6
-5133 83A7
-5134 83A8
-5135 83A9
-5136 83AA
-5137 83AB
-5138 83AC
-5139 83AD
-513A 83AE
-513B 83AF
-513C 83B0
-513D 83B1
-513E 83B2
-513F B6F9
-5140 D8A3
-5141 D4CA
-5142 83B3
-5143 D4AA
-5144 D0D6
-5145 B3E4
-5146 D5D7
-5147 83B4
-5148 CFC8
-5149 B9E2
-514A 83B5
-514B BFCB
-514C 83B6
-514D C3E2
-514E 83B7
-514F 83B8
-5150 83B9
-5151 B6D2
-5152 83BA
-5153 83BB
-5154 CDC3
-5155 D9EE
-5156 D9F0
-5157 83BC
-5158 83BD
-5159 83BE
-515A B5B3
-515B 83BF
-515C B6B5
-515D 83C0
-515E 83C1
-515F 83C2
-5160 83C3
-5161 83C4
-5162 BEA4
-5163 83C5
-5164 83C6
-5165 C8EB
-5166 83C7
-5167 83C8
-5168 C8AB
-5169 83C9
-516A 83CA
-516B B0CB
-516C B9AB
-516D C1F9
-516E D9E2
-516F 83CB
-5170 C0BC
-5171 B9B2
-5172 83CC
-5173 B9D8
-5174 D0CB
-5175 B1F8
-5176 C6E4
-5177 BEDF
-5178 B5E4
-5179 D7C8
-517A 83CD
-517B D1F8
-517C BCE6
-517D CADE
-517E 83CE
-517F 83CF
-5180 BCBD
-5181 D9E6
-5182 D8E7
-5183 83D0
-5184 83D1
-5185 C4DA
-5186 83D2
-5187 83D3
-5188 B8D4
-5189 C8BD
-518A 83D4
-518B 83D5
-518C B2E1
-518D D4D9
-518E 83D6
-518F 83D7
-5190 83D8
-5191 83D9
-5192 C3B0
-5193 83DA
-5194 83DB
-5195 C3E1
-5196 DAA2
-5197 C8DF
-5198 83DC
-5199 D0B4
-519A 83DD
-519B BEFC
-519C C5A9
-519D 83DE
-519E 83DF
-519F 83E0
-51A0 B9DA
-51A1 83E1
-51A2 DAA3
-51A3 83E2
-51A4 D4A9
-51A5 DAA4
-51A6 83E3
-51A7 83E4
-51A8 83E5
-51A9 83E6
-51AA 83E7
-51AB D9FB
-51AC B6AC
-51AD 83E8
-51AE 83E9
-51AF B7EB
-51B0 B1F9
-51B1 D9FC
-51B2 B3E5
-51B3 BEF6
-51B4 83EA
-51B5 BFF6
-51B6 D2B1
-51B7 C0E4
-51B8 83EB
-51B9 83EC
-51BA 83ED
-51BB B6B3
-51BC D9FE
-51BD D9FD
-51BE 83EE
-51BF 83EF
-51C0 BEBB
-51C1 83F0
-51C2 83F1
-51C3 83F2
-51C4 C6E0
-51C5 83F3
-51C6 D7BC
-51C7 DAA1
-51C8 83F4
-51C9 C1B9
-51CA 83F5
-51CB B5F2
-51CC C1E8
-51CD 83F6
-51CE 83F7
-51CF BCF5
-51D0 83F8
-51D1 B4D5
-51D2 83F9
-51D3 83FA
-51D4 83FB
-51D5 83FC
-51D6 83FD
-51D7 83FE
-51D8 8440
-51D9 8441
-51DA 8442
-51DB C1DD
-51DC 8443
-51DD C4FD
-51DE 8444
-51DF 8445
-51E0 BCB8
-51E1 B7B2
-51E2 8446
-51E3 8447
-51E4 B7EF
-51E5 8448
-51E6 8449
-51E7 844A
-51E8 844B
-51E9 844C
-51EA 844D
-51EB D9EC
-51EC 844E
-51ED C6BE
-51EE 844F
-51EF BFAD
-51F0 BBCB
-51F1 8450
-51F2 8451
-51F3 B5CA
-51F4 8452
-51F5 DBC9
-51F6 D0D7
-51F7 8453
-51F8 CDB9
-51F9 B0BC
-51FA B3F6
-51FB BBF7
-51FC DBCA
-51FD BAAF
-51FE 8454
-51FF D4E4
-5200 B5B6
-5201 B5F3
-5202 D8D6
-5203 C8D0
-5204 8455
-5205 8456
-5206 B7D6
-5207 C7D0
-5208 D8D7
-5209 8457
-520A BFAF
-520B 8458
-520C 8459
-520D DBBB
-520E D8D8
-520F 845A
-5210 845B
-5211 D0CC
-5212 BBAE
-5213 845C
-5214 845D
-5215 845E
-5216 EBBE
-5217 C1D0
-5218 C1F5
-5219 D4F2
-521A B8D5
-521B B4B4
-521C 845F
-521D B3F5
-521E 8460
-521F 8461
-5220 C9BE
-5221 8462
-5222 8463
-5223 8464
-5224 C5D0
-5225 8465
-5226 8466
-5227 8467
-5228 C5D9
-5229 C0FB
-522A 8468
-522B B1F0
-522C 8469
-522D D8D9
-522E B9CE
-522F 846A
-5230 B5BD
-5231 846B
-5232 846C
-5233 D8DA
-5234 846D
-5235 846E
-5236 D6C6
-5237 CBA2
-5238 C8AF
-5239 C9B2
-523A B4CC
-523B BFCC
-523C 846F
-523D B9F4
-523E 8470
-523F D8DB
-5240 D8DC
-5241 B6E7
-5242 BCC1
-5243 CCEA
-5244 8471
-5245 8472
-5246 8473
-5247 8474
-5248 8475
-5249 8476
-524A CFF7
-524B 8477
-524C D8DD
-524D C7B0
-524E 8478
-524F 8479
-5250 B9D0
-5251 BDA3
-5252 847A
-5253 847B
-5254 CCDE
-5255 847C
-5256 C6CA
-5257 847D
-5258 847E
-5259 8480
-525A 8481
-525B 8482
-525C D8E0
-525D 8483
-525E D8DE
-525F 8484
-5260 8485
-5261 D8DF
-5262 8486
-5263 8487
-5264 8488
-5265 B0FE
-5266 8489
-5267 BEE7
-5268 848A
-5269 CAA3
-526A BCF4
-526B 848B
-526C 848C
-526D 848D
-526E 848E
-526F B8B1
-5270 848F
-5271 8490
-5272 B8EE
-5273 8491
-5274 8492
-5275 8493
-5276 8494
-5277 8495
-5278 8496
-5279 8497
-527A 8498
-527B 8499
-527C 849A
-527D D8E2
-527E 849B
-527F BDCB
-5280 849C
-5281 D8E4
-5282 D8E3
-5283 849D
-5284 849E
-5285 849F
-5286 84A0
-5287 84A1
-5288 C5FC
-5289 84A2
-528A 84A3
-528B 84A4
-528C 84A5
-528D 84A6
-528E 84A7
-528F 84A8
-5290 D8E5
-5291 84A9
-5292 84AA
-5293 D8E6
-5294 84AB
-5295 84AC
-5296 84AD
-5297 84AE
-5298 84AF
-5299 84B0
-529A 84B1
-529B C1A6
-529C 84B2
-529D C8B0
-529E B0EC
-529F B9A6
-52A0 BCD3
-52A1 CEF1
-52A2 DBBD
-52A3 C1D3
-52A4 84B3
-52A5 84B4
-52A6 84B5
-52A7 84B6
-52A8 B6AF
-52A9 D6FA
-52AA C5AC
-52AB BDD9
-52AC DBBE
-52AD DBBF
-52AE 84B7
-52AF 84B8
-52B0 84B9
-52B1 C0F8
-52B2 BEA2
-52B3 C0CD
-52B4 84BA
-52B5 84BB
-52B6 84BC
-52B7 84BD
-52B8 84BE
-52B9 84BF
-52BA 84C0
-52BB 84C1
-52BC 84C2
-52BD 84C3
-52BE DBC0
-52BF CAC6
-52C0 84C4
-52C1 84C5
-52C2 84C6
-52C3 B2AA
-52C4 84C7
-52C5 84C8
-52C6 84C9
-52C7 D3C2
-52C8 84CA
-52C9 C3E3
-52CA 84CB
-52CB D1AB
-52CC 84CC
-52CD 84CD
-52CE 84CE
-52CF 84CF
-52D0 DBC2
-52D1 84D0
-52D2 C0D5
-52D3 84D1
-52D4 84D2
-52D5 84D3
-52D6 DBC3
-52D7 84D4
-52D8 BFB1
-52D9 84D5
-52DA 84D6
-52DB 84D7
-52DC 84D8
-52DD 84D9
-52DE 84DA
-52DF C4BC
-52E0 84DB
-52E1 84DC
-52E2 84DD
-52E3 84DE
-52E4 C7DA
-52E5 84DF
-52E6 84E0
-52E7 84E1
-52E8 84E2
-52E9 84E3
-52EA 84E4
-52EB 84E5
-52EC 84E6
-52ED 84E7
-52EE 84E8
-52EF 84E9
-52F0 DBC4
-52F1 84EA
-52F2 84EB
-52F3 84EC
-52F4 84ED
-52F5 84EE
-52F6 84EF
-52F7 84F0
-52F8 84F1
-52F9 D9E8
-52FA C9D7
-52FB 84F2
-52FC 84F3
-52FD 84F4
-52FE B9B4
-52FF CEF0
-5300 D4C8
-5301 84F5
-5302 84F6
-5303 84F7
-5304 84F8
-5305 B0FC
-5306 B4D2
-5307 84F9
-5308 D0D9
-5309 84FA
-530A 84FB
-530B 84FC
-530C 84FD
-530D D9E9
-530E 84FE
-530F DECB
-5310 D9EB
-5311 8540
-5312 8541
-5313 8542
-5314 8543
-5315 D8B0
-5316 BBAF
-5317 B1B1
-5318 8544
-5319 B3D7
-531A D8CE
-531B 8545
-531C 8546
-531D D4D1
-531E 8547
-531F 8548
-5320 BDB3
-5321 BFEF
-5322 8549
-5323 CFBB
-5324 854A
-5325 854B
-5326 D8D0
-5327 854C
-5328 854D
-5329 854E
-532A B7CB
-532B 854F
-532C 8550
-532D 8551
-532E D8D1
-532F 8552
-5330 8553
-5331 8554
-5332 8555
-5333 8556
-5334 8557
-5335 8558
-5336 8559
-5337 855A
-5338 855B
-5339 C6A5
-533A C7F8
-533B D2BD
-533C 855C
-533D 855D
-533E D8D2
-533F C4E4
-5340 855E
-5341 CAAE
-5342 855F
-5343 C7A7
-5344 8560
-5345 D8A6
-5346 8561
-5347 C9FD
-5348 CEE7
-5349 BBDC
-534A B0EB
-534B 8562
-534C 8563
-534D 8564
-534E BBAA
-534F D0AD
-5350 8565
-5351 B1B0
-5352 D7E4
-5353 D7BF
-5354 8566
-5355 B5A5
-5356 C2F4
-5357 C4CF
-5358 8567
-5359 8568
-535A B2A9
-535B 8569
-535C B2B7
-535D 856A
-535E B1E5
-535F DFB2
-5360 D5BC
-5361 BFA8
-5362 C2AC
-5363 D8D5
-5364 C2B1
-5365 856B
-5366 D8D4
-5367 CED4
-5368 856C
-5369 DAE0
-536A 856D
-536B CEC0
-536C 856E
-536D 856F
-536E D8B4
-536F C3AE
-5370 D3A1
-5371 CEA3
-5372 8570
-5373 BCB4
-5374 C8B4
-5375 C2D1
-5376 8571
-5377 BEED
-5378 D0B6
-5379 8572
-537A DAE1
-537B 8573
-537C 8574
-537D 8575
-537E 8576
-537F C7E4
-5380 8577
-5381 8578
-5382 B3A7
-5383 8579
-5384 B6F2
-5385 CCFC
-5386 C0FA
-5387 857A
-5388 857B
-5389 C0F7
-538A 857C
-538B D1B9
-538C D1E1
-538D D8C7
-538E 857D
-538F 857E
-5390 8580
-5391 8581
-5392 8582
-5393 8583
-5394 8584
-5395 B2DE
-5396 8585
-5397 8586
-5398 C0E5
-5399 8587
-539A BAF1
-539B 8588
-539C 8589
-539D D8C8
-539E 858A
-539F D4AD
-53A0 858B
-53A1 858C
-53A2 CFE1
-53A3 D8C9
-53A4 858D
-53A5 D8CA
-53A6 CFC3
-53A7 858E
-53A8 B3F8
-53A9 BEC7
-53AA 858F
-53AB 8590
-53AC 8591
-53AD 8592
-53AE D8CB
-53AF 8593
-53B0 8594
-53B1 8595
-53B2 8596
-53B3 8597
-53B4 8598
-53B5 8599
-53B6 DBCC
-53B7 859A
-53B8 859B
-53B9 859C
-53BA 859D
-53BB C8A5
-53BC 859E
-53BD 859F
-53BE 85A0
-53BF CFD8
-53C0 85A1
-53C1 C8FE
-53C2 B2CE
-53C3 85A2
-53C4 85A3
-53C5 85A4
-53C6 85A5
-53C7 85A6
-53C8 D3D6
-53C9 B2E6
-53CA BCB0
-53CB D3D1
-53CC CBAB
-53CD B7B4
-53CE 85A7
-53CF 85A8
-53D0 85A9
-53D1 B7A2
-53D2 85AA
-53D3 85AB
-53D4 CAE5
-53D5 85AC
-53D6 C8A1
-53D7 CADC
-53D8 B1E4
-53D9 D0F0
-53DA 85AD
-53DB C5D1
-53DC 85AE
-53DD 85AF
-53DE 85B0
-53DF DBC5
-53E0 B5FE
-53E1 85B1
-53E2 85B2
-53E3 BFDA
-53E4 B9C5
-53E5 BEE4
-53E6 C1ED
-53E7 85B3
-53E8 DFB6
-53E9 DFB5
-53EA D6BB
-53EB BDD0
-53EC D5D9
-53ED B0C8
-53EE B6A3
-53EF BFC9
-53F0 CCA8
-53F1 DFB3
-53F2 CAB7
-53F3 D3D2
-53F4 85B4
-53F5 D8CF
-53F6 D2B6
-53F7 BAC5
-53F8 CBBE
-53F9 CCBE
-53FA 85B5
-53FB DFB7
-53FC B5F0
-53FD DFB4
-53FE 85B6
-53FF 85B7
-5400 85B8
-5401 D3F5
-5402 85B9
-5403 B3D4
-5404 B8F7
-5405 85BA
-5406 DFBA
-5407 85BB
-5408 BACF
-5409 BCAA
-540A B5F5
-540B 85BC
-540C CDAC
-540D C3FB
-540E BAF3
-540F C0F4
-5410 CDC2
-5411 CFF2
-5412 DFB8
-5413 CFC5
-5414 85BD
-5415 C2C0
-5416 DFB9
-5417 C2F0
-5418 85BE
-5419 85BF
-541A 85C0
-541B BEFD
-541C 85C1
-541D C1DF
-541E CDCC
-541F D2F7
-5420 B7CD
-5421 DFC1
-5422 85C2
-5423 DFC4
-5424 85C3
-5425 85C4
-5426 B7F1
-5427 B0C9
-5428 B6D6
-5429 B7D4
-542A 85C5
-542B BAAC
-542C CCFD
-542D BFD4
-542E CBB1
-542F C6F4
-5430 85C6
-5431 D6A8
-5432 DFC5
-5433 85C7
-5434 CEE2
-5435 B3B3
-5436 85C8
-5437 85C9
-5438 CEFC
-5439 B4B5
-543A 85CA
-543B CEC7
-543C BAF0
-543D 85CB
-543E CEE1
-543F 85CC
-5440 D1BD
-5441 85CD
-5442 85CE
-5443 DFC0
-5444 85CF
-5445 85D0
-5446 B4F4
-5447 85D1
-5448 B3CA
-5449 85D2
-544A B8E6
-544B DFBB
-544C 85D3
-544D 85D4
-544E 85D5
-544F 85D6
-5450 C4C5
-5451 85D7
-5452 DFBC
-5453 DFBD
-5454 DFBE
-5455 C5BB
-5456 DFBF
-5457 DFC2
-5458 D4B1
-5459 DFC3
-545A 85D8
-545B C7BA
-545C CED8
-545D 85D9
-545E 85DA
-545F 85DB
-5460 85DC
-5461 85DD
-5462 C4D8
-5463 85DE
-5464 DFCA
-5465 85DF
-5466 DFCF
-5467 85E0
-5468 D6DC
-5469 85E1
-546A 85E2
-546B 85E3
-546C 85E4
-546D 85E5
-546E 85E6
-546F 85E7
-5470 85E8
-5471 DFC9
-5472 DFDA
-5473 CEB6
-5474 85E9
-5475 BAC7
-5476 DFCE
-5477 DFC8
-5478 C5DE
-5479 85EA
-547A 85EB
-547B C9EB
-547C BAF4
-547D C3FC
-547E 85EC
-547F 85ED
-5480 BED7
-5481 85EE
-5482 DFC6
-5483 85EF
-5484 DFCD
-5485 85F0
-5486 C5D8
-5487 85F1
-5488 85F2
-5489 85F3
-548A 85F4
-548B D5A6
-548C BACD
-548D 85F5
-548E BECC
-548F D3BD
-5490 B8C0
-5491 85F6
-5492 D6E4
-5493 85F7
-5494 DFC7
-5495 B9BE
-5496 BFA7
-5497 85F8
-5498 85F9
-5499 C1FC
-549A DFCB
-549B DFCC
-549C 85FA
-549D DFD0
-549E 85FB
-549F 85FC
-54A0 85FD
-54A1 85FE
-54A2 8640
-54A3 DFDB
-54A4 DFE5
-54A5 8641
-54A6 DFD7
-54A7 DFD6
-54A8 D7C9
-54A9 DFE3
-54AA DFE4
-54AB E5EB
-54AC D2A7
-54AD DFD2
-54AE 8642
-54AF BFA9
-54B0 8643
-54B1 D4DB
-54B2 8644
-54B3 BFC8
-54B4 DFD4
-54B5 8645
-54B6 8646
-54B7 8647
-54B8 CFCC
-54B9 8648
-54BA 8649
-54BB DFDD
-54BC 864A
-54BD D1CA
-54BE 864B
-54BF DFDE
-54C0 B0A7
-54C1 C6B7
-54C2 DFD3
-54C3 864C
-54C4 BAE5
-54C5 864D
-54C6 B6DF
-54C7 CDDB
-54C8 B9FE
-54C9 D4D5
-54CA 864E
-54CB 864F
-54CC DFDF
-54CD CFEC
-54CE B0A5
-54CF DFE7
-54D0 DFD1
-54D1 D1C6
-54D2 DFD5
-54D3 DFD8
-54D4 DFD9
-54D5 DFDC
-54D6 8650
-54D7 BBA9
-54D8 8651
-54D9 DFE0
-54DA DFE1
-54DB 8652
-54DC DFE2
-54DD DFE6
-54DE DFE8
-54DF D3B4
-54E0 8653
-54E1 8654
-54E2 8655
-54E3 8656
-54E4 8657
-54E5 B8E7
-54E6 C5B6
-54E7 DFEA
-54E8 C9DA
-54E9 C1A8
-54EA C4C4
-54EB 8658
-54EC 8659
-54ED BFDE
-54EE CFF8
-54EF 865A
-54F0 865B
-54F1 865C
-54F2 D5DC
-54F3 DFEE
-54F4 865D
-54F5 865E
-54F6 865F
-54F7 8660
-54F8 8661
-54F9 8662
-54FA B2B8
-54FB 8663
-54FC BADF
-54FD DFEC
-54FE 8664
-54FF DBC1
-5500 8665
-5501 D1E4
-5502 8666
-5503 8667
-5504 8668
-5505 8669
-5506 CBF4
-5507 B4BD
-5508 866A
-5509 B0A6
-550A 866B
-550B 866C
-550C 866D
-550D 866E
-550E 866F
-550F DFF1
-5510 CCC6
-5511 DFF2
-5512 8670
-5513 8671
-5514 DFED
-5515 8672
-5516 8673
-5517 8674
-5518 8675
-5519 8676
-551A 8677
-551B DFE9
-551C 8678
-551D 8679
-551E 867A
-551F 867B
-5520 DFEB
-5521 867C
-5522 DFEF
-5523 DFF0
-5524 BBBD
-5525 867D
-5526 867E
-5527 DFF3
-5528 8680
-5529 8681
-552A DFF4
-552B 8682
-552C BBA3
-552D 8683
-552E CADB
-552F CEA8
-5530 E0A7
-5531 B3AA
-5532 8684
-5533 E0A6
-5534 8685
-5535 8686
-5536 8687
-5537 E0A1
-5538 8688
-5539 8689
-553A 868A
-553B 868B
-553C DFFE
-553D 868C
-553E CDD9
-553F DFFC
-5540 868D
-5541 DFFA
-5542 868E
-5543 BFD0
-5544 D7C4
-5545 868F
-5546 C9CC
-5547 8690
-5548 8691
-5549 DFF8
-554A B0A1
-554B 8692
-554C 8693
-554D 8694
-554E 8695
-554F 8696
-5550 DFFD
-5551 8697
-5552 8698
-5553 8699
-5554 869A
-5555 DFFB
-5556 E0A2
-5557 869B
-5558 869C
-5559 869D
-555A 869E
-555B 869F
-555C E0A8
-555D 86A0
-555E 86A1
-555F 86A2
-5560 86A3
-5561 B7C8
-5562 86A4
-5563 86A5
-5564 C6A1
-5565 C9B6
-5566 C0B2
-5567 DFF5
-5568 86A6
-5569 86A7
-556A C5BE
-556B 86A8
-556C D8C4
-556D DFF9
-556E C4F6
-556F 86A9
-5570 86AA
-5571 86AB
-5572 86AC
-5573 86AD
-5574 86AE
-5575 E0A3
-5576 E0A4
-5577 E0A5
-5578 D0A5
-5579 86AF
-557A 86B0
-557B E0B4
-557C CCE4
-557D 86B1
-557E E0B1
-557F 86B2
-5580 BFA6
-5581 E0AF
-5582 CEB9
-5583 E0AB
-5584 C9C6
-5585 86B3
-5586 86B4
-5587 C0AE
-5588 E0AE
-5589 BAED
-558A BAB0
-558B E0A9
-558C 86B5
-558D 86B6
-558E 86B7
-558F DFF6
-5590 86B8
-5591 E0B3
-5592 86B9
-5593 86BA
-5594 E0B8
-5595 86BB
-5596 86BC
-5597 86BD
-5598 B4AD
-5599 E0B9
-559A 86BE
-559B 86BF
-559C CFB2
-559D BAC8
-559E 86C0
-559F E0B0
-55A0 86C1
-55A1 86C2
-55A2 86C3
-55A3 86C4
-55A4 86C5
-55A5 86C6
-55A6 86C7
-55A7 D0FA
-55A8 86C8
-55A9 86C9
-55AA 86CA
-55AB 86CB
-55AC 86CC
-55AD 86CD
-55AE 86CE
-55AF 86CF
-55B0 86D0
-55B1 E0AC
-55B2 86D1
-55B3 D4FB
-55B4 86D2
-55B5 DFF7
-55B6 86D3
-55B7 C5E7
-55B8 86D4
-55B9 E0AD
-55BA 86D5
-55BB D3F7
-55BC 86D6
-55BD E0B6
-55BE E0B7
-55BF 86D7
-55C0 86D8
-55C1 86D9
-55C2 86DA
-55C3 86DB
-55C4 E0C4
-55C5 D0E1
-55C6 86DC
-55C7 86DD
-55C8 86DE
-55C9 E0BC
-55CA 86DF
-55CB 86E0
-55CC E0C9
-55CD E0CA
-55CE 86E1
-55CF 86E2
-55D0 86E3
-55D1 E0BE
-55D2 E0AA
-55D3 C9A4
-55D4 E0C1
-55D5 86E4
-55D6 E0B2
-55D7 86E5
-55D8 86E6
-55D9 86E7
-55DA 86E8
-55DB 86E9
-55DC CAC8
-55DD E0C3
-55DE 86EA
-55DF E0B5
-55E0 86EB
-55E1 CECB
-55E2 86EC
-55E3 CBC3
-55E4 E0CD
-55E5 E0C6
-55E6 E0C2
-55E7 86ED
-55E8 E0CB
-55E9 86EE
-55EA E0BA
-55EB E0BF
-55EC E0C0
-55ED 86EF
-55EE 86F0
-55EF E0C5
-55F0 86F1
-55F1 86F2
-55F2 E0C7
-55F3 E0C8
-55F4 86F3
-55F5 E0CC
-55F6 86F4
-55F7 E0BB
-55F8 86F5
-55F9 86F6
-55FA 86F7
-55FB 86F8
-55FC 86F9
-55FD CBD4
-55FE E0D5
-55FF 86FA
-5600 E0D6
-5601 E0D2
-5602 86FB
-5603 86FC
-5604 86FD
-5605 86FE
-5606 8740
-5607 8741
-5608 E0D0
-5609 BCCE
-560A 8742
-560B 8743
-560C E0D1
-560D 8744
-560E B8C2
-560F D8C5
-5610 8745
-5611 8746
-5612 8747
-5613 8748
-5614 8749
-5615 874A
-5616 874B
-5617 874C
-5618 D0EA
-5619 874D
-561A 874E
-561B C2EF
-561C 874F
-561D 8750
-561E E0CF
-561F E0BD
-5620 8751
-5621 8752
-5622 8753
-5623 E0D4
-5624 E0D3
-5625 8754
-5626 8755
-5627 E0D7
-5628 8756
-5629 8757
-562A 8758
-562B 8759
-562C E0DC
-562D E0D8
-562E 875A
-562F 875B
-5630 875C
-5631 D6F6
-5632 B3B0
-5633 875D
-5634 D7EC
-5635 875E
-5636 CBBB
-5637 875F
-5638 8760
-5639 E0DA
-563A 8761
-563B CEFB
-563C 8762
-563D 8763
-563E 8764
-563F BAD9
-5640 8765
-5641 8766
-5642 8767
-5643 8768
-5644 8769
-5645 876A
-5646 876B
-5647 876C
-5648 876D
-5649 876E
-564A 876F
-564B 8770
-564C E0E1
-564D E0DD
-564E D2AD
-564F 8771
-5650 8772
-5651 8773
-5652 8774
-5653 8775
-5654 E0E2
-5655 8776
-5656 8777
-5657 E0DB
-5658 E0D9
-5659 E0DF
-565A 8778
-565B 8779
-565C E0E0
-565D 877A
-565E 877B
-565F 877C
-5660 877D
-5661 877E
-5662 E0DE
-5663 8780
-5664 E0E4
-5665 8781
-5666 8782
-5667 8783
-5668 C6F7
-5669 D8AC
-566A D4EB
-566B E0E6
-566C CAC9
-566D 8784
-566E 8785
-566F 8786
-5670 8787
-5671 E0E5
-5672 8788
-5673 8789
-5674 878A
-5675 878B
-5676 B8C1
-5677 878C
-5678 878D
-5679 878E
-567A 878F
-567B E0E7
-567C E0E8
-567D 8790
-567E 8791
-567F 8792
-5680 8793
-5681 8794
-5682 8795
-5683 8796
-5684 8797
-5685 E0E9
-5686 E0E3
-5687 8798
-5688 8799
-5689 879A
-568A 879B
-568B 879C
-568C 879D
-568D 879E
-568E BABF
-568F CCE7
-5690 879F
-5691 87A0
-5692 87A1
-5693 E0EA
-5694 87A2
-5695 87A3
-5696 87A4
-5697 87A5
-5698 87A6
-5699 87A7
-569A 87A8
-569B 87A9
-569C 87AA
-569D 87AB
-569E 87AC
-569F 87AD
-56A0 87AE
-56A1 87AF
-56A2 87B0
-56A3 CFF9
-56A4 87B1
-56A5 87B2
-56A6 87B3
-56A7 87B4
-56A8 87B5
-56A9 87B6
-56AA 87B7
-56AB 87B8
-56AC 87B9
-56AD 87BA
-56AE 87BB
-56AF E0EB
-56B0 87BC
-56B1 87BD
-56B2 87BE
-56B3 87BF
-56B4 87C0
-56B5 87C1
-56B6 87C2
-56B7 C8C2
-56B8 87C3
-56B9 87C4
-56BA 87C5
-56BB 87C6
-56BC BDC0
-56BD 87C7
-56BE 87C8
-56BF 87C9
-56C0 87CA
-56C1 87CB
-56C2 87CC
-56C3 87CD
-56C4 87CE
-56C5 87CF
-56C6 87D0
-56C7 87D1
-56C8 87D2
-56C9 87D3
-56CA C4D2
-56CB 87D4
-56CC 87D5
-56CD 87D6
-56CE 87D7
-56CF 87D8
-56D0 87D9
-56D1 87DA
-56D2 87DB
-56D3 87DC
-56D4 E0EC
-56D5 87DD
-56D6 87DE
-56D7 E0ED
-56D8 87DF
-56D9 87E0
-56DA C7F4
-56DB CBC4
-56DC 87E1
-56DD E0EE
-56DE BBD8
-56DF D8B6
-56E0 D2F2
-56E1 E0EF
-56E2 CDC5
-56E3 87E2
-56E4 B6DA
-56E5 87E3
-56E6 87E4
-56E7 87E5
-56E8 87E6
-56E9 87E7
-56EA 87E8
-56EB E0F1
-56EC 87E9
-56ED D4B0
-56EE 87EA
-56EF 87EB
-56F0 C0A7
-56F1 B4D1
-56F2 87EC
-56F3 87ED
-56F4 CEA7
-56F5 E0F0
-56F6 87EE
-56F7 87EF
-56F8 87F0
-56F9 E0F2
-56FA B9CC
-56FB 87F1
-56FC 87F2
-56FD B9FA
-56FE CDBC
-56FF E0F3
-5700 87F3
-5701 87F4
-5702 87F5
-5703 C6D4
-5704 E0F4
-5705 87F6
-5706 D4B2
-5707 87F7
-5708 C8A6
-5709 E0F6
-570A E0F5
-570B 87F8
-570C 87F9
-570D 87FA
-570E 87FB
-570F 87FC
-5710 87FD
-5711 87FE
-5712 8840
-5713 8841
-5714 8842
-5715 8843
-5716 8844
-5717 8845
-5718 8846
-5719 8847
-571A 8848
-571B 8849
-571C E0F7
-571D 884A
-571E 884B
-571F CDC1
-5720 884C
-5721 884D
-5722 884E
-5723 CAA5
-5724 884F
-5725 8850
-5726 8851
-5727 8852
-5728 D4DA
-5729 DBD7
-572A DBD9
-572B 8853
-572C DBD8
-572D B9E7
-572E DBDC
-572F DBDD
-5730 B5D8
-5731 8854
-5732 8855
-5733 DBDA
-5734 8856
-5735 8857
-5736 8858
-5737 8859
-5738 885A
-5739 DBDB
-573A B3A1
-573B DBDF
-573C 885B
-573D 885C
-573E BBF8
-573F 885D
-5740 D6B7
-5741 885E
-5742 DBE0
-5743 885F
-5744 8860
-5745 8861
-5746 8862
-5747 BEF9
-5748 8863
-5749 8864
-574A B7BB
-574B 8865
-574C DBD0
-574D CCAE
-574E BFB2
-574F BBB5
-5750 D7F8
-5751 BFD3
-5752 8866
-5753 8867
-5754 8868
-5755 8869
-5756 886A
-5757 BFE9
-5758 886B
-5759 886C
-575A BCE1
-575B CCB3
-575C DBDE
-575D B0D3
-575E CEEB
-575F B7D8
-5760 D7B9
-5761 C6C2
-5762 886D
-5763 886E
-5764 C0A4
-5765 886F
-5766 CCB9
-5767 8870
-5768 DBE7
-5769 DBE1
-576A C6BA
-576B DBE3
-576C 8871
-576D DBE8
-576E 8872
-576F C5F7
-5770 8873
-5771 8874
-5772 8875
-5773 DBEA
-5774 8876
-5775 8877
-5776 DBE9
-5777 BFC0
-5778 8878
-5779 8879
-577A 887A
-577B DBE6
-577C DBE5
-577D 887B
-577E 887C
-577F 887D
-5780 887E
-5781 8880
-5782 B4B9
-5783 C0AC
-5784 C2A2
-5785 DBE2
-5786 DBE4
-5787 8881
-5788 8882
-5789 8883
-578A 8884
-578B D0CD
-578C DBED
-578D 8885
-578E 8886
-578F 8887
-5790 8888
-5791 8889
-5792 C0DD
-5793 DBF2
-5794 888A
-5795 888B
-5796 888C
-5797 888D
-5798 888E
-5799 888F
-579A 8890
-579B B6E2
-579C 8891
-579D 8892
-579E 8893
-579F 8894
-57A0 DBF3
-57A1 DBD2
-57A2 B9B8
-57A3 D4AB
-57A4 DBEC
-57A5 8895
-57A6 BFD1
-57A7 DBF0
-57A8 8896
-57A9 DBD1
-57AA 8897
-57AB B5E6
-57AC 8898
-57AD DBEB
-57AE BFE5
-57AF 8899
-57B0 889A
-57B1 889B
-57B2 DBEE
-57B3 889C
-57B4 DBF1
-57B5 889D
-57B6 889E
-57B7 889F
-57B8 DBF9
-57B9 88A0
-57BA 88A1
-57BB 88A2
-57BC 88A3
-57BD 88A4
-57BE 88A5
-57BF 88A6
-57C0 88A7
-57C1 88A8
-57C2 B9A1
-57C3 B0A3
-57C4 88A9
-57C5 88AA
-57C6 88AB
-57C7 88AC
-57C8 88AD
-57C9 88AE
-57CA 88AF
-57CB C2F1
-57CC 88B0
-57CD 88B1
-57CE B3C7
-57CF DBEF
-57D0 88B2
-57D1 88B3
-57D2 DBF8
-57D3 88B4
-57D4 C6D2
-57D5 DBF4
-57D6 88B5
-57D7 88B6
-57D8 DBF5
-57D9 DBF7
-57DA DBF6
-57DB 88B7
-57DC 88B8
-57DD DBFE
-57DE 88B9
-57DF D3F2
-57E0 B2BA
-57E1 88BA
-57E2 88BB
-57E3 88BC
-57E4 DBFD
-57E5 88BD
-57E6 88BE
-57E7 88BF
-57E8 88C0
-57E9 88C1
-57EA 88C2
-57EB 88C3
-57EC 88C4
-57ED DCA4
-57EE 88C5
-57EF DBFB
-57F0 88C6
-57F1 88C7
-57F2 88C8
-57F3 88C9
-57F4 DBFA
-57F5 88CA
-57F6 88CB
-57F7 88CC
-57F8 DBFC
-57F9 C5E0
-57FA BBF9
-57FB 88CD
-57FC 88CE
-57FD DCA3
-57FE 88CF
-57FF 88D0
-5800 DCA5
-5801 88D1
-5802 CCC3
-5803 88D2
-5804 88D3
-5805 88D4
-5806 B6D1
-5807 DDC0
-5808 88D5
-5809 88D6
-580A 88D7
-580B DCA1
-580C 88D8
-580D DCA2
-580E 88D9
-580F 88DA
-5810 88DB
-5811 C7B5
-5812 88DC
-5813 88DD
-5814 88DE
-5815 B6E9
-5816 88DF
-5817 88E0
-5818 88E1
-5819 DCA7
-581A 88E2
-581B 88E3
-581C 88E4
-581D 88E5
-581E DCA6
-581F 88E6
-5820 DCA9
-5821 B1A4
-5822 88E7
-5823 88E8
-5824 B5CC
-5825 88E9
-5826 88EA
-5827 88EB
-5828 88EC
-5829 88ED
-582A BFB0
-582B 88EE
-582C 88EF
-582D 88F0
-582E 88F1
-582F 88F2
-5830 D1DF
-5831 88F3
-5832 88F4
-5833 88F5
-5834 88F6
-5835 B6C2
-5836 88F7
-5837 88F8
-5838 88F9
-5839 88FA
-583A 88FB
-583B 88FC
-583C 88FD
-583D 88FE
-583E 8940
-583F 8941
-5840 8942
-5841 8943
-5842 8944
-5843 8945
-5844 DCA8
-5845 8946
-5846 8947
-5847 8948
-5848 8949
-5849 894A
-584A 894B
-584B 894C
-584C CBFA
-584D EBF3
-584E 894D
-584F 894E
-5850 894F
-5851 CBDC
-5852 8950
-5853 8951
-5854 CBFE
-5855 8952
-5856 8953
-5857 8954
-5858 CCC1
-5859 8955
-585A 8956
-585B 8957
-585C 8958
-585D 8959
-585E C8FB
-585F 895A
-5860 895B
-5861 895C
-5862 895D
-5863 895E
-5864 895F
-5865 DCAA
-5866 8960
-5867 8961
-5868 8962
-5869 8963
-586A 8964
-586B CCEE
-586C DCAB
-586D 8965
-586E 8966
-586F 8967
-5870 8968
-5871 8969
-5872 896A
-5873 896B
-5874 896C
-5875 896D
-5876 896E
-5877 896F
-5878 8970
-5879 8971
-587A 8972
-587B 8973
-587C 8974
-587D 8975
-587E DBD3
-587F 8976
-5880 DCAF
-5881 DCAC
-5882 8977
-5883 BEB3
-5884 8978
-5885 CAFB
-5886 8979
-5887 897A
-5888 897B
-5889 DCAD
-588A 897C
-588B 897D
-588C 897E
-588D 8980
-588E 8981
-588F 8982
-5890 8983
-5891 8984
-5892 C9CA
-5893 C4B9
-5894 8985
-5895 8986
-5896 8987
-5897 8988
-5898 8989
-5899 C7BD
-589A DCAE
-589B 898A
-589C 898B
-589D 898C
-589E D4F6
-589F D0E6
-58A0 898D
-58A1 898E
-58A2 898F
-58A3 8990
-58A4 8991
-58A5 8992
-58A6 8993
-58A7 8994
-58A8 C4AB
-58A9 B6D5
-58AA 8995
-58AB 8996
-58AC 8997
-58AD 8998
-58AE 8999
-58AF 899A
-58B0 899B
-58B1 899C
-58B2 899D
-58B3 899E
-58B4 899F
-58B5 89A0
-58B6 89A1
-58B7 89A2
-58B8 89A3
-58B9 89A4
-58BA 89A5
-58BB 89A6
-58BC DBD4
-58BD 89A7
-58BE 89A8
-58BF 89A9
-58C0 89AA
-58C1 B1DA
-58C2 89AB
-58C3 89AC
-58C4 89AD
-58C5 DBD5
-58C6 89AE
-58C7 89AF
-58C8 89B0
-58C9 89B1
-58CA 89B2
-58CB 89B3
-58CC 89B4
-58CD 89B5
-58CE 89B6
-58CF 89B7
-58D0 89B8
-58D1 DBD6
-58D2 89B9
-58D3 89BA
-58D4 89BB
-58D5 BABE
-58D6 89BC
-58D7 89BD
-58D8 89BE
-58D9 89BF
-58DA 89C0
-58DB 89C1
-58DC 89C2
-58DD 89C3
-58DE 89C4
-58DF 89C5
-58E0 89C6
-58E1 89C7
-58E2 89C8
-58E3 89C9
-58E4 C8C0
-58E5 89CA
-58E6 89CB
-58E7 89CC
-58E8 89CD
-58E9 89CE
-58EA 89CF
-58EB CABF
-58EC C8C9
-58ED 89D0
-58EE D7B3
-58EF 89D1
-58F0 C9F9
-58F1 89D2
-58F2 89D3
-58F3 BFC7
-58F4 89D4
-58F5 89D5
-58F6 BAF8
-58F7 89D6
-58F8 89D7
-58F9 D2BC
-58FA 89D8
-58FB 89D9
-58FC 89DA
-58FD 89DB
-58FE 89DC
-58FF 89DD
-5900 89DE
-5901 89DF
-5902 E2BA
-5903 89E0
-5904 B4A6
-5905 89E1
-5906 89E2
-5907 B1B8
-5908 89E3
-5909 89E4
-590A 89E5
-590B 89E6
-590C 89E7
-590D B8B4
-590E 89E8
-590F CFC4
-5910 89E9
-5911 89EA
-5912 89EB
-5913 89EC
-5914 D9E7
-5915 CFA6
-5916 CDE2
-5917 89ED
-5918 89EE
-5919 D9ED
-591A B6E0
-591B 89EF
-591C D2B9
-591D 89F0
-591E 89F1
-591F B9BB
-5920 89F2
-5921 89F3
-5922 89F4
-5923 89F5
-5924 E2B9
-5925 E2B7
-5926 89F6
-5927 B4F3
-5928 89F7
-5929 CCEC
-592A CCAB
-592B B7F2
-592C 89F8
-592D D8B2
-592E D1EB
-592F BABB
-5930 89F9
-5931 CAA7
-5932 89FA
-5933 89FB
-5934 CDB7
-5935 89FC
-5936 89FD
-5937 D2C4
-5938 BFE4
-5939 BCD0
-593A B6E1
-593B 89FE
-593C DEC5
-593D 8A40
-593E 8A41
-593F 8A42
-5940 8A43
-5941 DEC6
-5942 DBBC
-5943 8A44
-5944 D1D9
-5945 8A45
-5946 8A46
-5947 C6E6
-5948 C4CE
-5949 B7EE
-594A 8A47
-594B B7DC
-594C 8A48
-594D 8A49
-594E BFFC
-594F D7E0
-5950 8A4A
-5951 C6F5
-5952 8A4B
-5953 8A4C
-5954 B1BC
-5955 DEC8
-5956 BDB1
-5957 CCD7
-5958 DECA
-5959 8A4D
-595A DEC9
-595B 8A4E
-595C 8A4F
-595D 8A50
-595E 8A51
-595F 8A52
-5960 B5EC
-5961 8A53
-5962 C9DD
-5963 8A54
-5964 8A55
-5965 B0C2
-5966 8A56
-5967 8A57
-5968 8A58
-5969 8A59
-596A 8A5A
-596B 8A5B
-596C 8A5C
-596D 8A5D
-596E 8A5E
-596F 8A5F
-5970 8A60
-5971 8A61
-5972 8A62
-5973 C5AE
-5974 C5AB
-5975 8A63
-5976 C4CC
-5977 8A64
-5978 BCE9
-5979 CBFD
-597A 8A65
-597B 8A66
-597C 8A67
-597D BAC3
-597E 8A68
-597F 8A69
-5980 8A6A
-5981 E5F9
-5982 C8E7
-5983 E5FA
-5984 CDFD
-5985 8A6B
-5986 D7B1
-5987 B8BE
-5988 C2E8
-5989 8A6C
-598A C8D1
-598B 8A6D
-598C 8A6E
-598D E5FB
-598E 8A6F
-598F 8A70
-5990 8A71
-5991 8A72
-5992 B6CA
-5993 BCCB
-5994 8A73
-5995 8A74
-5996 D1FD
-5997 E6A1
-5998 8A75
-5999 C3EE
-599A 8A76
-599B 8A77
-599C 8A78
-599D 8A79
-599E E6A4
-599F 8A7A
-59A0 8A7B
-59A1 8A7C
-59A2 8A7D
-59A3 E5FE
-59A4 E6A5
-59A5 CDD7
-59A6 8A7E
-59A7 8A80
-59A8 B7C1
-59A9 E5FC
-59AA E5FD
-59AB E6A3
-59AC 8A81
-59AD 8A82
-59AE C4DD
-59AF E6A8
-59B0 8A83
-59B1 8A84
-59B2 E6A7
-59B3 8A85
-59B4 8A86
-59B5 8A87
-59B6 8A88
-59B7 8A89
-59B8 8A8A
-59B9 C3C3
-59BA 8A8B
-59BB C6DE
-59BC 8A8C
-59BD 8A8D
-59BE E6AA
-59BF 8A8E
-59C0 8A8F
-59C1 8A90
-59C2 8A91
-59C3 8A92
-59C4 8A93
-59C5 8A94
-59C6 C4B7
-59C7 8A95
-59C8 8A96
-59C9 8A97
-59CA E6A2
-59CB CABC
-59CC 8A98
-59CD 8A99
-59CE 8A9A
-59CF 8A9B
-59D0 BDE3
-59D1 B9C3
-59D2 E6A6
-59D3 D0D5
-59D4 CEAF
-59D5 8A9C
-59D6 8A9D
-59D7 E6A9
-59D8 E6B0
-59D9 8A9E
-59DA D2A6
-59DB 8A9F
-59DC BDAA
-59DD E6AD
-59DE 8AA0
-59DF 8AA1
-59E0 8AA2
-59E1 8AA3
-59E2 8AA4
-59E3 E6AF
-59E4 8AA5
-59E5 C0D1
-59E6 8AA6
-59E7 8AA7
-59E8 D2CC
-59E9 8AA8
-59EA 8AA9
-59EB 8AAA
-59EC BCA7
-59ED 8AAB
-59EE 8AAC
-59EF 8AAD
-59F0 8AAE
-59F1 8AAF
-59F2 8AB0
-59F3 8AB1
-59F4 8AB2
-59F5 8AB3
-59F6 8AB4
-59F7 8AB5
-59F8 8AB6
-59F9 E6B1
-59FA 8AB7
-59FB D2F6
-59FC 8AB8
-59FD 8AB9
-59FE 8ABA
-59FF D7CB
-5A00 8ABB
-5A01 CDFE
-5A02 8ABC
-5A03 CDDE
-5A04 C2A6
-5A05 E6AB
-5A06 E6AC
-5A07 BDBF
-5A08 E6AE
-5A09 E6B3
-5A0A 8ABD
-5A0B 8ABE
-5A0C E6B2
-5A0D 8ABF
-5A0E 8AC0
-5A0F 8AC1
-5A10 8AC2
-5A11 E6B6
-5A12 8AC3
-5A13 E6B8
-5A14 8AC4
-5A15 8AC5
-5A16 8AC6
-5A17 8AC7
-5A18 C4EF
-5A19 8AC8
-5A1A 8AC9
-5A1B 8ACA
-5A1C C4C8
-5A1D 8ACB
-5A1E 8ACC
-5A1F BEEA
-5A20 C9EF
-5A21 8ACD
-5A22 8ACE
-5A23 E6B7
-5A24 8ACF
-5A25 B6F0
-5A26 8AD0
-5A27 8AD1
-5A28 8AD2
-5A29 C3E4
-5A2A 8AD3
-5A2B 8AD4
-5A2C 8AD5
-5A2D 8AD6
-5A2E 8AD7
-5A2F 8AD8
-5A30 8AD9
-5A31 D3E9
-5A32 E6B4
-5A33 8ADA
-5A34 E6B5
-5A35 8ADB
-5A36 C8A2
-5A37 8ADC
-5A38 8ADD
-5A39 8ADE
-5A3A 8ADF
-5A3B 8AE0
-5A3C E6BD
-5A3D 8AE1
-5A3E 8AE2
-5A3F 8AE3
-5A40 E6B9
-5A41 8AE4
-5A42 8AE5
-5A43 8AE6
-5A44 8AE7
-5A45 8AE8
-5A46 C6C5
-5A47 8AE9
-5A48 8AEA
-5A49 CDF1
-5A4A E6BB
-5A4B 8AEB
-5A4C 8AEC
-5A4D 8AED
-5A4E 8AEE
-5A4F 8AEF
-5A50 8AF0
-5A51 8AF1
-5A52 8AF2
-5A53 8AF3
-5A54 8AF4
-5A55 E6BC
-5A56 8AF5
-5A57 8AF6
-5A58 8AF7
-5A59 8AF8
-5A5A BBE9
-5A5B 8AF9
-5A5C 8AFA
-5A5D 8AFB
-5A5E 8AFC
-5A5F 8AFD
-5A60 8AFE
-5A61 8B40
-5A62 E6BE
-5A63 8B41
-5A64 8B42
-5A65 8B43
-5A66 8B44
-5A67 E6BA
-5A68 8B45
-5A69 8B46
-5A6A C0B7
-5A6B 8B47
-5A6C 8B48
-5A6D 8B49
-5A6E 8B4A
-5A6F 8B4B
-5A70 8B4C
-5A71 8B4D
-5A72 8B4E
-5A73 8B4F
-5A74 D3A4
-5A75 E6BF
-5A76 C9F4
-5A77 E6C3
-5A78 8B50
-5A79 8B51
-5A7A E6C4
-5A7B 8B52
-5A7C 8B53
-5A7D 8B54
-5A7E 8B55
-5A7F D0F6
-5A80 8B56
-5A81 8B57
-5A82 8B58
-5A83 8B59
-5A84 8B5A
-5A85 8B5B
-5A86 8B5C
-5A87 8B5D
-5A88 8B5E
-5A89 8B5F
-5A8A 8B60
-5A8B 8B61
-5A8C 8B62
-5A8D 8B63
-5A8E 8B64
-5A8F 8B65
-5A90 8B66
-5A91 8B67
-5A92 C3BD
-5A93 8B68
-5A94 8B69
-5A95 8B6A
-5A96 8B6B
-5A97 8B6C
-5A98 8B6D
-5A99 8B6E
-5A9A C3C4
-5A9B E6C2
-5A9C 8B6F
-5A9D 8B70
-5A9E 8B71
-5A9F 8B72
-5AA0 8B73
-5AA1 8B74
-5AA2 8B75
-5AA3 8B76
-5AA4 8B77
-5AA5 8B78
-5AA6 8B79
-5AA7 8B7A
-5AA8 8B7B
-5AA9 8B7C
-5AAA E6C1
-5AAB 8B7D
-5AAC 8B7E
-5AAD 8B80
-5AAE 8B81
-5AAF 8B82
-5AB0 8B83
-5AB1 8B84
-5AB2 E6C7
-5AB3 CFB1
-5AB4 8B85
-5AB5 EBF4
-5AB6 8B86
-5AB7 8B87
-5AB8 E6CA
-5AB9 8B88
-5ABA 8B89
-5ABB 8B8A
-5ABC 8B8B
-5ABD 8B8C
-5ABE E6C5
-5ABF 8B8D
-5AC0 8B8E
-5AC1 BCDE
-5AC2 C9A9
-5AC3 8B8F
-5AC4 8B90
-5AC5 8B91
-5AC6 8B92
-5AC7 8B93
-5AC8 8B94
-5AC9 BCB5
-5ACA 8B95
-5ACB 8B96
-5ACC CFD3
-5ACD 8B97
-5ACE 8B98
-5ACF 8B99
-5AD0 8B9A
-5AD1 8B9B
-5AD2 E6C8
-5AD3 8B9C
-5AD4 E6C9
-5AD5 8B9D
-5AD6 E6CE
-5AD7 8B9E
-5AD8 E6D0
-5AD9 8B9F
-5ADA 8BA0
-5ADB 8BA1
-5ADC E6D1
-5ADD 8BA2
-5ADE 8BA3
-5ADF 8BA4
-5AE0 E6CB
-5AE1 B5D5
-5AE2 8BA5
-5AE3 E6CC
-5AE4 8BA6
-5AE5 8BA7
-5AE6 E6CF
-5AE7 8BA8
-5AE8 8BA9
-5AE9 C4DB
-5AEA 8BAA
-5AEB E6C6
-5AEC 8BAB
-5AED 8BAC
-5AEE 8BAD
-5AEF 8BAE
-5AF0 8BAF
-5AF1 E6CD
-5AF2 8BB0
-5AF3 8BB1
-5AF4 8BB2
-5AF5 8BB3
-5AF6 8BB4
-5AF7 8BB5
-5AF8 8BB6
-5AF9 8BB7
-5AFA 8BB8
-5AFB 8BB9
-5AFC 8BBA
-5AFD 8BBB
-5AFE 8BBC
-5AFF 8BBD
-5B00 8BBE
-5B01 8BBF
-5B02 8BC0
-5B03 8BC1
-5B04 8BC2
-5B05 8BC3
-5B06 8BC4
-5B07 8BC5
-5B08 8BC6
-5B09 E6D2
-5B0A 8BC7
-5B0B 8BC8
-5B0C 8BC9
-5B0D 8BCA
-5B0E 8BCB
-5B0F 8BCC
-5B10 8BCD
-5B11 8BCE
-5B12 8BCF
-5B13 8BD0
-5B14 8BD1
-5B15 8BD2
-5B16 E6D4
-5B17 E6D3
-5B18 8BD3
-5B19 8BD4
-5B1A 8BD5
-5B1B 8BD6
-5B1C 8BD7
-5B1D 8BD8
-5B1E 8BD9
-5B1F 8BDA
-5B20 8BDB
-5B21 8BDC
-5B22 8BDD
-5B23 8BDE
-5B24 8BDF
-5B25 8BE0
-5B26 8BE1
-5B27 8BE2
-5B28 8BE3
-5B29 8BE4
-5B2A 8BE5
-5B2B 8BE6
-5B2C 8BE7
-5B2D 8BE8
-5B2E 8BE9
-5B2F 8BEA
-5B30 8BEB
-5B31 8BEC
-5B32 E6D5
-5B33 8BED
-5B34 D9F8
-5B35 8BEE
-5B36 8BEF
-5B37 E6D6
-5B38 8BF0
-5B39 8BF1
-5B3A 8BF2
-5B3B 8BF3
-5B3C 8BF4
-5B3D 8BF5
-5B3E 8BF6
-5B3F 8BF7
-5B40 E6D7
-5B41 8BF8
-5B42 8BF9
-5B43 8BFA
-5B44 8BFB
-5B45 8BFC
-5B46 8BFD
-5B47 8BFE
-5B48 8C40
-5B49 8C41
-5B4A 8C42
-5B4B 8C43
-5B4C 8C44
-5B4D 8C45
-5B4E 8C46
-5B4F 8C47
-5B50 D7D3
-5B51 E6DD
-5B52 8C48
-5B53 E6DE
-5B54 BFD7
-5B55 D4D0
-5B56 8C49
-5B57 D7D6
-5B58 B4E6
-5B59 CBEF
-5B5A E6DA
-5B5B D8C3
-5B5C D7CE
-5B5D D0A2
-5B5E 8C4A
-5B5F C3CF
-5B60 8C4B
-5B61 8C4C
-5B62 E6DF
-5B63 BCBE
-5B64 B9C2
-5B65 E6DB
-5B66 D1A7
-5B67 8C4D
-5B68 8C4E
-5B69 BAA2
-5B6A C2CF
-5B6B 8C4F
-5B6C D8AB
-5B6D 8C50
-5B6E 8C51
-5B6F 8C52
-5B70 CAEB
-5B71 E5EE
-5B72 8C53
-5B73 E6DC
-5B74 8C54
-5B75 B7F5
-5B76 8C55
-5B77 8C56
-5B78 8C57
-5B79 8C58
-5B7A C8E6
-5B7B 8C59
-5B7C 8C5A
-5B7D C4F5
-5B7E 8C5B
-5B7F 8C5C
-5B80 E5B2
-5B81 C4FE
-5B82 8C5D
-5B83 CBFC
-5B84 E5B3
-5B85 D5AC
-5B86 8C5E
-5B87 D3EE
-5B88 CAD8
-5B89 B0B2
-5B8A 8C5F
-5B8B CBCE
-5B8C CDEA
-5B8D 8C60
-5B8E 8C61
-5B8F BAEA
-5B90 8C62
-5B91 8C63
-5B92 8C64
-5B93 E5B5
-5B94 8C65
-5B95 E5B4
-5B96 8C66
-5B97 D7DA
-5B98 B9D9
-5B99 D6E6
-5B9A B6A8
-5B9B CDF0
-5B9C D2CB
-5B9D B1A6
-5B9E CAB5
-5B9F 8C67
-5BA0 B3E8
-5BA1 C9F3
-5BA2 BFCD
-5BA3 D0FB
-5BA4 CAD2
-5BA5 E5B6
-5BA6 BBC2
-5BA7 8C68
-5BA8 8C69
-5BA9 8C6A
-5BAA CFDC
-5BAB B9AC
-5BAC 8C6B
-5BAD 8C6C
-5BAE 8C6D
-5BAF 8C6E
-5BB0 D4D7
-5BB1 8C6F
-5BB2 8C70
-5BB3 BAA6
-5BB4 D1E7
-5BB5 CFFC
-5BB6 BCD2
-5BB7 8C71
-5BB8 E5B7
-5BB9 C8DD
-5BBA 8C72
-5BBB 8C73
-5BBC 8C74
-5BBD BFED
-5BBE B1F6
-5BBF CBDE
-5BC0 8C75
-5BC1 8C76
-5BC2 BCC5
-5BC3 8C77
-5BC4 BCC4
-5BC5 D2FA
-5BC6 C3DC
-5BC7 BFDC
-5BC8 8C78
-5BC9 8C79
-5BCA 8C7A
-5BCB 8C7B
-5BCC B8BB
-5BCD 8C7C
-5BCE 8C7D
-5BCF 8C7E
-5BD0 C3C2
-5BD1 8C80
-5BD2 BAAE
-5BD3 D4A2
-5BD4 8C81
-5BD5 8C82
-5BD6 8C83
-5BD7 8C84
-5BD8 8C85
-5BD9 8C86
-5BDA 8C87
-5BDB 8C88
-5BDC 8C89
-5BDD C7DE
-5BDE C4AF
-5BDF B2EC
-5BE0 8C8A
-5BE1 B9D1
-5BE2 8C8B
-5BE3 8C8C
-5BE4 E5BB
-5BE5 C1C8
-5BE6 8C8D
-5BE7 8C8E
-5BE8 D5AF
-5BE9 8C8F
-5BEA 8C90
-5BEB 8C91
-5BEC 8C92
-5BED 8C93
-5BEE E5BC
-5BEF 8C94
-5BF0 E5BE
-5BF1 8C95
-5BF2 8C96
-5BF3 8C97
-5BF4 8C98
-5BF5 8C99
-5BF6 8C9A
-5BF7 8C9B
-5BF8 B4E7
-5BF9 B6D4
-5BFA CBC2
-5BFB D1B0
-5BFC B5BC
-5BFD 8C9C
-5BFE 8C9D
-5BFF CAD9
-5C00 8C9E
-5C01 B7E2
-5C02 8C9F
-5C03 8CA0
-5C04 C9E4
-5C05 8CA1
-5C06 BDAB
-5C07 8CA2
-5C08 8CA3
-5C09 CEBE
-5C0A D7F0
-5C0B 8CA4
-5C0C 8CA5
-5C0D 8CA6
-5C0E 8CA7
-5C0F D0A1
-5C10 8CA8
-5C11 C9D9
-5C12 8CA9
-5C13 8CAA
-5C14 B6FB
-5C15 E6D8
-5C16 BCE2
-5C17 8CAB
-5C18 B3BE
-5C19 8CAC
-5C1A C9D0
-5C1B 8CAD
-5C1C E6D9
-5C1D B3A2
-5C1E 8CAE
-5C1F 8CAF
-5C20 8CB0
-5C21 8CB1
-5C22 DECC
-5C23 8CB2
-5C24 D3C8
-5C25 DECD
-5C26 8CB3
-5C27 D2A2
-5C28 8CB4
-5C29 8CB5
-5C2A 8CB6
-5C2B 8CB7
-5C2C DECE
-5C2D 8CB8
-5C2E 8CB9
-5C2F 8CBA
-5C30 8CBB
-5C31 BECD
-5C32 8CBC
-5C33 8CBD
-5C34 DECF
-5C35 8CBE
-5C36 8CBF
-5C37 8CC0
-5C38 CAAC
-5C39 D2FC
-5C3A B3DF
-5C3B E5EA
-5C3C C4E1
-5C3D BEA1
-5C3E CEB2
-5C3F C4F2
-5C40 BED6
-5C41 C6A8
-5C42 B2E3
-5C43 8CC1
-5C44 8CC2
-5C45 BED3
-5C46 8CC3
-5C47 8CC4
-5C48 C7FC
-5C49 CCEB
-5C4A BDEC
-5C4B CEDD
-5C4C 8CC5
-5C4D 8CC6
-5C4E CABA
-5C4F C6C1
-5C50 E5EC
-5C51 D0BC
-5C52 8CC7
-5C53 8CC8
-5C54 8CC9
-5C55 D5B9
-5C56 8CCA
-5C57 8CCB
-5C58 8CCC
-5C59 E5ED
-5C5A 8CCD
-5C5B 8CCE
-5C5C 8CCF
-5C5D 8CD0
-5C5E CAF4
-5C5F 8CD1
-5C60 CDC0
-5C61 C2C5
-5C62 8CD2
-5C63 E5EF
-5C64 8CD3
-5C65 C2C4
-5C66 E5F0
-5C67 8CD4
-5C68 8CD5
-5C69 8CD6
-5C6A 8CD7
-5C6B 8CD8
-5C6C 8CD9
-5C6D 8CDA
-5C6E E5F8
-5C6F CDCD
-5C70 8CDB
-5C71 C9BD
-5C72 8CDC
-5C73 8CDD
-5C74 8CDE
-5C75 8CDF
-5C76 8CE0
-5C77 8CE1
-5C78 8CE2
-5C79 D2D9
-5C7A E1A8
-5C7B 8CE3
-5C7C 8CE4
-5C7D 8CE5
-5C7E 8CE6
-5C7F D3EC
-5C80 8CE7
-5C81 CBEA
-5C82 C6F1
-5C83 8CE8
-5C84 8CE9
-5C85 8CEA
-5C86 8CEB
-5C87 8CEC
-5C88 E1AC
-5C89 8CED
-5C8A 8CEE
-5C8B 8CEF
-5C8C E1A7
-5C8D E1A9
-5C8E 8CF0
-5C8F 8CF1
-5C90 E1AA
-5C91 E1AF
-5C92 8CF2
-5C93 8CF3
-5C94 B2ED
-5C95 8CF4
-5C96 E1AB
-5C97 B8DA
-5C98 E1AD
-5C99 E1AE
-5C9A E1B0
-5C9B B5BA
-5C9C E1B1
-5C9D 8CF5
-5C9E 8CF6
-5C9F 8CF7
-5CA0 8CF8
-5CA1 8CF9
-5CA2 E1B3
-5CA3 E1B8
-5CA4 8CFA
-5CA5 8CFB
-5CA6 8CFC
-5CA7 8CFD
-5CA8 8CFE
-5CA9 D1D2
-5CAA 8D40
-5CAB E1B6
-5CAC E1B5
-5CAD C1EB
-5CAE 8D41
-5CAF 8D42
-5CB0 8D43
-5CB1 E1B7
-5CB2 8D44
-5CB3 D4C0
-5CB4 8D45
-5CB5 E1B2
-5CB6 8D46
-5CB7 E1BA
-5CB8 B0B6
-5CB9 8D47
-5CBA 8D48
-5CBB 8D49
-5CBC 8D4A
-5CBD E1B4
-5CBE 8D4B
-5CBF BFF9
-5CC0 8D4C
-5CC1 E1B9
-5CC2 8D4D
-5CC3 8D4E
-5CC4 E1BB
-5CC5 8D4F
-5CC6 8D50
-5CC7 8D51
-5CC8 8D52
-5CC9 8D53
-5CCA 8D54
-5CCB E1BE
-5CCC 8D55
-5CCD 8D56
-5CCE 8D57
-5CCF 8D58
-5CD0 8D59
-5CD1 8D5A
-5CD2 E1BC
-5CD3 8D5B
-5CD4 8D5C
-5CD5 8D5D
-5CD6 8D5E
-5CD7 8D5F
-5CD8 8D60
-5CD9 D6C5
-5CDA 8D61
-5CDB 8D62
-5CDC 8D63
-5CDD 8D64
-5CDE 8D65
-5CDF 8D66
-5CE0 8D67
-5CE1 CFBF
-5CE2 8D68
-5CE3 8D69
-5CE4 E1BD
-5CE5 E1BF
-5CE6 C2CD
-5CE7 8D6A
-5CE8 B6EB
-5CE9 8D6B
-5CEA D3F8
-5CEB 8D6C
-5CEC 8D6D
-5CED C7CD
-5CEE 8D6E
-5CEF 8D6F
-5CF0 B7E5
-5CF1 8D70
-5CF2 8D71
-5CF3 8D72
-5CF4 8D73
-5CF5 8D74
-5CF6 8D75
-5CF7 8D76
-5CF8 8D77
-5CF9 8D78
-5CFA 8D79
-5CFB BEFE
-5CFC 8D7A
-5CFD 8D7B
-5CFE 8D7C
-5CFF 8D7D
-5D00 8D7E
-5D01 8D80
-5D02 E1C0
-5D03 E1C1
-5D04 8D81
-5D05 8D82
-5D06 E1C7
-5D07 B3E7
-5D08 8D83
-5D09 8D84
-5D0A 8D85
-5D0B 8D86
-5D0C 8D87
-5D0D 8D88
-5D0E C6E9
-5D0F 8D89
-5D10 8D8A
-5D11 8D8B
-5D12 8D8C
-5D13 8D8D
-5D14 B4DE
-5D15 8D8E
-5D16 D1C2
-5D17 8D8F
-5D18 8D90
-5D19 8D91
-5D1A 8D92
-5D1B E1C8
-5D1C 8D93
-5D1D 8D94
-5D1E E1C6
-5D1F 8D95
-5D20 8D96
-5D21 8D97
-5D22 8D98
-5D23 8D99
-5D24 E1C5
-5D25 8D9A
-5D26 E1C3
-5D27 E1C2
-5D28 8D9B
-5D29 B1C0
-5D2A 8D9C
-5D2B 8D9D
-5D2C 8D9E
-5D2D D5B8
-5D2E E1C4
-5D2F 8D9F
-5D30 8DA0
-5D31 8DA1
-5D32 8DA2
-5D33 8DA3
-5D34 E1CB
-5D35 8DA4
-5D36 8DA5
-5D37 8DA6
-5D38 8DA7
-5D39 8DA8
-5D3A 8DA9
-5D3B 8DAA
-5D3C 8DAB
-5D3D E1CC
-5D3E E1CA
-5D3F 8DAC
-5D40 8DAD
-5D41 8DAE
-5D42 8DAF
-5D43 8DB0
-5D44 8DB1
-5D45 8DB2
-5D46 8DB3
-5D47 EFFA
-5D48 8DB4
-5D49 8DB5
-5D4A E1D3
-5D4B E1D2
-5D4C C7B6
-5D4D 8DB6
-5D4E 8DB7
-5D4F 8DB8
-5D50 8DB9
-5D51 8DBA
-5D52 8DBB
-5D53 8DBC
-5D54 8DBD
-5D55 8DBE
-5D56 8DBF
-5D57 8DC0
-5D58 E1C9
-5D59 8DC1
-5D5A 8DC2
-5D5B E1CE
-5D5C 8DC3
-5D5D E1D0
-5D5E 8DC4
-5D5F 8DC5
-5D60 8DC6
-5D61 8DC7
-5D62 8DC8
-5D63 8DC9
-5D64 8DCA
-5D65 8DCB
-5D66 8DCC
-5D67 8DCD
-5D68 8DCE
-5D69 E1D4
-5D6A 8DCF
-5D6B E1D1
-5D6C E1CD
-5D6D 8DD0
-5D6E 8DD1
-5D6F E1CF
-5D70 8DD2
-5D71 8DD3
-5D72 8DD4
-5D73 8DD5
-5D74 E1D5
-5D75 8DD6
-5D76 8DD7
-5D77 8DD8
-5D78 8DD9
-5D79 8DDA
-5D7A 8DDB
-5D7B 8DDC
-5D7C 8DDD
-5D7D 8DDE
-5D7E 8DDF
-5D7F 8DE0
-5D80 8DE1
-5D81 8DE2
-5D82 E1D6
-5D83 8DE3
-5D84 8DE4
-5D85 8DE5
-5D86 8DE6
-5D87 8DE7
-5D88 8DE8
-5D89 8DE9
-5D8A 8DEA
-5D8B 8DEB
-5D8C 8DEC
-5D8D 8DED
-5D8E 8DEE
-5D8F 8DEF
-5D90 8DF0
-5D91 8DF1
-5D92 8DF2
-5D93 8DF3
-5D94 8DF4
-5D95 8DF5
-5D96 8DF6
-5D97 8DF7
-5D98 8DF8
-5D99 E1D7
-5D9A 8DF9
-5D9B 8DFA
-5D9C 8DFB
-5D9D E1D8
-5D9E 8DFC
-5D9F 8DFD
-5DA0 8DFE
-5DA1 8E40
-5DA2 8E41
-5DA3 8E42
-5DA4 8E43
-5DA5 8E44
-5DA6 8E45
-5DA7 8E46
-5DA8 8E47
-5DA9 8E48
-5DAA 8E49
-5DAB 8E4A
-5DAC 8E4B
-5DAD 8E4C
-5DAE 8E4D
-5DAF 8E4E
-5DB0 8E4F
-5DB1 8E50
-5DB2 8E51
-5DB3 8E52
-5DB4 8E53
-5DB5 8E54
-5DB6 8E55
-5DB7 E1DA
-5DB8 8E56
-5DB9 8E57
-5DBA 8E58
-5DBB 8E59
-5DBC 8E5A
-5DBD 8E5B
-5DBE 8E5C
-5DBF 8E5D
-5DC0 8E5E
-5DC1 8E5F
-5DC2 8E60
-5DC3 8E61
-5DC4 8E62
-5DC5 E1DB
-5DC6 8E63
-5DC7 8E64
-5DC8 8E65
-5DC9 8E66
-5DCA 8E67
-5DCB 8E68
-5DCC 8E69
-5DCD CEA1
-5DCE 8E6A
-5DCF 8E6B
-5DD0 8E6C
-5DD1 8E6D
-5DD2 8E6E
-5DD3 8E6F
-5DD4 8E70
-5DD5 8E71
-5DD6 8E72
-5DD7 8E73
-5DD8 8E74
-5DD9 8E75
-5DDA 8E76
-5DDB E7DD
-5DDC 8E77
-5DDD B4A8
-5DDE D6DD
-5DDF 8E78
-5DE0 8E79
-5DE1 D1B2
-5DE2 B3B2
-5DE3 8E7A
-5DE4 8E7B
-5DE5 B9A4
-5DE6 D7F3
-5DE7 C7C9
-5DE8 BEDE
-5DE9 B9AE
-5DEA 8E7C
-5DEB CED7
-5DEC 8E7D
-5DED 8E7E
-5DEE B2EE
-5DEF DBCF
-5DF0 8E80
-5DF1 BCBA
-5DF2 D2D1
-5DF3 CBC8
-5DF4 B0CD
-5DF5 8E81
-5DF6 8E82
-5DF7 CFEF
-5DF8 8E83
-5DF9 8E84
-5DFA 8E85
-5DFB 8E86
-5DFC 8E87
-5DFD D9E3
-5DFE BDED
-5DFF 8E88
-5E00 8E89
-5E01 B1D2
-5E02 CAD0
-5E03 B2BC
-5E04 8E8A
-5E05 CBA7
-5E06 B7AB
-5E07 8E8B
-5E08 CAA6
-5E09 8E8C
-5E0A 8E8D
-5E0B 8E8E
-5E0C CFA3
-5E0D 8E8F
-5E0E 8E90
-5E0F E0F8
-5E10 D5CA
-5E11 E0FB
-5E12 8E91
-5E13 8E92
-5E14 E0FA
-5E15 C5C1
-5E16 CCFB
-5E17 8E93
-5E18 C1B1
-5E19 E0F9
-5E1A D6E3
-5E1B B2AF
-5E1C D6C4
-5E1D B5DB
-5E1E 8E94
-5E1F 8E95
-5E20 8E96
-5E21 8E97
-5E22 8E98
-5E23 8E99
-5E24 8E9A
-5E25 8E9B
-5E26 B4F8
-5E27 D6A1
-5E28 8E9C
-5E29 8E9D
-5E2A 8E9E
-5E2B 8E9F
-5E2C 8EA0
-5E2D CFAF
-5E2E B0EF
-5E2F 8EA1
-5E30 8EA2
-5E31 E0FC
-5E32 8EA3
-5E33 8EA4
-5E34 8EA5
-5E35 8EA6
-5E36 8EA7
-5E37 E1A1
-5E38 B3A3
-5E39 8EA8
-5E3A 8EA9
-5E3B E0FD
-5E3C E0FE
-5E3D C3B1
-5E3E 8EAA
-5E3F 8EAB
-5E40 8EAC
-5E41 8EAD
-5E42 C3DD
-5E43 8EAE
-5E44 E1A2
-5E45 B7F9
-5E46 8EAF
-5E47 8EB0
-5E48 8EB1
-5E49 8EB2
-5E4A 8EB3
-5E4B 8EB4
-5E4C BBCF
-5E4D 8EB5
-5E4E 8EB6
-5E4F 8EB7
-5E50 8EB8
-5E51 8EB9
-5E52 8EBA
-5E53 8EBB
-5E54 E1A3
-5E55 C4BB
-5E56 8EBC
-5E57 8EBD
-5E58 8EBE
-5E59 8EBF
-5E5A 8EC0
-5E5B E1A4
-5E5C 8EC1
-5E5D 8EC2
-5E5E E1A5
-5E5F 8EC3
-5E60 8EC4
-5E61 E1A6
-5E62 B4B1
-5E63 8EC5
-5E64 8EC6
-5E65 8EC7
-5E66 8EC8
-5E67 8EC9
-5E68 8ECA
-5E69 8ECB
-5E6A 8ECC
-5E6B 8ECD
-5E6C 8ECE
-5E6D 8ECF
-5E6E 8ED0
-5E6F 8ED1
-5E70 8ED2
-5E71 8ED3
-5E72 B8C9
-5E73 C6BD
-5E74 C4EA
-5E75 8ED4
-5E76 B2A2
-5E77 8ED5
-5E78 D0D2
-5E79 8ED6
-5E7A E7DB
-5E7B BBC3
-5E7C D3D7
-5E7D D3C4
-5E7E 8ED7
-5E7F B9E3
-5E80 E2CF
-5E81 8ED8
-5E82 8ED9
-5E83 8EDA
-5E84 D7AF
-5E85 8EDB
-5E86 C7EC
-5E87 B1D3
-5E88 8EDC
-5E89 8EDD
-5E8A B4B2
-5E8B E2D1
-5E8C 8EDE
-5E8D 8EDF
-5E8E 8EE0
-5E8F D0F2
-5E90 C2AE
-5E91 E2D0
-5E92 8EE1
-5E93 BFE2
-5E94 D3A6
-5E95 B5D7
-5E96 E2D2
-5E97 B5EA
-5E98 8EE2
-5E99 C3ED
-5E9A B8FD
-5E9B 8EE3
-5E9C B8AE
-5E9D 8EE4
-5E9E C5D3
-5E9F B7CF
-5EA0 E2D4
-5EA1 8EE5
-5EA2 8EE6
-5EA3 8EE7
-5EA4 8EE8
-5EA5 E2D3
-5EA6 B6C8
-5EA7 D7F9
-5EA8 8EE9
-5EA9 8EEA
-5EAA 8EEB
-5EAB 8EEC
-5EAC 8EED
-5EAD CDA5
-5EAE 8EEE
-5EAF 8EEF
-5EB0 8EF0
-5EB1 8EF1
-5EB2 8EF2
-5EB3 E2D8
-5EB4 8EF3
-5EB5 E2D6
-5EB6 CAFC
-5EB7 BFB5
-5EB8 D3B9
-5EB9 E2D5
-5EBA 8EF4
-5EBB 8EF5
-5EBC 8EF6
-5EBD 8EF7
-5EBE E2D7
-5EBF 8EF8
-5EC0 8EF9
-5EC1 8EFA
-5EC2 8EFB
-5EC3 8EFC
-5EC4 8EFD
-5EC5 8EFE
-5EC6 8F40
-5EC7 8F41
-5EC8 8F42
-5EC9 C1AE
-5ECA C0C8
-5ECB 8F43
-5ECC 8F44
-5ECD 8F45
-5ECE 8F46
-5ECF 8F47
-5ED0 8F48
-5ED1 E2DB
-5ED2 E2DA
-5ED3 C0AA
-5ED4 8F49
-5ED5 8F4A
-5ED6 C1CE
-5ED7 8F4B
-5ED8 8F4C
-5ED9 8F4D
-5EDA 8F4E
-5EDB E2DC
-5EDC 8F4F
-5EDD 8F50
-5EDE 8F51
-5EDF 8F52
-5EE0 8F53
-5EE1 8F54
-5EE2 8F55
-5EE3 8F56
-5EE4 8F57
-5EE5 8F58
-5EE6 8F59
-5EE7 8F5A
-5EE8 E2DD
-5EE9 8F5B
-5EEA E2DE
-5EEB 8F5C
-5EEC 8F5D
-5EED 8F5E
-5EEE 8F5F
-5EEF 8F60
-5EF0 8F61
-5EF1 8F62
-5EF2 8F63
-5EF3 8F64
-5EF4 DBC8
-5EF5 8F65
-5EF6 D1D3
-5EF7 CDA2
-5EF8 8F66
-5EF9 8F67
-5EFA BDA8
-5EFB 8F68
-5EFC 8F69
-5EFD 8F6A
-5EFE DEC3
-5EFF D8A5
-5F00 BFAA
-5F01 DBCD
-5F02 D2EC
-5F03 C6FA
-5F04 C5AA
-5F05 8F6B
-5F06 8F6C
-5F07 8F6D
-5F08 DEC4
-5F09 8F6E
-5F0A B1D7
-5F0B DFAE
-5F0C 8F6F
-5F0D 8F70
-5F0E 8F71
-5F0F CABD
-5F10 8F72
-5F11 DFB1
-5F12 8F73
-5F13 B9AD
-5F14 8F74
-5F15 D2FD
-5F16 8F75
-5F17 B8A5
-5F18 BAEB
-5F19 8F76
-5F1A 8F77
-5F1B B3DA
-5F1C 8F78
-5F1D 8F79
-5F1E 8F7A
-5F1F B5DC
-5F20 D5C5
-5F21 8F7B
-5F22 8F7C
-5F23 8F7D
-5F24 8F7E
-5F25 C3D6
-5F26 CFD2
-5F27 BBA1
-5F28 8F80
-5F29 E5F3
-5F2A E5F2
-5F2B 8F81
-5F2C 8F82
-5F2D E5F4
-5F2E 8F83
-5F2F CDE4
-5F30 8F84
-5F31 C8F5
-5F32 8F85
-5F33 8F86
-5F34 8F87
-5F35 8F88
-5F36 8F89
-5F37 8F8A
-5F38 8F8B
-5F39 B5AF
-5F3A C7BF
-5F3B 8F8C
-5F3C E5F6
-5F3D 8F8D
-5F3E 8F8E
-5F3F 8F8F
-5F40 ECB0
-5F41 8F90
-5F42 8F91
-5F43 8F92
-5F44 8F93
-5F45 8F94
-5F46 8F95
-5F47 8F96
-5F48 8F97
-5F49 8F98
-5F4A 8F99
-5F4B 8F9A
-5F4C 8F9B
-5F4D 8F9C
-5F4E 8F9D
-5F4F 8F9E
-5F50 E5E6
-5F51 8F9F
-5F52 B9E9
-5F53 B5B1
-5F54 8FA0
-5F55 C2BC
-5F56 E5E8
-5F57 E5E7
-5F58 E5E9
-5F59 8FA1
-5F5A 8FA2
-5F5B 8FA3
-5F5C 8FA4
-5F5D D2CD
-5F5E 8FA5
-5F5F 8FA6
-5F60 8FA7
-5F61 E1EA
-5F62 D0CE
-5F63 8FA8
-5F64 CDAE
-5F65 8FA9
-5F66 D1E5
-5F67 8FAA
-5F68 8FAB
-5F69 B2CA
-5F6A B1EB
-5F6B 8FAC
-5F6C B1F2
-5F6D C5ED
-5F6E 8FAD
-5F6F 8FAE
-5F70 D5C3
-5F71 D3B0
-5F72 8FAF
-5F73 E1DC
-5F74 8FB0
-5F75 8FB1
-5F76 8FB2
-5F77 E1DD
-5F78 8FB3
-5F79 D2DB
-5F7A 8FB4
-5F7B B3B9
-5F7C B1CB
-5F7D 8FB5
-5F7E 8FB6
-5F7F 8FB7
-5F80 CDF9
-5F81 D5F7
-5F82 E1DE
-5F83 8FB8
-5F84 BEB6
-5F85 B4FD
-5F86 8FB9
-5F87 E1DF
-5F88 BADC
-5F89 E1E0
-5F8A BBB2
-5F8B C2C9
-5F8C E1E1
-5F8D 8FBA
-5F8E 8FBB
-5F8F 8FBC
-5F90 D0EC
-5F91 8FBD
-5F92 CDBD
-5F93 8FBE
-5F94 8FBF
-5F95 E1E2
-5F96 8FC0
-5F97 B5C3
-5F98 C5C7
-5F99 E1E3
-5F9A 8FC1
-5F9B 8FC2
-5F9C E1E4
-5F9D 8FC3
-5F9E 8FC4
-5F9F 8FC5
-5FA0 8FC6
-5FA1 D3F9
-5FA2 8FC7
-5FA3 8FC8
-5FA4 8FC9
-5FA5 8FCA
-5FA6 8FCB
-5FA7 8FCC
-5FA8 E1E5
-5FA9 8FCD
-5FAA D1AD
-5FAB 8FCE
-5FAC 8FCF
-5FAD E1E6
-5FAE CEA2
-5FAF 8FD0
-5FB0 8FD1
-5FB1 8FD2
-5FB2 8FD3
-5FB3 8FD4
-5FB4 8FD5
-5FB5 E1E7
-5FB6 8FD6
-5FB7 B5C2
-5FB8 8FD7
-5FB9 8FD8
-5FBA 8FD9
-5FBB 8FDA
-5FBC E1E8
-5FBD BBD5
-5FBE 8FDB
-5FBF 8FDC
-5FC0 8FDD
-5FC1 8FDE
-5FC2 8FDF
-5FC3 D0C4
-5FC4 E2E0
-5FC5 B1D8
-5FC6 D2E4
-5FC7 8FE0
-5FC8 8FE1
-5FC9 E2E1
-5FCA 8FE2
-5FCB 8FE3
-5FCC BCC9
-5FCD C8CC
-5FCE 8FE4
-5FCF E2E3
-5FD0 ECFE
-5FD1 ECFD
-5FD2 DFAF
-5FD3 8FE5
-5FD4 8FE6
-5FD5 8FE7
-5FD6 E2E2
-5FD7 D6BE
-5FD8 CDFC
-5FD9 C3A6
-5FDA 8FE8
-5FDB 8FE9
-5FDC 8FEA
-5FDD E3C3
-5FDE 8FEB
-5FDF 8FEC
-5FE0 D6D2
-5FE1 E2E7
-5FE2 8FED
-5FE3 8FEE
-5FE4 E2E8
-5FE5 8FEF
-5FE6 8FF0
-5FE7 D3C7
-5FE8 8FF1
-5FE9 8FF2
-5FEA E2EC
-5FEB BFEC
-5FEC 8FF3
-5FED E2ED
-5FEE E2E5
-5FEF 8FF4
-5FF0 8FF5
-5FF1 B3C0
-5FF2 8FF6
-5FF3 8FF7
-5FF4 8FF8
-5FF5 C4EE
-5FF6 8FF9
-5FF7 8FFA
-5FF8 E2EE
-5FF9 8FFB
-5FFA 8FFC
-5FFB D0C3
-5FFC 8FFD
-5FFD BAF6
-5FFE E2E9
-5FFF B7DE
-6000 BBB3
-6001 CCAC
-6002 CBCB
-6003 E2E4
-6004 E2E6
-6005 E2EA
-6006 E2EB
-6007 8FFE
-6008 9040
-6009 9041
-600A E2F7
-600B 9042
-600C 9043
-600D E2F4
-600E D4F5
-600F E2F3
-6010 9044
-6011 9045
-6012 C5AD
-6013 9046
-6014 D5FA
-6015 C5C2
-6016 B2C0
-6017 9047
-6018 9048
-6019 E2EF
-601A 9049
-601B E2F2
-601C C1AF
-601D CBBC
-601E 904A
-601F 904B
-6020 B5A1
-6021 E2F9
-6022 904C
-6023 904D
-6024 904E
-6025 BCB1
-6026 E2F1
-6027 D0D4
-6028 D4B9
-6029 E2F5
-602A B9D6
-602B E2F6
-602C 904F
-602D 9050
-602E 9051
-602F C7D3
-6030 9052
-6031 9053
-6032 9054
-6033 9055
-6034 9056
-6035 E2F0
-6036 9057
-6037 9058
-6038 9059
-6039 905A
-603A 905B
-603B D7DC
-603C EDA1
-603D 905C
-603E 905D
-603F E2F8
-6040 905E
-6041 EDA5
-6042 E2FE
-6043 CAD1
-6044 905F
-6045 9060
-6046 9061
-6047 9062
-6048 9063
-6049 9064
-604A 9065
-604B C1B5
-604C 9066
-604D BBD0
-604E 9067
-604F 9068
-6050 BFD6
-6051 9069
-6052 BAE3
-6053 906A
-6054 906B
-6055 CBA1
-6056 906C
-6057 906D
-6058 906E
-6059 EDA6
-605A EDA3
-605B 906F
-605C 9070
-605D EDA2
-605E 9071
-605F 9072
-6060 9073
-6061 9074
-6062 BBD6
-6063 EDA7
-6064 D0F4
-6065 9075
-6066 9076
-6067 EDA4
-6068 BADE
-6069 B6F7
-606A E3A1
-606B B6B2
-606C CCF1
-606D B9A7
-606E 9077
-606F CFA2
-6070 C7A1
-6071 9078
-6072 9079
-6073 BFD2
-6074 907A
-6075 907B
-6076 B6F1
-6077 907C
-6078 E2FA
-6079 E2FB
-607A E2FD
-607B E2FC
-607C C4D5
-607D E3A2
-607E 907D
-607F D3C1
-6080 907E
-6081 9080
-6082 9081
-6083 E3A7
-6084 C7C4
-6085 9082
-6086 9083
-6087 9084
-6088 9085
-6089 CFA4
-608A 9086
-608B 9087
-608C E3A9
-608D BAB7
-608E 9088
-608F 9089
-6090 908A
-6091 908B
-6092 E3A8
-6093 908C
-6094 BBDA
-6095 908D
-6096 E3A3
-6097 908E
-6098 908F
-6099 9090
-609A E3A4
-609B E3AA
-609C 9091
-609D E3A6
-609E 9092
-609F CEF2
-60A0 D3C6
-60A1 9093
-60A2 9094
-60A3 BBBC
-60A4 9095
-60A5 9096
-60A6 D4C3
-60A7 9097
-60A8 C4FA
-60A9 9098
-60AA 9099
-60AB EDA8
-60AC D0FC
-60AD E3A5
-60AE 909A
-60AF C3F5
-60B0 909B
-60B1 E3AD
-60B2 B1AF
-60B3 909C
-60B4 E3B2
-60B5 909D
-60B6 909E
-60B7 909F
-60B8 BCC2
-60B9 90A0
-60BA 90A1
-60BB E3AC
-60BC B5BF
-60BD 90A2
-60BE 90A3
-60BF 90A4
-60C0 90A5
-60C1 90A6
-60C2 90A7
-60C3 90A8
-60C4 90A9
-60C5 C7E9
-60C6 E3B0
-60C7 90AA
-60C8 90AB
-60C9 90AC
-60CA BEAA
-60CB CDEF
-60CC 90AD
-60CD 90AE
-60CE 90AF
-60CF 90B0
-60D0 90B1
-60D1 BBF3
-60D2 90B2
-60D3 90B3
-60D4 90B4
-60D5 CCE8
-60D6 90B5
-60D7 90B6
-60D8 E3AF
-60D9 90B7
-60DA E3B1
-60DB 90B8
-60DC CFA7
-60DD E3AE
-60DE 90B9
-60DF CEA9
-60E0 BBDD
-60E1 90BA
-60E2 90BB
-60E3 90BC
-60E4 90BD
-60E5 90BE
-60E6 B5EB
-60E7 BEE5
-60E8 B2D2
-60E9 B3CD
-60EA 90BF
-60EB B1B9
-60EC E3AB
-60ED B2D1
-60EE B5AC
-60EF B9DF
-60F0 B6E8
-60F1 90C0
-60F2 90C1
-60F3 CFEB
-60F4 E3B7
-60F5 90C2
-60F6 BBCC
-60F7 90C3
-60F8 90C4
-60F9 C8C7
-60FA D0CA
-60FB 90C5
-60FC 90C6
-60FD 90C7
-60FE 90C8
-60FF 90C9
-6100 E3B8
-6101 B3EE
-6102 90CA
-6103 90CB
-6104 90CC
-6105 90CD
-6106 EDA9
-6107 90CE
-6108 D3FA
-6109 D3E4
-610A 90CF
-610B 90D0
-610C 90D1
-610D EDAA
-610E E3B9
-610F D2E2
-6110 90D2
-6111 90D3
-6112 90D4
-6113 90D5
-6114 90D6
-6115 E3B5
-6116 90D7
-6117 90D8
-6118 90D9
-6119 90DA
-611A D3DE
-611B 90DB
-611C 90DC
-611D 90DD
-611E 90DE
-611F B8D0
-6120 E3B3
-6121 90DF
-6122 90E0
-6123 E3B6
-6124 B7DF
-6125 90E1
-6126 E3B4
-6127 C0A2
-6128 90E2
-6129 90E3
-612A 90E4
-612B E3BA
-612C 90E5
-612D 90E6
-612E 90E7
-612F 90E8
-6130 90E9
-6131 90EA
-6132 90EB
-6133 90EC
-6134 90ED
-6135 90EE
-6136 90EF
-6137 90F0
-6138 90F1
-6139 90F2
-613A 90F3
-613B 90F4
-613C 90F5
-613D 90F6
-613E 90F7
-613F D4B8
-6140 90F8
-6141 90F9
-6142 90FA
-6143 90FB
-6144 90FC
-6145 90FD
-6146 90FE
-6147 9140
-6148 B4C8
-6149 9141
-614A E3BB
-614B 9142
-614C BBC5
-614D 9143
-614E C9F7
-614F 9144
-6150 9145
-6151 C9E5
-6152 9146
-6153 9147
-6154 9148
-6155 C4BD
-6156 9149
-6157 914A
-6158 914B
-6159 914C
-615A 914D
-615B 914E
-615C 914F
-615D EDAB
-615E 9150
-615F 9151
-6160 9152
-6161 9153
-6162 C2FD
-6163 9154
-6164 9155
-6165 9156
-6166 9157
-6167 BBDB
-6168 BFAE
-6169 9158
-616A 9159
-616B 915A
-616C 915B
-616D 915C
-616E 915D
-616F 915E
-6170 CEBF
-6171 915F
-6172 9160
-6173 9161
-6174 9162
-6175 E3BC
-6176 9163
-6177 BFB6
-6178 9164
-6179 9165
-617A 9166
-617B 9167
-617C 9168
-617D 9169
-617E 916A
-617F 916B
-6180 916C
-6181 916D
-6182 916E
-6183 916F
-6184 9170
-6185 9171
-6186 9172
-6187 9173
-6188 9174
-6189 9175
-618A 9176
-618B B1EF
-618C 9177
-618D 9178
-618E D4F7
-618F 9179
-6190 917A
-6191 917B
-6192 917C
-6193 917D
-6194 E3BE
-6195 917E
-6196 9180
-6197 9181
-6198 9182
-6199 9183
-619A 9184
-619B 9185
-619C 9186
-619D EDAD
-619E 9187
-619F 9188
-61A0 9189
-61A1 918A
-61A2 918B
-61A3 918C
-61A4 918D
-61A5 918E
-61A6 918F
-61A7 E3BF
-61A8 BAA9
-61A9 EDAC
-61AA 9190
-61AB 9191
-61AC E3BD
-61AD 9192
-61AE 9193
-61AF 9194
-61B0 9195
-61B1 9196
-61B2 9197
-61B3 9198
-61B4 9199
-61B5 919A
-61B6 919B
-61B7 E3C0
-61B8 919C
-61B9 919D
-61BA 919E
-61BB 919F
-61BC 91A0
-61BD 91A1
-61BE BAB6
-61BF 91A2
-61C0 91A3
-61C1 91A4
-61C2 B6AE
-61C3 91A5
-61C4 91A6
-61C5 91A7
-61C6 91A8
-61C7 91A9
-61C8 D0B8
-61C9 91AA
-61CA B0C3
-61CB EDAE
-61CC 91AB
-61CD 91AC
-61CE 91AD
-61CF 91AE
-61D0 91AF
-61D1 EDAF
-61D2 C0C1
-61D3 91B0
-61D4 E3C1
-61D5 91B1
-61D6 91B2
-61D7 91B3
-61D8 91B4
-61D9 91B5
-61DA 91B6
-61DB 91B7
-61DC 91B8
-61DD 91B9
-61DE 91BA
-61DF 91BB
-61E0 91BC
-61E1 91BD
-61E2 91BE
-61E3 91BF
-61E4 91C0
-61E5 91C1
-61E6 C5B3
-61E7 91C2
-61E8 91C3
-61E9 91C4
-61EA 91C5
-61EB 91C6
-61EC 91C7
-61ED 91C8
-61EE 91C9
-61EF 91CA
-61F0 91CB
-61F1 91CC
-61F2 91CD
-61F3 91CE
-61F4 91CF
-61F5 E3C2
-61F6 91D0
-61F7 91D1
-61F8 91D2
-61F9 91D3
-61FA 91D4
-61FB 91D5
-61FC 91D6
-61FD 91D7
-61FE 91D8
-61FF DCB2
-6200 91D9
-6201 91DA
-6202 91DB
-6203 91DC
-6204 91DD
-6205 91DE
-6206 EDB0
-6207 91DF
-6208 B8EA
-6209 91E0
-620A CEEC
-620B EAA7
-620C D0E7
-620D CAF9
-620E C8D6
-620F CFB7
-6210 B3C9
-6211 CED2
-6212 BDE4
-6213 91E1
-6214 91E2
-6215 E3DE
-6216 BBF2
-6217 EAA8
-6218 D5BD
-6219 91E3
-621A C6DD
-621B EAA9
-621C 91E4
-621D 91E5
-621E 91E6
-621F EAAA
-6220 91E7
-6221 EAAC
-6222 EAAB
-6223 91E8
-6224 EAAE
-6225 EAAD
-6226 91E9
-6227 91EA
-6228 91EB
-6229 91EC
-622A BDD8
-622B 91ED
-622C EAAF
-622D 91EE
-622E C2BE
-622F 91EF
-6230 91F0
-6231 91F1
-6232 91F2
-6233 B4C1
-6234 B4F7
-6235 91F3
-6236 91F4
-6237 BBA7
-6238 91F5
-6239 91F6
-623A 91F7
-623B 91F8
-623C 91F9
-623D ECE6
-623E ECE5
-623F B7BF
-6240 CBF9
-6241 B1E2
-6242 91FA
-6243 ECE7
-6244 91FB
-6245 91FC
-6246 91FD
-6247 C9C8
-6248 ECE8
-6249 ECE9
-624A 91FE
-624B CAD6
-624C DED0
-624D B2C5
-624E D4FA
-624F 9240
-6250 9241
-6251 C6CB
-6252 B0C7
-6253 B4F2
-6254 C8D3
-6255 9242
-6256 9243
-6257 9244
-6258 CDD0
-6259 9245
-625A 9246
-625B BFB8
-625C 9247
-625D 9248
-625E 9249
-625F 924A
-6260 924B
-6261 924C
-6262 924D
-6263 BFDB
-6264 924E
-6265 924F
-6266 C7A4
-6267 D6B4
-6268 9250
-6269 C0A9
-626A DED1
-626B C9A8
-626C D1EF
-626D C5A4
-626E B0E7
-626F B3B6
-6270 C8C5
-6271 9251
-6272 9252
-6273 B0E2
-6274 9253
-6275 9254
-6276 B7F6
-6277 9255
-6278 9256
-6279 C5FA
-627A 9257
-627B 9258
-627C B6F3
-627D 9259
-627E D5D2
-627F B3D0
-6280 BCBC
-6281 925A
-6282 925B
-6283 925C
-6284 B3AD
-6285 925D
-6286 925E
-6287 925F
-6288 9260
-6289 BEF1
-628A B0D1
-628B 9261
-628C 9262
-628D 9263
-628E 9264
-628F 9265
-6290 9266
-6291 D2D6
-6292 CAE3
-6293 D7A5
-6294 9267
-6295 CDB6
-6296 B6B6
-6297 BFB9
-6298 D5DB
-6299 9268
-629A B8A7
-629B C5D7
-629C 9269
-629D 926A
-629E 926B
-629F DED2
-62A0 BFD9
-62A1 C2D5
-62A2 C7C0
-62A3 926C
-62A4 BBA4
-62A5 B1A8
-62A6 926D
-62A7 926E
-62A8 C5EA
-62A9 926F
-62AA 9270
-62AB C5FB
-62AC CCA7
-62AD 9271
-62AE 9272
-62AF 9273
-62B0 9274
-62B1 B1A7
-62B2 9275
-62B3 9276
-62B4 9277
-62B5 B5D6
-62B6 9278
-62B7 9279
-62B8 927A
-62B9 C4A8
-62BA 927B
-62BB DED3
-62BC D1BA
-62BD B3E9
-62BE 927C
-62BF C3F2
-62C0 927D
-62C1 927E
-62C2 B7F7
-62C3 9280
-62C4 D6F4
-62C5 B5A3
-62C6 B2F0
-62C7 C4B4
-62C8 C4E9
-62C9 C0AD
-62CA DED4
-62CB 9281
-62CC B0E8
-62CD C5C4
-62CE C1E0
-62CF 9282
-62D0 B9D5
-62D1 9283
-62D2 BEDC
-62D3 CDD8
-62D4 B0CE
-62D5 9284
-62D6 CDCF
-62D7 DED6
-62D8 BED0
-62D9 D7BE
-62DA DED5
-62DB D5D0
-62DC B0DD
-62DD 9285
-62DE 9286
-62DF C4E2
-62E0 9287
-62E1 9288
-62E2 C2A3
-62E3 BCF0
-62E4 9289
-62E5 D3B5
-62E6 C0B9
-62E7 C5A1
-62E8 B2A6
-62E9 D4F1
-62EA 928A
-62EB 928B
-62EC C0A8
-62ED CAC3
-62EE DED7
-62EF D5FC
-62F0 928C
-62F1 B9B0
-62F2 928D
-62F3 C8AD
-62F4 CBA9
-62F5 928E
-62F6 DED9
-62F7 BFBD
-62F8 928F
-62F9 9290
-62FA 9291
-62FB 9292
-62FC C6B4
-62FD D7A7
-62FE CAB0
-62FF C4C3
-6300 9293
-6301 B3D6
-6302 B9D2
-6303 9294
-6304 9295
-6305 9296
-6306 9297
-6307 D6B8
-6308 EAFC
-6309 B0B4
-630A 9298
-630B 9299
-630C 929A
-630D 929B
-630E BFE6
-630F 929C
-6310 929D
-6311 CCF4
-6312 929E
-6313 929F
-6314 92A0
-6315 92A1
-6316 CDDA
-6317 92A2
-6318 92A3
-6319 92A4
-631A D6BF
-631B C2CE
-631C 92A5
-631D CECE
-631E CCA2
-631F D0AE
-6320 C4D3
-6321 B5B2
-6322 DED8
-6323 D5F5
-6324 BCB7
-6325 BBD3
-6326 92A6
-6327 92A7
-6328 B0A4
-6329 92A8
-632A C5B2
-632B B4EC
-632C 92A9
-632D 92AA
-632E 92AB
-632F D5F1
-6330 92AC
-6331 92AD
-6332 EAFD
-6333 92AE
-6334 92AF
-6335 92B0
-6336 92B1
-6337 92B2
-6338 92B3
-6339 DEDA
-633A CDA6
-633B 92B4
-633C 92B5
-633D CDEC
-633E 92B6
-633F 92B7
-6340 92B8
-6341 92B9
-6342 CEE6
-6343 DEDC
-6344 92BA
-6345 CDB1
-6346 C0A6
-6347 92BB
-6348 92BC
-6349 D7BD
-634A 92BD
-634B DEDB
-634C B0C6
-634D BAB4
-634E C9D3
-634F C4F3
-6350 BEE8
-6351 92BE
-6352 92BF
-6353 92C0
-6354 92C1
-6355 B2B6
-6356 92C2
-6357 92C3
-6358 92C4
-6359 92C5
-635A 92C6
-635B 92C7
-635C 92C8
-635D 92C9
-635E C0CC
-635F CBF0
-6360 92CA
-6361 BCF1
-6362 BBBB
-6363 B5B7
-6364 92CB
-6365 92CC
-6366 92CD
-6367 C5F5
-6368 92CE
-6369 DEE6
-636A 92CF
-636B 92D0
-636C 92D1
-636D DEE3
-636E BEDD
-636F 92D2
-6370 92D3
-6371 DEDF
-6372 92D4
-6373 92D5
-6374 92D6
-6375 92D7
-6376 B4B7
-6377 BDDD
-6378 92D8
-6379 92D9
-637A DEE0
-637B C4ED
-637C 92DA
-637D 92DB
-637E 92DC
-637F 92DD
-6380 CFC6
-6381 92DE
-6382 B5E0
-6383 92DF
-6384 92E0
-6385 92E1
-6386 92E2
-6387 B6DE
-6388 CADA
-6389 B5F4
-638A DEE5
-638B 92E3
-638C D5C6
-638D 92E4
-638E DEE1
-638F CCCD
-6390 C6FE
-6391 92E5
-6392 C5C5
-6393 92E6
-6394 92E7
-6395 92E8
-6396 D2B4
-6397 92E9
-6398 BEF2
-6399 92EA
-639A 92EB
-639B 92EC
-639C 92ED
-639D 92EE
-639E 92EF
-639F 92F0
-63A0 C2D3
-63A1 92F1
-63A2 CCBD
-63A3 B3B8
-63A4 92F2
-63A5 BDD3
-63A6 92F3
-63A7 BFD8
-63A8 CDC6
-63A9 D1DA
-63AA B4EB
-63AB 92F4
-63AC DEE4
-63AD DEDD
-63AE DEE7
-63AF 92F5
-63B0 EAFE
-63B1 92F6
-63B2 92F7
-63B3 C2B0
-63B4 DEE2
-63B5 92F8
-63B6 92F9
-63B7 D6C0
-63B8 B5A7
-63B9 92FA
-63BA B2F4
-63BB 92FB
-63BC DEE8
-63BD 92FC
-63BE DEF2
-63BF 92FD
-63C0 92FE
-63C1 9340
-63C2 9341
-63C3 9342
-63C4 DEED
-63C5 9343
-63C6 DEF1
-63C7 9344
-63C8 9345
-63C9 C8E0
-63CA 9346
-63CB 9347
-63CC 9348
-63CD D7E1
-63CE DEEF
-63CF C3E8
-63D0 CCE1
-63D1 9349
-63D2 B2E5
-63D3 934A
-63D4 934B
-63D5 934C
-63D6 D2BE
-63D7 934D
-63D8 934E
-63D9 934F
-63DA 9350
-63DB 9351
-63DC 9352
-63DD 9353
-63DE DEEE
-63DF 9354
-63E0 DEEB
-63E1 CED5
-63E2 9355
-63E3 B4A7
-63E4 9356
-63E5 9357
-63E6 9358
-63E7 9359
-63E8 935A
-63E9 BFAB
-63EA BEBE
-63EB 935B
-63EC 935C
-63ED BDD2
-63EE 935D
-63EF 935E
-63F0 935F
-63F1 9360
-63F2 DEE9
-63F3 9361
-63F4 D4AE
-63F5 9362
-63F6 DEDE
-63F7 9363
-63F8 DEEA
-63F9 9364
-63FA 9365
-63FB 9366
-63FC 9367
-63FD C0BF
-63FE 9368
-63FF DEEC
-6400 B2F3
-6401 B8E9
-6402 C2A7
-6403 9369
-6404 936A
-6405 BDC1
-6406 936B
-6407 936C
-6408 936D
-6409 936E
-640A 936F
-640B DEF5
-640C DEF8
-640D 9370
-640E 9371
-640F B2AB
-6410 B4A4
-6411 9372
-6412 9373
-6413 B4EA
-6414 C9A6
-6415 9374
-6416 9375
-6417 9376
-6418 9377
-6419 9378
-641A 9379
-641B DEF6
-641C CBD1
-641D 937A
-641E B8E3
-641F 937B
-6420 DEF7
-6421 DEFA
-6422 937C
-6423 937D
-6424 937E
-6425 9380
-6426 DEF9
-6427 9381
-6428 9382
-6429 9383
-642A CCC2
-642B 9384
-642C B0E1
-642D B4EE
-642E 9385
-642F 9386
-6430 9387
-6431 9388
-6432 9389
-6433 938A
-6434 E5BA
-6435 938B
-6436 938C
-6437 938D
-6438 938E
-6439 938F
-643A D0AF
-643B 9390
-643C 9391
-643D B2EB
-643E 9392
-643F EBA1
-6440 9393
-6441 DEF4
-6442 9394
-6443 9395
-6444 C9E3
-6445 DEF3
-6446 B0DA
-6447 D2A1
-6448 B1F7
-6449 9396
-644A CCAF
-644B 9397
-644C 9398
-644D 9399
-644E 939A
-644F 939B
-6450 939C
-6451 939D
-6452 DEF0
-6453 939E
-6454 CBA4
-6455 939F
-6456 93A0
-6457 93A1
-6458 D5AA
-6459 93A2
-645A 93A3
-645B 93A4
-645C 93A5
-645D 93A6
-645E DEFB
-645F 93A7
-6460 93A8
-6461 93A9
-6462 93AA
-6463 93AB
-6464 93AC
-6465 93AD
-6466 93AE
-6467 B4DD
-6468 93AF
-6469 C4A6
-646A 93B0
-646B 93B1
-646C 93B2
-646D DEFD
-646E 93B3
-646F 93B4
-6470 93B5
-6471 93B6
-6472 93B7
-6473 93B8
-6474 93B9
-6475 93BA
-6476 93BB
-6477 93BC
-6478 C3FE
-6479 C4A1
-647A DFA1
-647B 93BD
-647C 93BE
-647D 93BF
-647E 93C0
-647F 93C1
-6480 93C2
-6481 93C3
-6482 C1CC
-6483 93C4
-6484 DEFC
-6485 BEEF
-6486 93C5
-6487 C6B2
-6488 93C6
-6489 93C7
-648A 93C8
-648B 93C9
-648C 93CA
-648D 93CB
-648E 93CC
-648F 93CD
-6490 93CE
-6491 B3C5
-6492 C8F6
-6493 93CF
-6494 93D0
-6495 CBBA
-6496 DEFE
-6497 93D1
-6498 93D2
-6499 DFA4
-649A 93D3
-649B 93D4
-649C 93D5
-649D 93D6
-649E D7B2
-649F 93D7
-64A0 93D8
-64A1 93D9
-64A2 93DA
-64A3 93DB
-64A4 B3B7
-64A5 93DC
-64A6 93DD
-64A7 93DE
-64A8 93DF
-64A9 C1C3
-64AA 93E0
-64AB 93E1
-64AC C7CB
-64AD B2A5
-64AE B4E9
-64AF 93E2
-64B0 D7AB
-64B1 93E3
-64B2 93E4
-64B3 93E5
-64B4 93E6
-64B5 C4EC
-64B6 93E7
-64B7 DFA2
-64B8 DFA3
-64B9 93E8
-64BA DFA5
-64BB 93E9
-64BC BAB3
-64BD 93EA
-64BE 93EB
-64BF 93EC
-64C0 DFA6
-64C1 93ED
-64C2 C0DE
-64C3 93EE
-64C4 93EF
-64C5 C9C3
-64C6 93F0
-64C7 93F1
-64C8 93F2
-64C9 93F3
-64CA 93F4
-64CB 93F5
-64CC 93F6
-64CD B2D9
-64CE C7E6
-64CF 93F7
-64D0 DFA7
-64D1 93F8
-64D2 C7DC
-64D3 93F9
-64D4 93FA
-64D5 93FB
-64D6 93FC
-64D7 DFA8
-64D8 EBA2
-64D9 93FD
-64DA 93FE
-64DB 9440
-64DC 9441
-64DD 9442
-64DE CBD3
-64DF 9443
-64E0 9444
-64E1 9445
-64E2 DFAA
-64E3 9446
-64E4 DFA9
-64E5 9447
-64E6 B2C1
-64E7 9448
-64E8 9449
-64E9 944A
-64EA 944B
-64EB 944C
-64EC 944D
-64ED 944E
-64EE 944F
-64EF 9450
-64F0 9451
-64F1 9452
-64F2 9453
-64F3 9454
-64F4 9455
-64F5 9456
-64F6 9457
-64F7 9458
-64F8 9459
-64F9 945A
-64FA 945B
-64FB 945C
-64FC 945D
-64FD 945E
-64FE 945F
-64FF 9460
-6500 C5CA
-6501 9461
-6502 9462
-6503 9463
-6504 9464
-6505 9465
-6506 9466
-6507 9467
-6508 9468
-6509 DFAB
-650A 9469
-650B 946A
-650C 946B
-650D 946C
-650E 946D
-650F 946E
-6510 946F
-6511 9470
-6512 D4DC
-6513 9471
-6514 9472
-6515 9473
-6516 9474
-6517 9475
-6518 C8C1
-6519 9476
-651A 9477
-651B 9478
-651C 9479
-651D 947A
-651E 947B
-651F 947C
-6520 947D
-6521 947E
-6522 9480
-6523 9481
-6524 9482
-6525 DFAC
-6526 9483
-6527 9484
-6528 9485
-6529 9486
-652A 9487
-652B BEF0
-652C 9488
-652D 9489
-652E DFAD
-652F D6A7
-6530 948A
-6531 948B
-6532 948C
-6533 948D
-6534 EAB7
-6535 EBB6
-6536 CAD5
-6537 948E
-6538 D8FC
-6539 B8C4
-653A 948F
-653B B9A5
-653C 9490
-653D 9491
-653E B7C5
-653F D5FE
-6540 9492
-6541 9493
-6542 9494
-6543 9495
-6544 9496
-6545 B9CA
-6546 9497
-6547 9498
-6548 D0A7
-6549 F4CD
-654A 9499
-654B 949A
-654C B5D0
-654D 949B
-654E 949C
-654F C3F4
-6550 949D
-6551 BEC8
-6552 949E
-6553 949F
-6554 94A0
-6555 EBB7
-6556 B0BD
-6557 94A1
-6558 94A2
-6559 BDCC
-655A 94A3
-655B C1B2
-655C 94A4
-655D B1D6
-655E B3A8
-655F 94A5
-6560 94A6
-6561 94A7
-6562 B8D2
-6563 C9A2
-6564 94A8
-6565 94A9
-6566 B6D8
-6567 94AA
-6568 94AB
-6569 94AC
-656A 94AD
-656B EBB8
-656C BEB4
-656D 94AE
-656E 94AF
-656F 94B0
-6570 CAFD
-6571 94B1
-6572 C7C3
-6573 94B2
-6574 D5FB
-6575 94B3
-6576 94B4
-6577 B7F3
-6578 94B5
-6579 94B6
-657A 94B7
-657B 94B8
-657C 94B9
-657D 94BA
-657E 94BB
-657F 94BC
-6580 94BD
-6581 94BE
-6582 94BF
-6583 94C0
-6584 94C1
-6585 94C2
-6586 94C3
-6587 CEC4
-6588 94C4
-6589 94C5
-658A 94C6
-658B D5AB
-658C B1F3
-658D 94C7
-658E 94C8
-658F 94C9
-6590 ECB3
-6591 B0DF
-6592 94CA
-6593 ECB5
-6594 94CB
-6595 94CC
-6596 94CD
-6597 B6B7
-6598 94CE
-6599 C1CF
-659A 94CF
-659B F5FA
-659C D0B1
-659D 94D0
-659E 94D1
-659F D5E5
-65A0 94D2
-65A1 CED3
-65A2 94D3
-65A3 94D4
-65A4 BDEF
-65A5 B3E2
-65A6 94D5
-65A7 B8AB
-65A8 94D6
-65A9 D5B6
-65AA 94D7
-65AB EDBD
-65AC 94D8
-65AD B6CF
-65AE 94D9
-65AF CBB9
-65B0 D0C2
-65B1 94DA
-65B2 94DB
-65B3 94DC
-65B4 94DD
-65B5 94DE
-65B6 94DF
-65B7 94E0
-65B8 94E1
-65B9 B7BD
-65BA 94E2
-65BB 94E3
-65BC ECB6
-65BD CAA9
-65BE 94E4
-65BF 94E5
-65C0 94E6
-65C1 C5D4
-65C2 94E7
-65C3 ECB9
-65C4 ECB8
-65C5 C2C3
-65C6 ECB7
-65C7 94E8
-65C8 94E9
-65C9 94EA
-65CA 94EB
-65CB D0FD
-65CC ECBA
-65CD 94EC
-65CE ECBB
-65CF D7E5
-65D0 94ED
-65D1 94EE
-65D2 ECBC
-65D3 94EF
-65D4 94F0
-65D5 94F1
-65D6 ECBD
-65D7 C6EC
-65D8 94F2
-65D9 94F3
-65DA 94F4
-65DB 94F5
-65DC 94F6
-65DD 94F7
-65DE 94F8
-65DF 94F9
-65E0 CEDE
-65E1 94FA
-65E2 BCC8
-65E3 94FB
-65E4 94FC
-65E5 C8D5
-65E6 B5A9
-65E7 BEC9
-65E8 D6BC
-65E9 D4E7
-65EA 94FD
-65EB 94FE
-65EC D1AE
-65ED D0F1
-65EE EAB8
-65EF EAB9
-65F0 EABA
-65F1 BAB5
-65F2 9540
-65F3 9541
-65F4 9542
-65F5 9543
-65F6 CAB1
-65F7 BFF5
-65F8 9544
-65F9 9545
-65FA CDFA
-65FB 9546
-65FC 9547
-65FD 9548
-65FE 9549
-65FF 954A
-6600 EAC0
-6601 954B
-6602 B0BA
-6603 EABE
-6604 954C
-6605 954D
-6606 C0A5
-6607 954E
-6608 954F
-6609 9550
-660A EABB
-660B 9551
-660C B2FD
-660D 9552
-660E C3F7
-660F BBE8
-6610 9553
-6611 9554
-6612 9555
-6613 D2D7
-6614 CEF4
-6615 EABF
-6616 9556
-6617 9557
-6618 9558
-6619 EABC
-661A 9559
-661B 955A
-661C 955B
-661D EAC3
-661E 955C
-661F D0C7
-6620 D3B3
-6621 955D
-6622 955E
-6623 955F
-6624 9560
-6625 B4BA
-6626 9561
-6627 C3C1
-6628 D7F2
-6629 9562
-662A 9563
-662B 9564
-662C 9565
-662D D5D1
-662E 9566
-662F CAC7
-6630 9567
-6631 EAC5
-6632 9568
-6633 9569
-6634 EAC4
-6635 EAC7
-6636 EAC6
-6637 956A
-6638 956B
-6639 956C
-663A 956D
-663B 956E
-663C D6E7
-663D 956F
-663E CFD4
-663F 9570
-6640 9571
-6641 EACB
-6642 9572
-6643 BBCE
-6644 9573
-6645 9574
-6646 9575
-6647 9576
-6648 9577
-6649 9578
-664A 9579
-664B BDFA
-664C C9CE
-664D 957A
-664E 957B
-664F EACC
-6650 957C
-6651 957D
-6652 C9B9
-6653 CFFE
-6654 EACA
-6655 D4CE
-6656 EACD
-6657 EACF
-6658 957E
-6659 9580
-665A CDED
-665B 9581
-665C 9582
-665D 9583
-665E 9584
-665F EAC9
-6660 9585
-6661 EACE
-6662 9586
-6663 9587
-6664 CEEE
-6665 9588
-6666 BBDE
-6667 9589
-6668 B3BF
-6669 958A
-666A 958B
-666B 958C
-666C 958D
-666D 958E
-666E C6D5
-666F BEB0
-6670 CEFA
-6671 958F
-6672 9590
-6673 9591
-6674 C7E7
-6675 9592
-6676 BEA7
-6677 EAD0
-6678 9593
-6679 9594
-667A D6C7
-667B 9595
-667C 9596
-667D 9597
-667E C1C0
-667F 9598
-6680 9599
-6681 959A
-6682 D4DD
-6683 959B
-6684 EAD1
-6685 959C
-6686 959D
-6687 CFBE
-6688 959E
-6689 959F
-668A 95A0
-668B 95A1
-668C EAD2
-668D 95A2
-668E 95A3
-668F 95A4
-6690 95A5
-6691 CAEE
-6692 95A6
-6693 95A7
-6694 95A8
-6695 95A9
-6696 C5AF
-6697 B0B5
-6698 95AA
-6699 95AB
-669A 95AC
-669B 95AD
-669C 95AE
-669D EAD4
-669E 95AF
-669F 95B0
-66A0 95B1
-66A1 95B2
-66A2 95B3
-66A3 95B4
-66A4 95B5
-66A5 95B6
-66A6 95B7
-66A7 EAD3
-66A8 F4DF
-66A9 95B8
-66AA 95B9
-66AB 95BA
-66AC 95BB
-66AD 95BC
-66AE C4BA
-66AF 95BD
-66B0 95BE
-66B1 95BF
-66B2 95C0
-66B3 95C1
-66B4 B1A9
-66B5 95C2
-66B6 95C3
-66B7 95C4
-66B8 95C5
-66B9 E5DF
-66BA 95C6
-66BB 95C7
-66BC 95C8
-66BD 95C9
-66BE EAD5
-66BF 95CA
-66C0 95CB
-66C1 95CC
-66C2 95CD
-66C3 95CE
-66C4 95CF
-66C5 95D0
-66C6 95D1
-66C7 95D2
-66C8 95D3
-66C9 95D4
-66CA 95D5
-66CB 95D6
-66CC 95D7
-66CD 95D8
-66CE 95D9
-66CF 95DA
-66D0 95DB
-66D1 95DC
-66D2 95DD
-66D3 95DE
-66D4 95DF
-66D5 95E0
-66D6 95E1
-66D7 95E2
-66D8 95E3
-66D9 CAEF
-66DA 95E4
-66DB EAD6
-66DC EAD7
-66DD C6D8
-66DE 95E5
-66DF 95E6
-66E0 95E7
-66E1 95E8
-66E2 95E9
-66E3 95EA
-66E4 95EB
-66E5 95EC
-66E6 EAD8
-66E7 95ED
-66E8 95EE
-66E9 EAD9
-66EA 95EF
-66EB 95F0
-66EC 95F1
-66ED 95F2
-66EE 95F3
-66EF 95F4
-66F0 D4BB
-66F1 95F5
-66F2 C7FA
-66F3 D2B7
-66F4 B8FC
-66F5 95F6
-66F6 95F7
-66F7 EAC2
-66F8 95F8
-66F9 B2DC
-66FA 95F9
-66FB 95FA
-66FC C2FC
-66FD 95FB
-66FE D4F8
-66FF CCE6
-6700 D7EE
-6701 95FC
-6702 95FD
-6703 95FE
-6704 9640
-6705 9641
-6706 9642
-6707 9643
-6708 D4C2
-6709 D3D0
-670A EBC3
-670B C5F3
-670C 9644
-670D B7FE
-670E 9645
-670F 9646
-6710 EBD4
-6711 9647
-6712 9648
-6713 9649
-6714 CBB7
-6715 EBDE
-6716 964A
-6717 C0CA
-6718 964B
-6719 964C
-671A 964D
-671B CDFB
-671C 964E
-671D B3AF
-671E 964F
-671F C6DA
-6720 9650
-6721 9651
-6722 9652
-6723 9653
-6724 9654
-6725 9655
-6726 EBFC
-6727 9656
-6728 C4BE
-6729 9657
-672A CEB4
-672B C4A9
-672C B1BE
-672D D4FD
-672E 9658
-672F CAF5
-6730 9659
-6731 D6EC
-6732 965A
-6733 965B
-6734 C6D3
-6735 B6E4
-6736 965C
-6737 965D
-6738 965E
-6739 965F
-673A BBFA
-673B 9660
-673C 9661
-673D D0E0
-673E 9662
-673F 9663
-6740 C9B1
-6741 9664
-6742 D4D3
-6743 C8A8
-6744 9665
-6745 9666
-6746 B8CB
-6747 9667
-6748 E8BE
-6749 C9BC
-674A 9668
-674B 9669
-674C E8BB
-674D 966A
-674E C0EE
-674F D0D3
-6750 B2C4
-6751 B4E5
-6752 966B
-6753 E8BC
-6754 966C
-6755 966D
-6756 D5C8
-6757 966E
-6758 966F
-6759 9670
-675A 9671
-675B 9672
-675C B6C5
-675D 9673
-675E E8BD
-675F CAF8
-6760 B8DC
-6761 CCF5
-6762 9674
-6763 9675
-6764 9676
-6765 C0B4
-6766 9677
-6767 9678
-6768 D1EE
-6769 E8BF
-676A E8C2
-676B 9679
-676C 967A
-676D BABC
-676E 967B
-676F B1AD
-6770 BDDC
-6771 967C
-6772 EABD
-6773 E8C3
-6774 967D
-6775 E8C6
-6776 967E
-6777 E8CB
-6778 9680
-6779 9681
-677A 9682
-677B 9683
-677C E8CC
-677D 9684
-677E CBC9
-677F B0E5
-6780 9685
-6781 BCAB
-6782 9686
-6783 9687
-6784 B9B9
-6785 9688
-6786 9689
-6787 E8C1
-6788 968A
-6789 CDF7
-678A 968B
-678B E8CA
-678C 968C
-678D 968D
-678E 968E
-678F 968F
-6790 CEF6
-6791 9690
-6792 9691
-6793 9692
-6794 9693
-6795 D5ED
-6796 9694
-6797 C1D6
-6798 E8C4
-6799 9695
-679A C3B6
-679B 9696
-679C B9FB
-679D D6A6
-679E E8C8
-679F 9697
-67A0 9698
-67A1 9699
-67A2 CAE0
-67A3 D4E6
-67A4 969A
-67A5 E8C0
-67A6 969B
-67A7 E8C5
-67A8 E8C7
-67A9 969C
-67AA C7B9
-67AB B7E3
-67AC 969D
-67AD E8C9
-67AE 969E
-67AF BFDD
-67B0 E8D2
-67B1 969F
-67B2 96A0
-67B3 E8D7
-67B4 96A1
-67B5 E8D5
-67B6 BCDC
-67B7 BCCF
-67B8 E8DB
-67B9 96A2
-67BA 96A3
-67BB 96A4
-67BC 96A5
-67BD 96A6
-67BE 96A7
-67BF 96A8
-67C0 96A9
-67C1 E8DE
-67C2 96AA
-67C3 E8DA
-67C4 B1FA
-67C5 96AB
-67C6 96AC
-67C7 96AD
-67C8 96AE
-67C9 96AF
-67CA 96B0
-67CB 96B1
-67CC 96B2
-67CD 96B3
-67CE 96B4
-67CF B0D8
-67D0 C4B3
-67D1 B8CC
-67D2 C6E2
-67D3 C8BE
-67D4 C8E1
-67D5 96B5
-67D6 96B6
-67D7 96B7
-67D8 E8CF
-67D9 E8D4
-67DA E8D6
-67DB 96B8
-67DC B9F1
-67DD E8D8
-67DE D7F5
-67DF 96B9
-67E0 C4FB
-67E1 96BA
-67E2 E8DC
-67E3 96BB
-67E4 96BC
-67E5 B2E9
-67E6 96BD
-67E7 96BE
-67E8 96BF
-67E9 E8D1
-67EA 96C0
-67EB 96C1
-67EC BCED
-67ED 96C2
-67EE 96C3
-67EF BFC2
-67F0 E8CD
-67F1 D6F9
-67F2 96C4
-67F3 C1F8
-67F4 B2F1
-67F5 96C5
-67F6 96C6
-67F7 96C7
-67F8 96C8
-67F9 96C9
-67FA 96CA
-67FB 96CB
-67FC 96CC
-67FD E8DF
-67FE 96CD
-67FF CAC1
-6800 E8D9
-6801 96CE
-6802 96CF
-6803 96D0
-6804 96D1
-6805 D5A4
-6806 96D2
-6807 B1EA
-6808 D5BB
-6809 E8CE
-680A E8D0
-680B B6B0
-680C E8D3
-680D 96D3
-680E E8DD
-680F C0B8
-6810 96D4
-6811 CAF7
-6812 96D5
-6813 CBA8
-6814 96D6
-6815 96D7
-6816 C6DC
-6817 C0F5
-6818 96D8
-6819 96D9
-681A 96DA
-681B 96DB
-681C 96DC
-681D E8E9
-681E 96DD
-681F 96DE
-6820 96DF
-6821 D0A3
-6822 96E0
-6823 96E1
-6824 96E2
-6825 96E3
-6826 96E4
-6827 96E5
-6828 96E6
-6829 E8F2
-682A D6EA
-682B 96E7
-682C 96E8
-682D 96E9
-682E 96EA
-682F 96EB
-6830 96EC
-6831 96ED
-6832 E8E0
-6833 E8E1
-6834 96EE
-6835 96EF
-6836 96F0
-6837 D1F9
-6838 BACB
-6839 B8F9
-683A 96F1
-683B 96F2
-683C B8F1
-683D D4D4
-683E E8EF
-683F 96F3
-6840 E8EE
-6841 E8EC
-6842 B9F0
-6843 CCD2
-6844 E8E6
-6845 CEA6
-6846 BFF2
-6847 96F4
-6848 B0B8
-6849 E8F1
-684A E8F0
-684B 96F5
-684C D7C0
-684D 96F6
-684E E8E4
-684F 96F7
-6850 CDA9
-6851 C9A3
-6852 96F8
-6853 BBB8
-6854 BDDB
-6855 E8EA
-6856 96F9
-6857 96FA
-6858 96FB
-6859 96FC
-685A 96FD
-685B 96FE
-685C 9740
-685D 9741
-685E 9742
-685F 9743
-6860 E8E2
-6861 E8E3
-6862 E8E5
-6863 B5B5
-6864 E8E7
-6865 C7C5
-6866 E8EB
-6867 E8ED
-6868 BDB0
-6869 D7AE
-686A 9744
-686B E8F8
-686C 9745
-686D 9746
-686E 9747
-686F 9748
-6870 9749
-6871 974A
-6872 974B
-6873 974C
-6874 E8F5
-6875 974D
-6876 CDB0
-6877 E8F6
-6878 974E
-6879 974F
-687A 9750
-687B 9751
-687C 9752
-687D 9753
-687E 9754
-687F 9755
-6880 9756
-6881 C1BA
-6882 9757
-6883 E8E8
-6884 9758
-6885 C3B7
-6886 B0F0
-6887 9759
-6888 975A
-6889 975B
-688A 975C
-688B 975D
-688C 975E
-688D 975F
-688E 9760
-688F E8F4
-6890 9761
-6891 9762
-6892 9763
-6893 E8F7
-6894 9764
-6895 9765
-6896 9766
-6897 B9A3
-6898 9767
-6899 9768
-689A 9769
-689B 976A
-689C 976B
-689D 976C
-689E 976D
-689F 976E
-68A0 976F
-68A1 9770
-68A2 C9D2
-68A3 9771
-68A4 9772
-68A5 9773
-68A6 C3CE
-68A7 CEE0
-68A8 C0E6
-68A9 9774
-68AA 9775
-68AB 9776
-68AC 9777
-68AD CBF3
-68AE 9778
-68AF CCDD
-68B0 D0B5
-68B1 9779
-68B2 977A
-68B3 CAE1
-68B4 977B
-68B5 E8F3
-68B6 977C
-68B7 977D
-68B8 977E
-68B9 9780
-68BA 9781
-68BB 9782
-68BC 9783
-68BD 9784
-68BE 9785
-68BF 9786
-68C0 BCEC
-68C1 9787
-68C2 E8F9
-68C3 9788
-68C4 9789
-68C5 978A
-68C6 978B
-68C7 978C
-68C8 978D
-68C9 C3DE
-68CA 978E
-68CB C6E5
-68CC 978F
-68CD B9F7
-68CE 9790
-68CF 9791
-68D0 9792
-68D1 9793
-68D2 B0F4
-68D3 9794
-68D4 9795
-68D5 D7D8
-68D6 9796
-68D7 9797
-68D8 BCAC
-68D9 9798
-68DA C5EF
-68DB 9799
-68DC 979A
-68DD 979B
-68DE 979C
-68DF 979D
-68E0 CCC4
-68E1 979E
-68E2 979F
-68E3 E9A6
-68E4 97A0
-68E5 97A1
-68E6 97A2
-68E7 97A3
-68E8 97A4
-68E9 97A5
-68EA 97A6
-68EB 97A7
-68EC 97A8
-68ED 97A9
-68EE C9AD
-68EF 97AA
-68F0 E9A2
-68F1 C0E2
-68F2 97AB
-68F3 97AC
-68F4 97AD
-68F5 BFC3
-68F6 97AE
-68F7 97AF
-68F8 97B0
-68F9 E8FE
-68FA B9D7
-68FB 97B1
-68FC E8FB
-68FD 97B2
-68FE 97B3
-68FF 97B4
-6900 97B5
-6901 E9A4
-6902 97B6
-6903 97B7
-6904 97B8
-6905 D2CE
-6906 97B9
-6907 97BA
-6908 97BB
-6909 97BC
-690A 97BD
-690B E9A3
-690C 97BE
-690D D6B2
-690E D7B5
-690F 97BF
-6910 E9A7
-6911 97C0
-6912 BDB7
-6913 97C1
-6914 97C2
-6915 97C3
-6916 97C4
-6917 97C5
-6918 97C6
-6919 97C7
-691A 97C8
-691B 97C9
-691C 97CA
-691D 97CB
-691E 97CC
-691F E8FC
-6920 E8FD
-6921 97CD
-6922 97CE
-6923 97CF
-6924 E9A1
-6925 97D0
-6926 97D1
-6927 97D2
-6928 97D3
-6929 97D4
-692A 97D5
-692B 97D6
-692C 97D7
-692D CDD6
-692E 97D8
-692F 97D9
-6930 D2AC
-6931 97DA
-6932 97DB
-6933 97DC
-6934 E9B2
-6935 97DD
-6936 97DE
-6937 97DF
-6938 97E0
-6939 E9A9
-693A 97E1
-693B 97E2
-693C 97E3
-693D B4AA
-693E 97E4
-693F B4BB
-6940 97E5
-6941 97E6
-6942 E9AB
-6943 97E7
-6944 97E8
-6945 97E9
-6946 97EA
-6947 97EB
-6948 97EC
-6949 97ED
-694A 97EE
-694B 97EF
-694C 97F0
-694D 97F1
-694E 97F2
-694F 97F3
-6950 97F4
-6951 97F5
-6952 97F6
-6953 97F7
-6954 D0A8
-6955 97F8
-6956 97F9
-6957 E9A5
-6958 97FA
-6959 97FB
-695A B3FE
-695B 97FC
-695C 97FD
-695D E9AC
-695E C0E3
-695F 97FE
-6960 E9AA
-6961 9840
-6962 9841
-6963 E9B9
-6964 9842
-6965 9843
-6966 E9B8
-6967 9844
-6968 9845
-6969 9846
-696A 9847
-696B E9AE
-696C 9848
-696D 9849
-696E E8FA
-696F 984A
-6970 984B
-6971 E9A8
-6972 984C
-6973 984D
-6974 984E
-6975 984F
-6976 9850
-6977 BFAC
-6978 E9B1
-6979 E9BA
-697A 9851
-697B 9852
-697C C2A5
-697D 9853
-697E 9854
-697F 9855
-6980 E9AF
-6981 9856
-6982 B8C5
-6983 9857
-6984 E9AD
-6985 9858
-6986 D3DC
-6987 E9B4
-6988 E9B5
-6989 E9B7
-698A 9859
-698B 985A
-698C 985B
-698D E9C7
-698E 985C
-698F 985D
-6990 985E
-6991 985F
-6992 9860
-6993 9861
-6994 C0C6
-6995 E9C5
-6996 9862
-6997 9863
-6998 E9B0
-6999 9864
-699A 9865
-699B E9BB
-699C B0F1
-699D 9866
-699E 9867
-699F 9868
-69A0 9869
-69A1 986A
-69A2 986B
-69A3 986C
-69A4 986D
-69A5 986E
-69A6 986F
-69A7 E9BC
-69A8 D5A5
-69A9 9870
-69AA 9871
-69AB E9BE
-69AC 9872
-69AD E9BF
-69AE 9873
-69AF 9874
-69B0 9875
-69B1 E9C1
-69B2 9876
-69B3 9877
-69B4 C1F1
-69B5 9878
-69B6 9879
-69B7 C8B6
-69B8 987A
-69B9 987B
-69BA 987C
-69BB E9BD
-69BC 987D
-69BD 987E
-69BE 9880
-69BF 9881
-69C0 9882
-69C1 E9C2
-69C2 9883
-69C3 9884
-69C4 9885
-69C5 9886
-69C6 9887
-69C7 9888
-69C8 9889
-69C9 988A
-69CA E9C3
-69CB 988B
-69CC E9B3
-69CD 988C
-69CE E9B6
-69CF 988D
-69D0 BBB1
-69D1 988E
-69D2 988F
-69D3 9890
-69D4 E9C0
-69D5 9891
-69D6 9892
-69D7 9893
-69D8 9894
-69D9 9895
-69DA 9896
-69DB BCF7
-69DC 9897
-69DD 9898
-69DE 9899
-69DF E9C4
-69E0 E9C6
-69E1 989A
-69E2 989B
-69E3 989C
-69E4 989D
-69E5 989E
-69E6 989F
-69E7 98A0
-69E8 98A1
-69E9 98A2
-69EA 98A3
-69EB 98A4
-69EC 98A5
-69ED E9CA
-69EE 98A6
-69EF 98A7
-69F0 98A8
-69F1 98A9
-69F2 E9CE
-69F3 98AA
-69F4 98AB
-69F5 98AC
-69F6 98AD
-69F7 98AE
-69F8 98AF
-69F9 98B0
-69FA 98B1
-69FB 98B2
-69FC 98B3
-69FD B2DB
-69FE 98B4
-69FF E9C8
-6A00 98B5
-6A01 98B6
-6A02 98B7
-6A03 98B8
-6A04 98B9
-6A05 98BA
-6A06 98BB
-6A07 98BC
-6A08 98BD
-6A09 98BE
-6A0A B7AE
-6A0B 98BF
-6A0C 98C0
-6A0D 98C1
-6A0E 98C2
-6A0F 98C3
-6A10 98C4
-6A11 98C5
-6A12 98C6
-6A13 98C7
-6A14 98C8
-6A15 98C9
-6A16 98CA
-6A17 E9CB
-6A18 E9CC
-6A19 98CB
-6A1A 98CC
-6A1B 98CD
-6A1C 98CE
-6A1D 98CF
-6A1E 98D0
-6A1F D5C1
-6A20 98D1
-6A21 C4A3
-6A22 98D2
-6A23 98D3
-6A24 98D4
-6A25 98D5
-6A26 98D6
-6A27 98D7
-6A28 E9D8
-6A29 98D8
-6A2A BAE1
-6A2B 98D9
-6A2C 98DA
-6A2D 98DB
-6A2E 98DC
-6A2F E9C9
-6A30 98DD
-6A31 D3A3
-6A32 98DE
-6A33 98DF
-6A34 98E0
-6A35 E9D4
-6A36 98E1
-6A37 98E2
-6A38 98E3
-6A39 98E4
-6A3A 98E5
-6A3B 98E6
-6A3C 98E7
-6A3D E9D7
-6A3E E9D0
-6A3F 98E8
-6A40 98E9
-6A41 98EA
-6A42 98EB
-6A43 98EC
-6A44 E9CF
-6A45 98ED
-6A46 98EE
-6A47 C7C1
-6A48 98EF
-6A49 98F0
-6A4A 98F1
-6A4B 98F2
-6A4C 98F3
-6A4D 98F4
-6A4E 98F5
-6A4F 98F6
-6A50 E9D2
-6A51 98F7
-6A52 98F8
-6A53 98F9
-6A54 98FA
-6A55 98FB
-6A56 98FC
-6A57 98FD
-6A58 E9D9
-6A59 B3C8
-6A5A 98FE
-6A5B E9D3
-6A5C 9940
-6A5D 9941
-6A5E 9942
-6A5F 9943
-6A60 9944
-6A61 CFF0
-6A62 9945
-6A63 9946
-6A64 9947
-6A65 E9CD
-6A66 9948
-6A67 9949
-6A68 994A
-6A69 994B
-6A6A 994C
-6A6B 994D
-6A6C 994E
-6A6D 994F
-6A6E 9950
-6A6F 9951
-6A70 9952
-6A71 B3F7
-6A72 9953
-6A73 9954
-6A74 9955
-6A75 9956
-6A76 9957
-6A77 9958
-6A78 9959
-6A79 E9D6
-6A7A 995A
-6A7B 995B
-6A7C E9DA
-6A7D 995C
-6A7E 995D
-6A7F 995E
-6A80 CCB4
-6A81 995F
-6A82 9960
-6A83 9961
-6A84 CFAD
-6A85 9962
-6A86 9963
-6A87 9964
-6A88 9965
-6A89 9966
-6A8A 9967
-6A8B 9968
-6A8C 9969
-6A8D 996A
-6A8E E9D5
-6A8F 996B
-6A90 E9DC
-6A91 E9DB
-6A92 996C
-6A93 996D
-6A94 996E
-6A95 996F
-6A96 9970
-6A97 E9DE
-6A98 9971
-6A99 9972
-6A9A 9973
-6A9B 9974
-6A9C 9975
-6A9D 9976
-6A9E 9977
-6A9F 9978
-6AA0 E9D1
-6AA1 9979
-6AA2 997A
-6AA3 997B
-6AA4 997C
-6AA5 997D
-6AA6 997E
-6AA7 9980
-6AA8 9981
-6AA9 E9DD
-6AAA 9982
-6AAB E9DF
-6AAC C3CA
-6AAD 9983
-6AAE 9984
-6AAF 9985
-6AB0 9986
-6AB1 9987
-6AB2 9988
-6AB3 9989
-6AB4 998A
-6AB5 998B
-6AB6 998C
-6AB7 998D
-6AB8 998E
-6AB9 998F
-6ABA 9990
-6ABB 9991
-6ABC 9992
-6ABD 9993
-6ABE 9994
-6ABF 9995
-6AC0 9996
-6AC1 9997
-6AC2 9998
-6AC3 9999
-6AC4 999A
-6AC5 999B
-6AC6 999C
-6AC7 999D
-6AC8 999E
-6AC9 999F
-6ACA 99A0
-6ACB 99A1
-6ACC 99A2
-6ACD 99A3
-6ACE 99A4
-6ACF 99A5
-6AD0 99A6
-6AD1 99A7
-6AD2 99A8
-6AD3 99A9
-6AD4 99AA
-6AD5 99AB
-6AD6 99AC
-6AD7 99AD
-6AD8 99AE
-6AD9 99AF
-6ADA 99B0
-6ADB 99B1
-6ADC 99B2
-6ADD 99B3
-6ADE 99B4
-6ADF 99B5
-6AE0 99B6
-6AE1 99B7
-6AE2 99B8
-6AE3 99B9
-6AE4 99BA
-6AE5 99BB
-6AE6 99BC
-6AE7 99BD
-6AE8 99BE
-6AE9 99BF
-6AEA 99C0
-6AEB 99C1
-6AEC 99C2
-6AED 99C3
-6AEE 99C4
-6AEF 99C5
-6AF0 99C6
-6AF1 99C7
-6AF2 99C8
-6AF3 99C9
-6AF4 99CA
-6AF5 99CB
-6AF6 99CC
-6AF7 99CD
-6AF8 99CE
-6AF9 99CF
-6AFA 99D0
-6AFB 99D1
-6AFC 99D2
-6AFD 99D3
-6AFE 99D4
-6AFF 99D5
-6B00 99D6
-6B01 99D7
-6B02 99D8
-6B03 99D9
-6B04 99DA
-6B05 99DB
-6B06 99DC
-6B07 99DD
-6B08 99DE
-6B09 99DF
-6B0A 99E0
-6B0B 99E1
-6B0C 99E2
-6B0D 99E3
-6B0E 99E4
-6B0F 99E5
-6B10 99E6
-6B11 99E7
-6B12 99E8
-6B13 99E9
-6B14 99EA
-6B15 99EB
-6B16 99EC
-6B17 99ED
-6B18 99EE
-6B19 99EF
-6B1A 99F0
-6B1B 99F1
-6B1C 99F2
-6B1D 99F3
-6B1E 99F4
-6B1F 99F5
-6B20 C7B7
-6B21 B4CE
-6B22 BBB6
-6B23 D0C0
-6B24 ECA3
-6B25 99F6
-6B26 99F7
-6B27 C5B7
-6B28 99F8
-6B29 99F9
-6B2A 99FA
-6B2B 99FB
-6B2C 99FC
-6B2D 99FD
-6B2E 99FE
-6B2F 9A40
-6B30 9A41
-6B31 9A42
-6B32 D3FB
-6B33 9A43
-6B34 9A44
-6B35 9A45
-6B36 9A46
-6B37 ECA4
-6B38 9A47
-6B39 ECA5
-6B3A C6DB
-6B3B 9A48
-6B3C 9A49
-6B3D 9A4A
-6B3E BFEE
-6B3F 9A4B
-6B40 9A4C
-6B41 9A4D
-6B42 9A4E
-6B43 ECA6
-6B44 9A4F
-6B45 9A50
-6B46 ECA7
-6B47 D0AA
-6B48 9A51
-6B49 C7B8
-6B4A 9A52
-6B4B 9A53
-6B4C B8E8
-6B4D 9A54
-6B4E 9A55
-6B4F 9A56
-6B50 9A57
-6B51 9A58
-6B52 9A59
-6B53 9A5A
-6B54 9A5B
-6B55 9A5C
-6B56 9A5D
-6B57 9A5E
-6B58 9A5F
-6B59 ECA8
-6B5A 9A60
-6B5B 9A61
-6B5C 9A62
-6B5D 9A63
-6B5E 9A64
-6B5F 9A65
-6B60 9A66
-6B61 9A67
-6B62 D6B9
-6B63 D5FD
-6B64 B4CB
-6B65 B2BD
-6B66 CEE4
-6B67 C6E7
-6B68 9A68
-6B69 9A69
-6B6A CDE1
-6B6B 9A6A
-6B6C 9A6B
-6B6D 9A6C
-6B6E 9A6D
-6B6F 9A6E
-6B70 9A6F
-6B71 9A70
-6B72 9A71
-6B73 9A72
-6B74 9A73
-6B75 9A74
-6B76 9A75
-6B77 9A76
-6B78 9A77
-6B79 B4F5
-6B7A 9A78
-6B7B CBC0
-6B7C BCDF
-6B7D 9A79
-6B7E 9A7A
-6B7F 9A7B
-6B80 9A7C
-6B81 E9E2
-6B82 E9E3
-6B83 D1EA
-6B84 E9E5
-6B85 9A7D
-6B86 B4F9
-6B87 E9E4
-6B88 9A7E
-6B89 D1B3
-6B8A CAE2
-6B8B B2D0
-6B8C 9A80
-6B8D E9E8
-6B8E 9A81
-6B8F 9A82
-6B90 9A83
-6B91 9A84
-6B92 E9E6
-6B93 E9E7
-6B94 9A85
-6B95 9A86
-6B96 D6B3
-6B97 9A87
-6B98 9A88
-6B99 9A89
-6B9A E9E9
-6B9B E9EA
-6B9C 9A8A
-6B9D 9A8B
-6B9E 9A8C
-6B9F 9A8D
-6BA0 9A8E
-6BA1 E9EB
-6BA2 9A8F
-6BA3 9A90
-6BA4 9A91
-6BA5 9A92
-6BA6 9A93
-6BA7 9A94
-6BA8 9A95
-6BA9 9A96
-6BAA E9EC
-6BAB 9A97
-6BAC 9A98
-6BAD 9A99
-6BAE 9A9A
-6BAF 9A9B
-6BB0 9A9C
-6BB1 9A9D
-6BB2 9A9E
-6BB3 ECAF
-6BB4 C5B9
-6BB5 B6CE
-6BB6 9A9F
-6BB7 D2F3
-6BB8 9AA0
-6BB9 9AA1
-6BBA 9AA2
-6BBB 9AA3
-6BBC 9AA4
-6BBD 9AA5
-6BBE 9AA6
-6BBF B5EE
-6BC0 9AA7
-6BC1 BBD9
-6BC2 ECB1
-6BC3 9AA8
-6BC4 9AA9
-6BC5 D2E3
-6BC6 9AAA
-6BC7 9AAB
-6BC8 9AAC
-6BC9 9AAD
-6BCA 9AAE
-6BCB CEE3
-6BCC 9AAF
-6BCD C4B8
-6BCE 9AB0
-6BCF C3BF
-6BD0 9AB1
-6BD1 9AB2
-6BD2 B6BE
-6BD3 D8B9
-6BD4 B1C8
-6BD5 B1CF
-6BD6 B1D1
-6BD7 C5FE
-6BD8 9AB3
-6BD9 B1D0
-6BDA 9AB4
-6BDB C3AB
-6BDC 9AB5
-6BDD 9AB6
-6BDE 9AB7
-6BDF 9AB8
-6BE0 9AB9
-6BE1 D5B1
-6BE2 9ABA
-6BE3 9ABB
-6BE4 9ABC
-6BE5 9ABD
-6BE6 9ABE
-6BE7 9ABF
-6BE8 9AC0
-6BE9 9AC1
-6BEA EBA4
-6BEB BAC1
-6BEC 9AC2
-6BED 9AC3
-6BEE 9AC4
-6BEF CCBA
-6BF0 9AC5
-6BF1 9AC6
-6BF2 9AC7
-6BF3 EBA5
-6BF4 9AC8
-6BF5 EBA7
-6BF6 9AC9
-6BF7 9ACA
-6BF8 9ACB
-6BF9 EBA8
-6BFA 9ACC
-6BFB 9ACD
-6BFC 9ACE
-6BFD EBA6
-6BFE 9ACF
-6BFF 9AD0
-6C00 9AD1
-6C01 9AD2
-6C02 9AD3
-6C03 9AD4
-6C04 9AD5
-6C05 EBA9
-6C06 EBAB
-6C07 EBAA
-6C08 9AD6
-6C09 9AD7
-6C0A 9AD8
-6C0B 9AD9
-6C0C 9ADA
-6C0D EBAC
-6C0E 9ADB
-6C0F CACF
-6C10 D8B5
-6C11 C3F1
-6C12 9ADC
-6C13 C3A5
-6C14 C6F8
-6C15 EBAD
-6C16 C4CA
-6C17 9ADD
-6C18 EBAE
-6C19 EBAF
-6C1A EBB0
-6C1B B7D5
-6C1C 9ADE
-6C1D 9ADF
-6C1E 9AE0
-6C1F B7FA
-6C20 9AE1
-6C21 EBB1
-6C22 C7E2
-6C23 9AE2
-6C24 EBB3
-6C25 9AE3
-6C26 BAA4
-6C27 D1F5
-6C28 B0B1
-6C29 EBB2
-6C2A EBB4
-6C2B 9AE4
-6C2C 9AE5
-6C2D 9AE6
-6C2E B5AA
-6C2F C2C8
-6C30 C7E8
-6C31 9AE7
-6C32 EBB5
-6C33 9AE8
-6C34 CBAE
-6C35 E3DF
-6C36 9AE9
-6C37 9AEA
-6C38 D3C0
-6C39 9AEB
-6C3A 9AEC
-6C3B 9AED
-6C3C 9AEE
-6C3D D9DB
-6C3E 9AEF
-6C3F 9AF0
-6C40 CDA1
-6C41 D6AD
-6C42 C7F3
-6C43 9AF1
-6C44 9AF2
-6C45 9AF3
-6C46 D9E0
-6C47 BBE3
-6C48 9AF4
-6C49 BABA
-6C4A E3E2
-6C4B 9AF5
-6C4C 9AF6
-6C4D 9AF7
-6C4E 9AF8
-6C4F 9AF9
-6C50 CFAB
-6C51 9AFA
-6C52 9AFB
-6C53 9AFC
-6C54 E3E0
-6C55 C9C7
-6C56 9AFD
-6C57 BAB9
-6C58 9AFE
-6C59 9B40
-6C5A 9B41
-6C5B D1B4
-6C5C E3E1
-6C5D C8EA
-6C5E B9AF
-6C5F BDAD
-6C60 B3D8
-6C61 CEDB
-6C62 9B42
-6C63 9B43
-6C64 CCC0
-6C65 9B44
-6C66 9B45
-6C67 9B46
-6C68 E3E8
-6C69 E3E9
-6C6A CDF4
-6C6B 9B47
-6C6C 9B48
-6C6D 9B49
-6C6E 9B4A
-6C6F 9B4B
-6C70 CCAD
-6C71 9B4C
-6C72 BCB3
-6C73 9B4D
-6C74 E3EA
-6C75 9B4E
-6C76 E3EB
-6C77 9B4F
-6C78 9B50
-6C79 D0DA
-6C7A 9B51
-6C7B 9B52
-6C7C 9B53
-6C7D C6FB
-6C7E B7DA
-6C7F 9B54
-6C80 9B55
-6C81 C7DF
-6C82 D2CA
-6C83 CED6
-6C84 9B56
-6C85 E3E4
-6C86 E3EC
-6C87 9B57
-6C88 C9F2
-6C89 B3C1
-6C8A 9B58
-6C8B 9B59
-6C8C E3E7
-6C8D 9B5A
-6C8E 9B5B
-6C8F C6E3
-6C90 E3E5
-6C91 9B5C
-6C92 9B5D
-6C93 EDB3
-6C94 E3E6
-6C95 9B5E
-6C96 9B5F
-6C97 9B60
-6C98 9B61
-6C99 C9B3
-6C9A 9B62
-6C9B C5E6
-6C9C 9B63
-6C9D 9B64
-6C9E 9B65
-6C9F B9B5
-6CA0 9B66
-6CA1 C3BB
-6CA2 9B67
-6CA3 E3E3
-6CA4 C5BD
-6CA5 C1A4
-6CA6 C2D9
-6CA7 B2D7
-6CA8 9B68
-6CA9 E3ED
-6CAA BBA6
-6CAB C4AD
-6CAC 9B69
-6CAD E3F0
-6CAE BEDA
-6CAF 9B6A
-6CB0 9B6B
-6CB1 E3FB
-6CB2 E3F5
-6CB3 BAD3
-6CB4 9B6C
-6CB5 9B6D
-6CB6 9B6E
-6CB7 9B6F
-6CB8 B7D0
-6CB9 D3CD
-6CBA 9B70
-6CBB D6CE
-6CBC D5D3
-6CBD B9C1
-6CBE D5B4
-6CBF D1D8
-6CC0 9B71
-6CC1 9B72
-6CC2 9B73
-6CC3 9B74
-6CC4 D0B9
-6CC5 C7F6
-6CC6 9B75
-6CC7 9B76
-6CC8 9B77
-6CC9 C8AA
-6CCA B2B4
-6CCB 9B78
-6CCC C3DA
-6CCD 9B79
-6CCE 9B7A
-6CCF 9B7B
-6CD0 E3EE
-6CD1 9B7C
-6CD2 9B7D
-6CD3 E3FC
-6CD4 E3EF
-6CD5 B7A8
-6CD6 E3F7
-6CD7 E3F4
-6CD8 9B7E
-6CD9 9B80
-6CDA 9B81
-6CDB B7BA
-6CDC 9B82
-6CDD 9B83
-6CDE C5A2
-6CDF 9B84
-6CE0 E3F6
-6CE1 C5DD
-6CE2 B2A8
-6CE3 C6FC
-6CE4 9B85
-6CE5 C4E0
-6CE6 9B86
-6CE7 9B87
-6CE8 D7A2
-6CE9 9B88
-6CEA C0E1
-6CEB E3F9
-6CEC 9B89
-6CED 9B8A
-6CEE E3FA
-6CEF E3FD
-6CF0 CCA9
-6CF1 E3F3
-6CF2 9B8B
-6CF3 D3BE
-6CF4 9B8C
-6CF5 B1C3
-6CF6 EDB4
-6CF7 E3F1
-6CF8 E3F2
-6CF9 9B8D
-6CFA E3F8
-6CFB D0BA
-6CFC C6C3
-6CFD D4F3
-6CFE E3FE
-6CFF 9B8E
-6D00 9B8F
-6D01 BDE0
-6D02 9B90
-6D03 9B91
-6D04 E4A7
-6D05 9B92
-6D06 9B93
-6D07 E4A6
-6D08 9B94
-6D09 9B95
-6D0A 9B96
-6D0B D1F3
-6D0C E4A3
-6D0D 9B97
-6D0E E4A9
-6D0F 9B98
-6D10 9B99
-6D11 9B9A
-6D12 C8F7
-6D13 9B9B
-6D14 9B9C
-6D15 9B9D
-6D16 9B9E
-6D17 CFB4
-6D18 9B9F
-6D19 E4A8
-6D1A E4AE
-6D1B C2E5
-6D1C 9BA0
-6D1D 9BA1
-6D1E B6B4
-6D1F 9BA2
-6D20 9BA3
-6D21 9BA4
-6D22 9BA5
-6D23 9BA6
-6D24 9BA7
-6D25 BDF2
-6D26 9BA8
-6D27 E4A2
-6D28 9BA9
-6D29 9BAA
-6D2A BAE9
-6D2B E4AA
-6D2C 9BAB
-6D2D 9BAC
-6D2E E4AC
-6D2F 9BAD
-6D30 9BAE
-6D31 B6FD
-6D32 D6DE
-6D33 E4B2
-6D34 9BAF
-6D35 E4AD
-6D36 9BB0
-6D37 9BB1
-6D38 9BB2
-6D39 E4A1
-6D3A 9BB3
-6D3B BBEE
-6D3C CDDD
-6D3D C7A2
-6D3E C5C9
-6D3F 9BB4
-6D40 9BB5
-6D41 C1F7
-6D42 9BB6
-6D43 E4A4
-6D44 9BB7
-6D45 C7B3
-6D46 BDAC
-6D47 BDBD
-6D48 E4A5
-6D49 9BB8
-6D4A D7C7
-6D4B B2E2
-6D4C 9BB9
-6D4D E4AB
-6D4E BCC3
-6D4F E4AF
-6D50 9BBA
-6D51 BBEB
-6D52 E4B0
-6D53 C5A8
-6D54 E4B1
-6D55 9BBB
-6D56 9BBC
-6D57 9BBD
-6D58 9BBE
-6D59 D5E3
-6D5A BFA3
-6D5B 9BBF
-6D5C E4BA
-6D5D 9BC0
-6D5E E4B7
-6D5F 9BC1
-6D60 E4BB
-6D61 9BC2
-6D62 9BC3
-6D63 E4BD
-6D64 9BC4
-6D65 9BC5
-6D66 C6D6
-6D67 9BC6
-6D68 9BC7
-6D69 BAC6
-6D6A C0CB
-6D6B 9BC8
-6D6C 9BC9
-6D6D 9BCA
-6D6E B8A1
-6D6F E4B4
-6D70 9BCB
-6D71 9BCC
-6D72 9BCD
-6D73 9BCE
-6D74 D4A1
-6D75 9BCF
-6D76 9BD0
-6D77 BAA3
-6D78 BDFE
-6D79 9BD1
-6D7A 9BD2
-6D7B 9BD3
-6D7C E4BC
-6D7D 9BD4
-6D7E 9BD5
-6D7F 9BD6
-6D80 9BD7
-6D81 9BD8
-6D82 CDBF
-6D83 9BD9
-6D84 9BDA
-6D85 C4F9
-6D86 9BDB
-6D87 9BDC
-6D88 CFFB
-6D89 C9E6
-6D8A 9BDD
-6D8B 9BDE
-6D8C D3BF
-6D8D 9BDF
-6D8E CFD1
-6D8F 9BE0
-6D90 9BE1
-6D91 E4B3
-6D92 9BE2
-6D93 E4B8
-6D94 E4B9
-6D95 CCE9
-6D96 9BE3
-6D97 9BE4
-6D98 9BE5
-6D99 9BE6
-6D9A 9BE7
-6D9B CCCE
-6D9C 9BE8
-6D9D C0D4
-6D9E E4B5
-6D9F C1B0
-6DA0 E4B6
-6DA1 CED0
-6DA2 9BE9
-6DA3 BBC1
-6DA4 B5D3
-6DA5 9BEA
-6DA6 C8F3
-6DA7 BDA7
-6DA8 D5C7
-6DA9 C9AC
-6DAA B8A2
-6DAB E4CA
-6DAC 9BEB
-6DAD 9BEC
-6DAE E4CC
-6DAF D1C4
-6DB0 9BED
-6DB1 9BEE
-6DB2 D2BA
-6DB3 9BEF
-6DB4 9BF0
-6DB5 BAAD
-6DB6 9BF1
-6DB7 9BF2
-6DB8 BAD4
-6DB9 9BF3
-6DBA 9BF4
-6DBB 9BF5
-6DBC 9BF6
-6DBD 9BF7
-6DBE 9BF8
-6DBF E4C3
-6DC0 B5ED
-6DC1 9BF9
-6DC2 9BFA
-6DC3 9BFB
-6DC4 D7CD
-6DC5 E4C0
-6DC6 CFFD
-6DC7 E4BF
-6DC8 9BFC
-6DC9 9BFD
-6DCA 9BFE
-6DCB C1DC
-6DCC CCCA
-6DCD 9C40
-6DCE 9C41
-6DCF 9C42
-6DD0 9C43
-6DD1 CAE7
-6DD2 9C44
-6DD3 9C45
-6DD4 9C46
-6DD5 9C47
-6DD6 C4D7
-6DD7 9C48
-6DD8 CCD4
-6DD9 E4C8
-6DDA 9C49
-6DDB 9C4A
-6DDC 9C4B
-6DDD E4C7
-6DDE E4C1
-6DDF 9C4C
-6DE0 E4C4
-6DE1 B5AD
-6DE2 9C4D
-6DE3 9C4E
-6DE4 D3D9
-6DE5 9C4F
-6DE6 E4C6
-6DE7 9C50
-6DE8 9C51
-6DE9 9C52
-6DEA 9C53
-6DEB D2F9
-6DEC B4E3
-6DED 9C54
-6DEE BBB4
-6DEF 9C55
-6DF0 9C56
-6DF1 C9EE
-6DF2 9C57
-6DF3 B4BE
-6DF4 9C58
-6DF5 9C59
-6DF6 9C5A
-6DF7 BBEC
-6DF8 9C5B
-6DF9 D1CD
-6DFA 9C5C
-6DFB CCED
-6DFC EDB5
-6DFD 9C5D
-6DFE 9C5E
-6DFF 9C5F
-6E00 9C60
-6E01 9C61
-6E02 9C62
-6E03 9C63
-6E04 9C64
-6E05 C7E5
-6E06 9C65
-6E07 9C66
-6E08 9C67
-6E09 9C68
-6E0A D4A8
-6E0B 9C69
-6E0C E4CB
-6E0D D7D5
-6E0E E4C2
-6E0F 9C6A
-6E10 BDA5
-6E11 E4C5
-6E12 9C6B
-6E13 9C6C
-6E14 D3E6
-6E15 9C6D
-6E16 E4C9
-6E17 C9F8
-6E18 9C6E
-6E19 9C6F
-6E1A E4BE
-6E1B 9C70
-6E1C 9C71
-6E1D D3E5
-6E1E 9C72
-6E1F 9C73
-6E20 C7FE
-6E21 B6C9
-6E22 9C74
-6E23 D4FC
-6E24 B2B3
-6E25 E4D7
-6E26 9C75
-6E27 9C76
-6E28 9C77
-6E29 CEC2
-6E2A 9C78
-6E2B E4CD
-6E2C 9C79
-6E2D CEBC
-6E2E 9C7A
-6E2F B8DB
-6E30 9C7B
-6E31 9C7C
-6E32 E4D6
-6E33 9C7D
-6E34 BFCA
-6E35 9C7E
-6E36 9C80
-6E37 9C81
-6E38 D3CE
-6E39 9C82
-6E3A C3EC
-6E3B 9C83
-6E3C 9C84
-6E3D 9C85
-6E3E 9C86
-6E3F 9C87
-6E40 9C88
-6E41 9C89
-6E42 9C8A
-6E43 C5C8
-6E44 E4D8
-6E45 9C8B
-6E46 9C8C
-6E47 9C8D
-6E48 9C8E
-6E49 9C8F
-6E4A 9C90
-6E4B 9C91
-6E4C 9C92
-6E4D CDC4
-6E4E E4CF
-6E4F 9C93
-6E50 9C94
-6E51 9C95
-6E52 9C96
-6E53 E4D4
-6E54 E4D5
-6E55 9C97
-6E56 BAFE
-6E57 9C98
-6E58 CFE6
-6E59 9C99
-6E5A 9C9A
-6E5B D5BF
-6E5C 9C9B
-6E5D 9C9C
-6E5E 9C9D
-6E5F E4D2
-6E60 9C9E
-6E61 9C9F
-6E62 9CA0
-6E63 9CA1
-6E64 9CA2
-6E65 9CA3
-6E66 9CA4
-6E67 9CA5
-6E68 9CA6
-6E69 9CA7
-6E6A 9CA8
-6E6B E4D0
-6E6C 9CA9
-6E6D 9CAA
-6E6E E4CE
-6E6F 9CAB
-6E70 9CAC
-6E71 9CAD
-6E72 9CAE
-6E73 9CAF
-6E74 9CB0
-6E75 9CB1
-6E76 9CB2
-6E77 9CB3
-6E78 9CB4
-6E79 9CB5
-6E7A 9CB6
-6E7B 9CB7
-6E7C 9CB8
-6E7D 9CB9
-6E7E CDE5
-6E7F CAAA
-6E80 9CBA
-6E81 9CBB
-6E82 9CBC
-6E83 C0A3
-6E84 9CBD
-6E85 BDA6
-6E86 E4D3
-6E87 9CBE
-6E88 9CBF
-6E89 B8C8
-6E8A 9CC0
-6E8B 9CC1
-6E8C 9CC2
-6E8D 9CC3
-6E8E 9CC4
-6E8F E4E7
-6E90 D4B4
-6E91 9CC5
-6E92 9CC6
-6E93 9CC7
-6E94 9CC8
-6E95 9CC9
-6E96 9CCA
-6E97 9CCB
-6E98 E4DB
-6E99 9CCC
-6E9A 9CCD
-6E9B 9CCE
-6E9C C1EF
-6E9D 9CCF
-6E9E 9CD0
-6E9F E4E9
-6EA0 9CD1
-6EA1 9CD2
-6EA2 D2E7
-6EA3 9CD3
-6EA4 9CD4
-6EA5 E4DF
-6EA6 9CD5
-6EA7 E4E0
-6EA8 9CD6
-6EA9 9CD7
-6EAA CFAA
-6EAB 9CD8
-6EAC 9CD9
-6EAD 9CDA
-6EAE 9CDB
-6EAF CBDD
-6EB0 9CDC
-6EB1 E4DA
-6EB2 E4D1
-6EB3 9CDD
-6EB4 E4E5
-6EB5 9CDE
-6EB6 C8DC
-6EB7 E4E3
-6EB8 9CDF
-6EB9 9CE0
-6EBA C4E7
-6EBB E4E2
-6EBC 9CE1
-6EBD E4E1
-6EBE 9CE2
-6EBF 9CE3
-6EC0 9CE4
-6EC1 B3FC
-6EC2 E4E8
-6EC3 9CE5
-6EC4 9CE6
-6EC5 9CE7
-6EC6 9CE8
-6EC7 B5E1
-6EC8 9CE9
-6EC9 9CEA
-6ECA 9CEB
-6ECB D7CC
-6ECC 9CEC
-6ECD 9CED
-6ECE 9CEE
-6ECF E4E6
-6ED0 9CEF
-6ED1 BBAC
-6ED2 9CF0
-6ED3 D7D2
-6ED4 CCCF
-6ED5 EBF8
-6ED6 9CF1
-6ED7 E4E4
-6ED8 9CF2
-6ED9 9CF3
-6EDA B9F6
-6EDB 9CF4
-6EDC 9CF5
-6EDD 9CF6
-6EDE D6CD
-6EDF E4D9
-6EE0 E4DC
-6EE1 C2FA
-6EE2 E4DE
-6EE3 9CF7
-6EE4 C2CB
-6EE5 C0C4
-6EE6 C2D0
-6EE7 9CF8
-6EE8 B1F5
-6EE9 CCB2
-6EEA 9CF9
-6EEB 9CFA
-6EEC 9CFB
-6EED 9CFC
-6EEE 9CFD
-6EEF 9CFE
-6EF0 9D40
-6EF1 9D41
-6EF2 9D42
-6EF3 9D43
-6EF4 B5CE
-6EF5 9D44
-6EF6 9D45
-6EF7 9D46
-6EF8 9D47
-6EF9 E4EF
-6EFA 9D48
-6EFB 9D49
-6EFC 9D4A
-6EFD 9D4B
-6EFE 9D4C
-6EFF 9D4D
-6F00 9D4E
-6F01 9D4F
-6F02 C6AF
-6F03 9D50
-6F04 9D51
-6F05 9D52
-6F06 C6E1
-6F07 9D53
-6F08 9D54
-6F09 E4F5
-6F0A 9D55
-6F0B 9D56
-6F0C 9D57
-6F0D 9D58
-6F0E 9D59
-6F0F C2A9
-6F10 9D5A
-6F11 9D5B
-6F12 9D5C
-6F13 C0EC
-6F14 D1DD
-6F15 E4EE
-6F16 9D5D
-6F17 9D5E
-6F18 9D5F
-6F19 9D60
-6F1A 9D61
-6F1B 9D62
-6F1C 9D63
-6F1D 9D64
-6F1E 9D65
-6F1F 9D66
-6F20 C4AE
-6F21 9D67
-6F22 9D68
-6F23 9D69
-6F24 E4ED
-6F25 9D6A
-6F26 9D6B
-6F27 9D6C
-6F28 9D6D
-6F29 E4F6
-6F2A E4F4
-6F2B C2FE
-6F2C 9D6E
-6F2D E4DD
-6F2E 9D6F
-6F2F E4F0
-6F30 9D70
-6F31 CAFE
-6F32 9D71
-6F33 D5C4
-6F34 9D72
-6F35 9D73
-6F36 E4F1
-6F37 9D74
-6F38 9D75
-6F39 9D76
-6F3A 9D77
-6F3B 9D78
-6F3C 9D79
-6F3D 9D7A
-6F3E D1FA
-6F3F 9D7B
-6F40 9D7C
-6F41 9D7D
-6F42 9D7E
-6F43 9D80
-6F44 9D81
-6F45 9D82
-6F46 E4EB
-6F47 E4EC
-6F48 9D83
-6F49 9D84
-6F4A 9D85
-6F4B E4F2
-6F4C 9D86
-6F4D CEAB
-6F4E 9D87
-6F4F 9D88
-6F50 9D89
-6F51 9D8A
-6F52 9D8B
-6F53 9D8C
-6F54 9D8D
-6F55 9D8E
-6F56 9D8F
-6F57 9D90
-6F58 C5CB
-6F59 9D91
-6F5A 9D92
-6F5B 9D93
-6F5C C7B1
-6F5D 9D94
-6F5E C2BA
-6F5F 9D95
-6F60 9D96
-6F61 9D97
-6F62 E4EA
-6F63 9D98
-6F64 9D99
-6F65 9D9A
-6F66 C1CA
-6F67 9D9B
-6F68 9D9C
-6F69 9D9D
-6F6A 9D9E
-6F6B 9D9F
-6F6C 9DA0
-6F6D CCB6
-6F6E B3B1
-6F6F 9DA1
-6F70 9DA2
-6F71 9DA3
-6F72 E4FB
-6F73 9DA4
-6F74 E4F3
-6F75 9DA5
-6F76 9DA6
-6F77 9DA7
-6F78 E4FA
-6F79 9DA8
-6F7A E4FD
-6F7B 9DA9
-6F7C E4FC
-6F7D 9DAA
-6F7E 9DAB
-6F7F 9DAC
-6F80 9DAD
-6F81 9DAE
-6F82 9DAF
-6F83 9DB0
-6F84 B3CE
-6F85 9DB1
-6F86 9DB2
-6F87 9DB3
-6F88 B3BA
-6F89 E4F7
-6F8A 9DB4
-6F8B 9DB5
-6F8C E4F9
-6F8D E4F8
-6F8E C5EC
-6F8F 9DB6
-6F90 9DB7
-6F91 9DB8
-6F92 9DB9
-6F93 9DBA
-6F94 9DBB
-6F95 9DBC
-6F96 9DBD
-6F97 9DBE
-6F98 9DBF
-6F99 9DC0
-6F9A 9DC1
-6F9B 9DC2
-6F9C C0BD
-6F9D 9DC3
-6F9E 9DC4
-6F9F 9DC5
-6FA0 9DC6
-6FA1 D4E8
-6FA2 9DC7
-6FA3 9DC8
-6FA4 9DC9
-6FA5 9DCA
-6FA6 9DCB
-6FA7 E5A2
-6FA8 9DCC
-6FA9 9DCD
-6FAA 9DCE
-6FAB 9DCF
-6FAC 9DD0
-6FAD 9DD1
-6FAE 9DD2
-6FAF 9DD3
-6FB0 9DD4
-6FB1 9DD5
-6FB2 9DD6
-6FB3 B0C4
-6FB4 9DD7
-6FB5 9DD8
-6FB6 E5A4
-6FB7 9DD9
-6FB8 9DDA
-6FB9 E5A3
-6FBA 9DDB
-6FBB 9DDC
-6FBC 9DDD
-6FBD 9DDE
-6FBE 9DDF
-6FBF 9DE0
-6FC0 BCA4
-6FC1 9DE1
-6FC2 E5A5
-6FC3 9DE2
-6FC4 9DE3
-6FC5 9DE4
-6FC6 9DE5
-6FC7 9DE6
-6FC8 9DE7
-6FC9 E5A1
-6FCA 9DE8
-6FCB 9DE9
-6FCC 9DEA
-6FCD 9DEB
-6FCE 9DEC
-6FCF 9DED
-6FD0 9DEE
-6FD1 E4FE
-6FD2 B1F4
-6FD3 9DEF
-6FD4 9DF0
-6FD5 9DF1
-6FD6 9DF2
-6FD7 9DF3
-6FD8 9DF4
-6FD9 9DF5
-6FDA 9DF6
-6FDB 9DF7
-6FDC 9DF8
-6FDD 9DF9
-6FDE E5A8
-6FDF 9DFA
-6FE0 E5A9
-6FE1 E5A6
-6FE2 9DFB
-6FE3 9DFC
-6FE4 9DFD
-6FE5 9DFE
-6FE6 9E40
-6FE7 9E41
-6FE8 9E42
-6FE9 9E43
-6FEA 9E44
-6FEB 9E45
-6FEC 9E46
-6FED 9E47
-6FEE E5A7
-6FEF E5AA
-6FF0 9E48
-6FF1 9E49
-6FF2 9E4A
-6FF3 9E4B
-6FF4 9E4C
-6FF5 9E4D
-6FF6 9E4E
-6FF7 9E4F
-6FF8 9E50
-6FF9 9E51
-6FFA 9E52
-6FFB 9E53
-6FFC 9E54
-6FFD 9E55
-6FFE 9E56
-6FFF 9E57
-7000 9E58
-7001 9E59
-7002 9E5A
-7003 9E5B
-7004 9E5C
-7005 9E5D
-7006 9E5E
-7007 9E5F
-7008 9E60
-7009 9E61
-700A 9E62
-700B 9E63
-700C 9E64
-700D 9E65
-700E 9E66
-700F 9E67
-7010 9E68
-7011 C6D9
-7012 9E69
-7013 9E6A
-7014 9E6B
-7015 9E6C
-7016 9E6D
-7017 9E6E
-7018 9E6F
-7019 9E70
-701A E5AB
-701B E5AD
-701C 9E71
-701D 9E72
-701E 9E73
-701F 9E74
-7020 9E75
-7021 9E76
-7022 9E77
-7023 E5AC
-7024 9E78
-7025 9E79
-7026 9E7A
-7027 9E7B
-7028 9E7C
-7029 9E7D
-702A 9E7E
-702B 9E80
-702C 9E81
-702D 9E82
-702E 9E83
-702F 9E84
-7030 9E85
-7031 9E86
-7032 9E87
-7033 9E88
-7034 9E89
-7035 E5AF
-7036 9E8A
-7037 9E8B
-7038 9E8C
-7039 E5AE
-703A 9E8D
-703B 9E8E
-703C 9E8F
-703D 9E90
-703E 9E91
-703F 9E92
-7040 9E93
-7041 9E94
-7042 9E95
-7043 9E96
-7044 9E97
-7045 9E98
-7046 9E99
-7047 9E9A
-7048 9E9B
-7049 9E9C
-704A 9E9D
-704B 9E9E
-704C B9E0
-704D 9E9F
-704E 9EA0
-704F E5B0
-7050 9EA1
-7051 9EA2
-7052 9EA3
-7053 9EA4
-7054 9EA5
-7055 9EA6
-7056 9EA7
-7057 9EA8
-7058 9EA9
-7059 9EAA
-705A 9EAB
-705B 9EAC
-705C 9EAD
-705D 9EAE
-705E E5B1
-705F 9EAF
-7060 9EB0
-7061 9EB1
-7062 9EB2
-7063 9EB3
-7064 9EB4
-7065 9EB5
-7066 9EB6
-7067 9EB7
-7068 9EB8
-7069 9EB9
-706A 9EBA
-706B BBF0
-706C ECE1
-706D C3F0
-706E 9EBB
-706F B5C6
-7070 BBD2
-7071 9EBC
-7072 9EBD
-7073 9EBE
-7074 9EBF
-7075 C1E9
-7076 D4EE
-7077 9EC0
-7078 BEC4
-7079 9EC1
-707A 9EC2
-707B 9EC3
-707C D7C6
-707D 9EC4
-707E D4D6
-707F B2D3
-7080 ECBE
-7081 9EC5
-7082 9EC6
-7083 9EC7
-7084 9EC8
-7085 EAC1
-7086 9EC9
-7087 9ECA
-7088 9ECB
-7089 C2AF
-708A B4B6
-708B 9ECC
-708C 9ECD
-708D 9ECE
-708E D1D7
-708F 9ECF
-7090 9ED0
-7091 9ED1
-7092 B3B4
-7093 9ED2
-7094 C8B2
-7095 BFBB
-7096 ECC0
-7097 9ED3
-7098 9ED4
-7099 D6CB
-709A 9ED5
-709B 9ED6
-709C ECBF
-709D ECC1
-709E 9ED7
-709F 9ED8
-70A0 9ED9
-70A1 9EDA
-70A2 9EDB
-70A3 9EDC
-70A4 9EDD
-70A5 9EDE
-70A6 9EDF
-70A7 9EE0
-70A8 9EE1
-70A9 9EE2
-70AA 9EE3
-70AB ECC5
-70AC BEE6
-70AD CCBF
-70AE C5DA
-70AF BEBC
-70B0 9EE4
-70B1 ECC6
-70B2 9EE5
-70B3 B1FE
-70B4 9EE6
-70B5 9EE7
-70B6 9EE8
-70B7 ECC4
-70B8 D5A8
-70B9 B5E3
-70BA 9EE9
-70BB ECC2
-70BC C1B6
-70BD B3E3
-70BE 9EEA
-70BF 9EEB
-70C0 ECC3
-70C1 CBB8
-70C2 C0C3
-70C3 CCFE
-70C4 9EEC
-70C5 9EED
-70C6 9EEE
-70C7 9EEF
-70C8 C1D2
-70C9 9EF0
-70CA ECC8
-70CB 9EF1
-70CC 9EF2
-70CD 9EF3
-70CE 9EF4
-70CF 9EF5
-70D0 9EF6
-70D1 9EF7
-70D2 9EF8
-70D3 9EF9
-70D4 9EFA
-70D5 9EFB
-70D6 9EFC
-70D7 9EFD
-70D8 BAE6
-70D9 C0D3
-70DA 9EFE
-70DB D6F2
-70DC 9F40
-70DD 9F41
-70DE 9F42
-70DF D1CC
-70E0 9F43
-70E1 9F44
-70E2 9F45
-70E3 9F46
-70E4 BFBE
-70E5 9F47
-70E6 B7B3
-70E7 C9D5
-70E8 ECC7
-70E9 BBE2
-70EA 9F48
-70EB CCCC
-70EC BDFD
-70ED C8C8
-70EE 9F49
-70EF CFA9
-70F0 9F4A
-70F1 9F4B
-70F2 9F4C
-70F3 9F4D
-70F4 9F4E
-70F5 9F4F
-70F6 9F50
-70F7 CDE9
-70F8 9F51
-70F9 C5EB
-70FA 9F52
-70FB 9F53
-70FC 9F54
-70FD B7E9
-70FE 9F55
-70FF 9F56
-7100 9F57
-7101 9F58
-7102 9F59
-7103 9F5A
-7104 9F5B
-7105 9F5C
-7106 9F5D
-7107 9F5E
-7108 9F5F
-7109 D1C9
-710A BAB8
-710B 9F60
-710C 9F61
-710D 9F62
-710E 9F63
-710F 9F64
-7110 ECC9
-7111 9F65
-7112 9F66
-7113 ECCA
-7114 9F67
-7115 BBC0
-7116 ECCB
-7117 9F68
-7118 ECE2
-7119 B1BA
-711A B7D9
-711B 9F69
-711C 9F6A
-711D 9F6B
-711E 9F6C
-711F 9F6D
-7120 9F6E
-7121 9F6F
-7122 9F70
-7123 9F71
-7124 9F72
-7125 9F73
-7126 BDB9
-7127 9F74
-7128 9F75
-7129 9F76
-712A 9F77
-712B 9F78
-712C 9F79
-712D 9F7A
-712E 9F7B
-712F ECCC
-7130 D1E6
-7131 ECCD
-7132 9F7C
-7133 9F7D
-7134 9F7E
-7135 9F80
-7136 C8BB
-7137 9F81
-7138 9F82
-7139 9F83
-713A 9F84
-713B 9F85
-713C 9F86
-713D 9F87
-713E 9F88
-713F 9F89
-7140 9F8A
-7141 9F8B
-7142 9F8C
-7143 9F8D
-7144 9F8E
-7145 ECD1
-7146 9F8F
-7147 9F90
-7148 9F91
-7149 9F92
-714A ECD3
-714B 9F93
-714C BBCD
-714D 9F94
-714E BCE5
-714F 9F95
-7150 9F96
-7151 9F97
-7152 9F98
-7153 9F99
-7154 9F9A
-7155 9F9B
-7156 9F9C
-7157 9F9D
-7158 9F9E
-7159 9F9F
-715A 9FA0
-715B 9FA1
-715C ECCF
-715D 9FA2
-715E C9B7
-715F 9FA3
-7160 9FA4
-7161 9FA5
-7162 9FA6
-7163 9FA7
-7164 C3BA
-7165 9FA8
-7166 ECE3
-7167 D5D5
-7168 ECD0
-7169 9FA9
-716A 9FAA
-716B 9FAB
-716C 9FAC
-716D 9FAD
-716E D6F3
-716F 9FAE
-7170 9FAF
-7171 9FB0
-7172 ECD2
-7173 ECCE
-7174 9FB1
-7175 9FB2
-7176 9FB3
-7177 9FB4
-7178 ECD4
-7179 9FB5
-717A ECD5
-717B 9FB6
-717C 9FB7
-717D C9BF
-717E 9FB8
-717F 9FB9
-7180 9FBA
-7181 9FBB
-7182 9FBC
-7183 9FBD
-7184 CFA8
-7185 9FBE
-7186 9FBF
-7187 9FC0
-7188 9FC1
-7189 9FC2
-718A D0DC
-718B 9FC3
-718C 9FC4
-718D 9FC5
-718E 9FC6
-718F D1AC
-7190 9FC7
-7191 9FC8
-7192 9FC9
-7193 9FCA
-7194 C8DB
-7195 9FCB
-7196 9FCC
-7197 9FCD
-7198 ECD6
-7199 CEF5
-719A 9FCE
-719B 9FCF
-719C 9FD0
-719D 9FD1
-719E 9FD2
-719F CAEC
-71A0 ECDA
-71A1 9FD3
-71A2 9FD4
-71A3 9FD5
-71A4 9FD6
-71A5 9FD7
-71A6 9FD8
-71A7 9FD9
-71A8 ECD9
-71A9 9FDA
-71AA 9FDB
-71AB 9FDC
-71AC B0BE
-71AD 9FDD
-71AE 9FDE
-71AF 9FDF
-71B0 9FE0
-71B1 9FE1
-71B2 9FE2
-71B3 ECD7
-71B4 9FE3
-71B5 ECD8
-71B6 9FE4
-71B7 9FE5
-71B8 9FE6
-71B9 ECE4
-71BA 9FE7
-71BB 9FE8
-71BC 9FE9
-71BD 9FEA
-71BE 9FEB
-71BF 9FEC
-71C0 9FED
-71C1 9FEE
-71C2 9FEF
-71C3 C8BC
-71C4 9FF0
-71C5 9FF1
-71C6 9FF2
-71C7 9FF3
-71C8 9FF4
-71C9 9FF5
-71CA 9FF6
-71CB 9FF7
-71CC 9FF8
-71CD 9FF9
-71CE C1C7
-71CF 9FFA
-71D0 9FFB
-71D1 9FFC
-71D2 9FFD
-71D3 9FFE
-71D4 ECDC
-71D5 D1E0
-71D6 A040
-71D7 A041
-71D8 A042
-71D9 A043
-71DA A044
-71DB A045
-71DC A046
-71DD A047
-71DE A048
-71DF A049
-71E0 ECDB
-71E1 A04A
-71E2 A04B
-71E3 A04C
-71E4 A04D
-71E5 D4EF
-71E6 A04E
-71E7 ECDD
-71E8 A04F
-71E9 A050
-71EA A051
-71EB A052
-71EC A053
-71ED A054
-71EE DBC6
-71EF A055
-71F0 A056
-71F1 A057
-71F2 A058
-71F3 A059
-71F4 A05A
-71F5 A05B
-71F6 A05C
-71F7 A05D
-71F8 A05E
-71F9 ECDE
-71FA A05F
-71FB A060
-71FC A061
-71FD A062
-71FE A063
-71FF A064
-7200 A065
-7201 A066
-7202 A067
-7203 A068
-7204 A069
-7205 A06A
-7206 B1AC
-7207 A06B
-7208 A06C
-7209 A06D
-720A A06E
-720B A06F
-720C A070
-720D A071
-720E A072
-720F A073
-7210 A074
-7211 A075
-7212 A076
-7213 A077
-7214 A078
-7215 A079
-7216 A07A
-7217 A07B
-7218 A07C
-7219 A07D
-721A A07E
-721B A080
-721C A081
-721D ECDF
-721E A082
-721F A083
-7220 A084
-7221 A085
-7222 A086
-7223 A087
-7224 A088
-7225 A089
-7226 A08A
-7227 A08B
-7228 ECE0
-7229 A08C
-722A D7A6
-722B A08D
-722C C5C0
-722D A08E
-722E A08F
-722F A090
-7230 EBBC
-7231 B0AE
-7232 A091
-7233 A092
-7234 A093
-7235 BEF4
-7236 B8B8
-7237 D2AF
-7238 B0D6
-7239 B5F9
-723A A094
-723B D8B3
-723C A095
-723D CBAC
-723E A096
-723F E3DD
-7240 A097
-7241 A098
-7242 A099
-7243 A09A
-7244 A09B
-7245 A09C
-7246 A09D
-7247 C6AC
-7248 B0E6
-7249 A09E
-724A A09F
-724B A0A0
-724C C5C6
-724D EBB9
-724E A0A1
-724F A0A2
-7250 A0A3
-7251 A0A4
-7252 EBBA
-7253 A0A5
-7254 A0A6
-7255 A0A7
-7256 EBBB
-7257 A0A8
-7258 A0A9
-7259 D1C0
-725A A0AA
-725B C5A3
-725C A0AB
-725D EAF2
-725E A0AC
-725F C4B2
-7260 A0AD
-7261 C4B5
-7262 C0CE
-7263 A0AE
-7264 A0AF
-7265 A0B0
-7266 EAF3
-7267 C4C1
-7268 A0B1
-7269 CEEF
-726A A0B2
-726B A0B3
-726C A0B4
-726D A0B5
-726E EAF0
-726F EAF4
-7270 A0B6
-7271 A0B7
-7272 C9FC
-7273 A0B8
-7274 A0B9
-7275 C7A3
-7276 A0BA
-7277 A0BB
-7278 A0BC
-7279 CCD8
-727A CEFE
-727B A0BD
-727C A0BE
-727D A0BF
-727E EAF5
-727F EAF6
-7280 CFAC
-7281 C0E7
-7282 A0C0
-7283 A0C1
-7284 EAF7
-7285 A0C2
-7286 A0C3
-7287 A0C4
-7288 A0C5
-7289 A0C6
-728A B6BF
-728B EAF8
-728C A0C7
-728D EAF9
-728E A0C8
-728F EAFA
-7290 A0C9
-7291 A0CA
-7292 EAFB
-7293 A0CB
-7294 A0CC
-7295 A0CD
-7296 A0CE
-7297 A0CF
-7298 A0D0
-7299 A0D1
-729A A0D2
-729B A0D3
-729C A0D4
-729D A0D5
-729E A0D6
-729F EAF1
-72A0 A0D7
-72A1 A0D8
-72A2 A0D9
-72A3 A0DA
-72A4 A0DB
-72A5 A0DC
-72A6 A0DD
-72A7 A0DE
-72A8 A0DF
-72A9 A0E0
-72AA A0E1
-72AB A0E2
-72AC C8AE
-72AD E1EB
-72AE A0E3
-72AF B7B8
-72B0 E1EC
-72B1 A0E4
-72B2 A0E5
-72B3 A0E6
-72B4 E1ED
-72B5 A0E7
-72B6 D7B4
-72B7 E1EE
-72B8 E1EF
-72B9 D3CC
-72BA A0E8
-72BB A0E9
-72BC A0EA
-72BD A0EB
-72BE A0EC
-72BF A0ED
-72C0 A0EE
-72C1 E1F1
-72C2 BFF1
-72C3 E1F0
-72C4 B5D2
-72C5 A0EF
-72C6 A0F0
-72C7 A0F1
-72C8 B1B7
-72C9 A0F2
-72CA A0F3
-72CB A0F4
-72CC A0F5
-72CD E1F3
-72CE E1F2
-72CF A0F6
-72D0 BAFC
-72D1 A0F7
-72D2 E1F4
-72D3 A0F8
-72D4 A0F9
-72D5 A0FA
-72D6 A0FB
-72D7 B9B7
-72D8 A0FC
-72D9 BED1
-72DA A0FD
-72DB A0FE
-72DC AA40
-72DD AA41
-72DE C4FC
-72DF AA42
-72E0 BADD
-72E1 BDC6
-72E2 AA43
-72E3 AA44
-72E4 AA45
-72E5 AA46
-72E6 AA47
-72E7 AA48
-72E8 E1F5
-72E9 E1F7
-72EA AA49
-72EB AA4A
-72EC B6C0
-72ED CFC1
-72EE CAA8
-72EF E1F6
-72F0 D5F8
-72F1 D3FC
-72F2 E1F8
-72F3 E1FC
-72F4 E1F9
-72F5 AA4B
-72F6 AA4C
-72F7 E1FA
-72F8 C0EA
-72F9 AA4D
-72FA E1FE
-72FB E2A1
-72FC C0C7
-72FD AA4E
-72FE AA4F
-72FF AA50
-7300 AA51
-7301 E1FB
-7302 AA52
-7303 E1FD
-7304 AA53
-7305 AA54
-7306 AA55
-7307 AA56
-7308 AA57
-7309 AA58
-730A E2A5
-730B AA59
-730C AA5A
-730D AA5B
-730E C1D4
-730F AA5C
-7310 AA5D
-7311 AA5E
-7312 AA5F
-7313 E2A3
-7314 AA60
-7315 E2A8
-7316 B2FE
-7317 E2A2
-7318 AA61
-7319 AA62
-731A AA63
-731B C3CD
-731C B2C2
-731D E2A7
-731E E2A6
-731F AA64
-7320 AA65
-7321 E2A4
-7322 E2A9
-7323 AA66
-7324 AA67
-7325 E2AB
-7326 AA68
-7327 AA69
-7328 AA6A
-7329 D0C9
-732A D6ED
-732B C3A8
-732C E2AC
-732D AA6B
-732E CFD7
-732F AA6C
-7330 AA6D
-7331 E2AE
-7332 AA6E
-7333 AA6F
-7334 BAEF
-7335 AA70
-7336 AA71
-7337 E9E0
-7338 E2AD
-7339 E2AA
-733A AA72
-733B AA73
-733C AA74
-733D AA75
-733E BBAB
-733F D4B3
-7340 AA76
-7341 AA77
-7342 AA78
-7343 AA79
-7344 AA7A
-7345 AA7B
-7346 AA7C
-7347 AA7D
-7348 AA7E
-7349 AA80
-734A AA81
-734B AA82
-734C AA83
-734D E2B0
-734E AA84
-734F AA85
-7350 E2AF
-7351 AA86
-7352 E9E1
-7353 AA87
-7354 AA88
-7355 AA89
-7356 AA8A
-7357 E2B1
-7358 AA8B
-7359 AA8C
-735A AA8D
-735B AA8E
-735C AA8F
-735D AA90
-735E AA91
-735F AA92
-7360 E2B2
-7361 AA93
-7362 AA94
-7363 AA95
-7364 AA96
-7365 AA97
-7366 AA98
-7367 AA99
-7368 AA9A
-7369 AA9B
-736A AA9C
-736B AA9D
-736C E2B3
-736D CCA1
-736E AA9E
-736F E2B4
-7370 AA9F
-7371 AAA0
-7372 AB40
-7373 AB41
-7374 AB42
-7375 AB43
-7376 AB44
-7377 AB45
-7378 AB46
-7379 AB47
-737A AB48
-737B AB49
-737C AB4A
-737D AB4B
-737E E2B5
-737F AB4C
-7380 AB4D
-7381 AB4E
-7382 AB4F
-7383 AB50
-7384 D0FE
-7385 AB51
-7386 AB52
-7387 C2CA
-7388 AB53
-7389 D3F1
-738A AB54
-738B CDF5
-738C AB55
-738D AB56
-738E E7E0
-738F AB57
-7390 AB58
-7391 E7E1
-7392 AB59
-7393 AB5A
-7394 AB5B
-7395 AB5C
-7396 BEC1
-7397 AB5D
-7398 AB5E
-7399 AB5F
-739A AB60
-739B C2EA
-739C AB61
-739D AB62
-739E AB63
-739F E7E4
-73A0 AB64
-73A1 AB65
-73A2 E7E3
-73A3 AB66
-73A4 AB67
-73A5 AB68
-73A6 AB69
-73A7 AB6A
-73A8 AB6B
-73A9 CDE6
-73AA AB6C
-73AB C3B5
-73AC AB6D
-73AD AB6E
-73AE E7E2
-73AF BBB7
-73B0 CFD6
-73B1 AB6F
-73B2 C1E1
-73B3 E7E9
-73B4 AB70
-73B5 AB71
-73B6 AB72
-73B7 E7E8
-73B8 AB73
-73B9 AB74
-73BA E7F4
-73BB B2A3
-73BC AB75
-73BD AB76
-73BE AB77
-73BF AB78
-73C0 E7EA
-73C1 AB79
-73C2 E7E6
-73C3 AB7A
-73C4 AB7B
-73C5 AB7C
-73C6 AB7D
-73C7 AB7E
-73C8 E7EC
-73C9 E7EB
-73CA C9BA
-73CB AB80
-73CC AB81
-73CD D5E4
-73CE AB82
-73CF E7E5
-73D0 B7A9
-73D1 E7E7
-73D2 AB83
-73D3 AB84
-73D4 AB85
-73D5 AB86
-73D6 AB87
-73D7 AB88
-73D8 AB89
-73D9 E7EE
-73DA AB8A
-73DB AB8B
-73DC AB8C
-73DD AB8D
-73DE E7F3
-73DF AB8E
-73E0 D6E9
-73E1 AB8F
-73E2 AB90
-73E3 AB91
-73E4 AB92
-73E5 E7ED
-73E6 AB93
-73E7 E7F2
-73E8 AB94
-73E9 E7F1
-73EA AB95
-73EB AB96
-73EC AB97
-73ED B0E0
-73EE AB98
-73EF AB99
-73F0 AB9A
-73F1 AB9B
-73F2 E7F5
-73F3 AB9C
-73F4 AB9D
-73F5 AB9E
-73F6 AB9F
-73F7 ABA0
-73F8 AC40
-73F9 AC41
-73FA AC42
-73FB AC43
-73FC AC44
-73FD AC45
-73FE AC46
-73FF AC47
-7400 AC48
-7401 AC49
-7402 AC4A
-7403 C7F2
-7404 AC4B
-7405 C0C5
-7406 C0ED
-7407 AC4C
-7408 AC4D
-7409 C1F0
-740A E7F0
-740B AC4E
-740C AC4F
-740D AC50
-740E AC51
-740F E7F6
-7410 CBF6
-7411 AC52
-7412 AC53
-7413 AC54
-7414 AC55
-7415 AC56
-7416 AC57
-7417 AC58
-7418 AC59
-7419 AC5A
-741A E8A2
-741B E8A1
-741C AC5B
-741D AC5C
-741E AC5D
-741F AC5E
-7420 AC5F
-7421 AC60
-7422 D7C1
-7423 AC61
-7424 AC62
-7425 E7FA
-7426 E7F9
-7427 AC63
-7428 E7FB
-7429 AC64
-742A E7F7
-742B AC65
-742C E7FE
-742D AC66
-742E E7FD
-742F AC67
-7430 E7FC
-7431 AC68
-7432 AC69
-7433 C1D5
-7434 C7D9
-7435 C5FD
-7436 C5C3
-7437 AC6A
-7438 AC6B
-7439 AC6C
-743A AC6D
-743B AC6E
-743C C7ED
-743D AC6F
-743E AC70
-743F AC71
-7440 AC72
-7441 E8A3
-7442 AC73
-7443 AC74
-7444 AC75
-7445 AC76
-7446 AC77
-7447 AC78
-7448 AC79
-7449 AC7A
-744A AC7B
-744B AC7C
-744C AC7D
-744D AC7E
-744E AC80
-744F AC81
-7450 AC82
-7451 AC83
-7452 AC84
-7453 AC85
-7454 AC86
-7455 E8A6
-7456 AC87
-7457 E8A5
-7458 AC88
-7459 E8A7
-745A BAF7
-745B E7F8
-745C E8A4
-745D AC89
-745E C8F0
-745F C9AA
-7460 AC8A
-7461 AC8B
-7462 AC8C
-7463 AC8D
-7464 AC8E
-7465 AC8F
-7466 AC90
-7467 AC91
-7468 AC92
-7469 AC93
-746A AC94
-746B AC95
-746C AC96
-746D E8A9
-746E AC97
-746F AC98
-7470 B9E5
-7471 AC99
-7472 AC9A
-7473 AC9B
-7474 AC9C
-7475 AC9D
-7476 D1FE
-7477 E8A8
-7478 AC9E
-7479 AC9F
-747A ACA0
-747B AD40
-747C AD41
-747D AD42
-747E E8AA
-747F AD43
-7480 E8AD
-7481 E8AE
-7482 AD44
-7483 C1A7
-7484 AD45
-7485 AD46
-7486 AD47
-7487 E8AF
-7488 AD48
-7489 AD49
-748A AD4A
-748B E8B0
-748C AD4B
-748D AD4C
-748E E8AC
-748F AD4D
-7490 E8B4
-7491 AD4E
-7492 AD4F
-7493 AD50
-7494 AD51
-7495 AD52
-7496 AD53
-7497 AD54
-7498 AD55
-7499 AD56
-749A AD57
-749B AD58
-749C E8AB
-749D AD59
-749E E8B1
-749F AD5A
-74A0 AD5B
-74A1 AD5C
-74A2 AD5D
-74A3 AD5E
-74A4 AD5F
-74A5 AD60
-74A6 AD61
-74A7 E8B5
-74A8 E8B2
-74A9 E8B3
-74AA AD62
-74AB AD63
-74AC AD64
-74AD AD65
-74AE AD66
-74AF AD67
-74B0 AD68
-74B1 AD69
-74B2 AD6A
-74B3 AD6B
-74B4 AD6C
-74B5 AD6D
-74B6 AD6E
-74B7 AD6F
-74B8 AD70
-74B9 AD71
-74BA E8B7
-74BB AD72
-74BC AD73
-74BD AD74
-74BE AD75
-74BF AD76
-74C0 AD77
-74C1 AD78
-74C2 AD79
-74C3 AD7A
-74C4 AD7B
-74C5 AD7C
-74C6 AD7D
-74C7 AD7E
-74C8 AD80
-74C9 AD81
-74CA AD82
-74CB AD83
-74CC AD84
-74CD AD85
-74CE AD86
-74CF AD87
-74D0 AD88
-74D1 AD89
-74D2 E8B6
-74D3 AD8A
-74D4 AD8B
-74D5 AD8C
-74D6 AD8D
-74D7 AD8E
-74D8 AD8F
-74D9 AD90
-74DA AD91
-74DB AD92
-74DC B9CF
-74DD AD93
-74DE F0AC
-74DF AD94
-74E0 F0AD
-74E1 AD95
-74E2 C6B0
-74E3 B0EA
-74E4 C8BF
-74E5 AD96
-74E6 CDDF
-74E7 AD97
-74E8 AD98
-74E9 AD99
-74EA AD9A
-74EB AD9B
-74EC AD9C
-74ED AD9D
-74EE CECD
-74EF EAB1
-74F0 AD9E
-74F1 AD9F
-74F2 ADA0
-74F3 AE40
-74F4 EAB2
-74F5 AE41
-74F6 C6BF
-74F7 B4C9
-74F8 AE42
-74F9 AE43
-74FA AE44
-74FB AE45
-74FC AE46
-74FD AE47
-74FE AE48
-74FF EAB3
-7500 AE49
-7501 AE4A
-7502 AE4B
-7503 AE4C
-7504 D5E7
-7505 AE4D
-7506 AE4E
-7507 AE4F
-7508 AE50
-7509 AE51
-750A AE52
-750B AE53
-750C AE54
-750D DDF9
-750E AE55
-750F EAB4
-7510 AE56
-7511 EAB5
-7512 AE57
-7513 EAB6
-7514 AE58
-7515 AE59
-7516 AE5A
-7517 AE5B
-7518 B8CA
-7519 DFB0
-751A C9F5
-751B AE5C
-751C CCF0
-751D AE5D
-751E AE5E
-751F C9FA
-7520 AE5F
-7521 AE60
-7522 AE61
-7523 AE62
-7524 AE63
-7525 C9FB
-7526 AE64
-7527 AE65
-7528 D3C3
-7529 CBA6
-752A AE66
-752B B8A6
-752C F0AE
-752D B1C2
-752E AE67
-752F E5B8
-7530 CCEF
-7531 D3C9
-7532 BCD7
-7533 C9EA
-7534 AE68
-7535 B5E7
-7536 AE69
-7537 C4D0
-7538 B5E9
-7539 AE6A
-753A EEAE
-753B BBAD
-753C AE6B
-753D AE6C
-753E E7DE
-753F AE6D
-7540 EEAF
-7541 AE6E
-7542 AE6F
-7543 AE70
-7544 AE71
-7545 B3A9
-7546 AE72
-7547 AE73
-7548 EEB2
-7549 AE74
-754A AE75
-754B EEB1
-754C BDE7
-754D AE76
-754E EEB0
-754F CEB7
-7550 AE77
-7551 AE78
-7552 AE79
-7553 AE7A
-7554 C5CF
-7555 AE7B
-7556 AE7C
-7557 AE7D
-7558 AE7E
-7559 C1F4
-755A DBCE
-755B EEB3
-755C D0F3
-755D AE80
-755E AE81
-755F AE82
-7560 AE83
-7561 AE84
-7562 AE85
-7563 AE86
-7564 AE87
-7565 C2D4
-7566 C6E8
-7567 AE88
-7568 AE89
-7569 AE8A
-756A B7AC
-756B AE8B
-756C AE8C
-756D AE8D
-756E AE8E
-756F AE8F
-7570 AE90
-7571 AE91
-7572 EEB4
-7573 AE92
-7574 B3EB
-7575 AE93
-7576 AE94
-7577 AE95
-7578 BBFB
-7579 EEB5
-757A AE96
-757B AE97
-757C AE98
-757D AE99
-757E AE9A
-757F E7DC
-7580 AE9B
-7581 AE9C
-7582 AE9D
-7583 EEB6
-7584 AE9E
-7585 AE9F
-7586 BDAE
-7587 AEA0
-7588 AF40
-7589 AF41
-758A AF42
-758B F1E2
-758C AF43
-758D AF44
-758E AF45
-758F CAE8
-7590 AF46
-7591 D2C9
-7592 F0DA
-7593 AF47
-7594 F0DB
-7595 AF48
-7596 F0DC
-7597 C1C6
-7598 AF49
-7599 B8ED
-759A BECE
-759B AF4A
-759C AF4B
-759D F0DE
-759E AF4C
-759F C5B1
-75A0 F0DD
-75A1 D1F1
-75A2 AF4D
-75A3 F0E0
-75A4 B0CC
-75A5 BDEA
-75A6 AF4E
-75A7 AF4F
-75A8 AF50
-75A9 AF51
-75AA AF52
-75AB D2DF
-75AC F0DF
-75AD AF53
-75AE B4AF
-75AF B7E8
-75B0 F0E6
-75B1 F0E5
-75B2 C6A3
-75B3 F0E1
-75B4 F0E2
-75B5 B4C3
-75B6 AF54
-75B7 AF55
-75B8 F0E3
-75B9 D5EE
-75BA AF56
-75BB AF57
-75BC CCDB
-75BD BED2
-75BE BCB2
-75BF AF58
-75C0 AF59
-75C1 AF5A
-75C2 F0E8
-75C3 F0E7
-75C4 F0E4
-75C5 B2A1
-75C6 AF5B
-75C7 D6A2
-75C8 D3B8
-75C9 BEB7
-75CA C8AC
-75CB AF5C
-75CC AF5D
-75CD F0EA
-75CE AF5E
-75CF AF5F
-75D0 AF60
-75D1 AF61
-75D2 D1F7
-75D3 AF62
-75D4 D6CC
-75D5 BADB
-75D6 F0E9
-75D7 AF63
-75D8 B6BB
-75D9 AF64
-75DA AF65
-75DB CDB4
-75DC AF66
-75DD AF67
-75DE C6A6
-75DF AF68
-75E0 AF69
-75E1 AF6A
-75E2 C1A1
-75E3 F0EB
-75E4 F0EE
-75E5 AF6B
-75E6 F0ED
-75E7 F0F0
-75E8 F0EC
-75E9 AF6C
-75EA BBBE
-75EB F0EF
-75EC AF6D
-75ED AF6E
-75EE AF6F
-75EF AF70
-75F0 CCB5
-75F1 F0F2
-75F2 AF71
-75F3 AF72
-75F4 B3D5
-75F5 AF73
-75F6 AF74
-75F7 AF75
-75F8 AF76
-75F9 B1D4
-75FA AF77
-75FB AF78
-75FC F0F3
-75FD AF79
-75FE AF7A
-75FF F0F4
-7600 F0F6
-7601 B4E1
-7602 AF7B
-7603 F0F1
-7604 AF7C
-7605 F0F7
-7606 AF7D
-7607 AF7E
-7608 AF80
-7609 AF81
-760A F0FA
-760B AF82
-760C F0F8
-760D AF83
-760E AF84
-760F AF85
-7610 F0F5
-7611 AF86
-7612 AF87
-7613 AF88
-7614 AF89
-7615 F0FD
-7616 AF8A
-7617 F0F9
-7618 F0FC
-7619 F0FE
-761A AF8B
-761B F1A1
-761C AF8C
-761D AF8D
-761E AF8E
-761F CEC1
-7620 F1A4
-7621 AF8F
-7622 F1A3
-7623 AF90
-7624 C1F6
-7625 F0FB
-7626 CADD
-7627 AF91
-7628 AF92
-7629 B4F1
-762A B1F1
-762B CCB1
-762C AF93
-762D F1A6
-762E AF94
-762F AF95
-7630 F1A7
-7631 AF96
-7632 AF97
-7633 F1AC
-7634 D5CE
-7635 F1A9
-7636 AF98
-7637 AF99
-7638 C8B3
-7639 AF9A
-763A AF9B
-763B AF9C
-763C F1A2
-763D AF9D
-763E F1AB
-763F F1A8
-7640 F1A5
-7641 AF9E
-7642 AF9F
-7643 F1AA
-7644 AFA0
-7645 B040
-7646 B041
-7647 B042
-7648 B043
-7649 B044
-764A B045
-764B B046
-764C B0A9
-764D F1AD
-764E B047
-764F B048
-7650 B049
-7651 B04A
-7652 B04B
-7653 B04C
-7654 F1AF
-7655 B04D
-7656 F1B1
-7657 B04E
-7658 B04F
-7659 B050
-765A B051
-765B B052
-765C F1B0
-765D B053
-765E F1AE
-765F B054
-7660 B055
-7661 B056
-7662 B057
-7663 D1A2
-7664 B058
-7665 B059
-7666 B05A
-7667 B05B
-7668 B05C
-7669 B05D
-766A B05E
-766B F1B2
-766C B05F
-766D B060
-766E B061
-766F F1B3
-7670 B062
-7671 B063
-7672 B064
-7673 B065
-7674 B066
-7675 B067
-7676 B068
-7677 B069
-7678 B9EF
-7679 B06A
-767A B06B
-767B B5C7
-767C B06C
-767D B0D7
-767E B0D9
-767F B06D
-7680 B06E
-7681 B06F
-7682 D4ED
-7683 B070
-7684 B5C4
-7685 B071
-7686 BDD4
-7687 BBCA
-7688 F0A7
-7689 B072
-768A B073
-768B B8DE
-768C B074
-768D B075
-768E F0A8
-768F B076
-7690 B077
-7691 B0A8
-7692 B078
-7693 F0A9
-7694 B079
-7695 B07A
-7696 CDEE
-7697 B07B
-7698 B07C
-7699 F0AA
-769A B07D
-769B B07E
-769C B080
-769D B081
-769E B082
-769F B083
-76A0 B084
-76A1 B085
-76A2 B086
-76A3 B087
-76A4 F0AB
-76A5 B088
-76A6 B089
-76A7 B08A
-76A8 B08B
-76A9 B08C
-76AA B08D
-76AB B08E
-76AC B08F
-76AD B090
-76AE C6A4
-76AF B091
-76B0 B092
-76B1 D6E5
-76B2 F1E4
-76B3 B093
-76B4 F1E5
-76B5 B094
-76B6 B095
-76B7 B096
-76B8 B097
-76B9 B098
-76BA B099
-76BB B09A
-76BC B09B
-76BD B09C
-76BE B09D
-76BF C3F3
-76C0 B09E
-76C1 B09F
-76C2 D3DB
-76C3 B0A0
-76C4 B140
-76C5 D6D1
-76C6 C5E8
-76C7 B141
-76C8 D3AF
-76C9 B142
-76CA D2E6
-76CB B143
-76CC B144
-76CD EEC1
-76CE B0BB
-76CF D5B5
-76D0 D1CE
-76D1 BCE0
-76D2 BAD0
-76D3 B145
-76D4 BFF8
-76D5 B146
-76D6 B8C7
-76D7 B5C1
-76D8 C5CC
-76D9 B147
-76DA B148
-76DB CAA2
-76DC B149
-76DD B14A
-76DE B14B
-76DF C3CB
-76E0 B14C
-76E1 B14D
-76E2 B14E
-76E3 B14F
-76E4 B150
-76E5 EEC2
-76E6 B151
-76E7 B152
-76E8 B153
-76E9 B154
-76EA B155
-76EB B156
-76EC B157
-76ED B158
-76EE C4BF
-76EF B6A2
-76F0 B159
-76F1 EDEC
-76F2 C3A4
-76F3 B15A
-76F4 D6B1
-76F5 B15B
-76F6 B15C
-76F7 B15D
-76F8 CFE0
-76F9 EDEF
-76FA B15E
-76FB B15F
-76FC C5CE
-76FD B160
-76FE B6DC
-76FF B161
-7700 B162
-7701 CAA1
-7702 B163
-7703 B164
-7704 EDED
-7705 B165
-7706 B166
-7707 EDF0
-7708 EDF1
-7709 C3BC
-770A B167
-770B BFB4
-770C B168
-770D EDEE
-770E B169
-770F B16A
-7710 B16B
-7711 B16C
-7712 B16D
-7713 B16E
-7714 B16F
-7715 B170
-7716 B171
-7717 B172
-7718 B173
-7719 EDF4
-771A EDF2
-771B B174
-771C B175
-771D B176
-771E B177
-771F D5E6
-7720 C3DF
-7721 B178
-7722 EDF3
-7723 B179
-7724 B17A
-7725 B17B
-7726 EDF6
-7727 B17C
-7728 D5A3
-7729 D1A3
-772A B17D
-772B B17E
-772C B180
-772D EDF5
-772E B181
-772F C3D0
-7730 B182
-7731 B183
-7732 B184
-7733 B185
-7734 B186
-7735 EDF7
-7736 BFF4
-7737 BEEC
-7738 EDF8
-7739 B187
-773A CCF7
-773B B188
-773C D1DB
-773D B189
-773E B18A
-773F B18B
-7740 D7C5
-7741 D5F6
-7742 B18C
-7743 EDFC
-7744 B18D
-7745 B18E
-7746 B18F
-7747 EDFB
-7748 B190
-7749 B191
-774A B192
-774B B193
-774C B194
-774D B195
-774E B196
-774F B197
-7750 EDF9
-7751 EDFA
-7752 B198
-7753 B199
-7754 B19A
-7755 B19B
-7756 B19C
-7757 B19D
-7758 B19E
-7759 B19F
-775A EDFD
-775B BEA6
-775C B1A0
-775D B240
-775E B241
-775F B242
-7760 B243
-7761 CBAF
-7762 EEA1
-7763 B6BD
-7764 B244
-7765 EEA2
-7766 C4C0
-7767 B245
-7768 EDFE
-7769 B246
-776A B247
-776B BDDE
-776C B2C7
-776D B248
-776E B249
-776F B24A
-7770 B24B
-7771 B24C
-7772 B24D
-7773 B24E
-7774 B24F
-7775 B250
-7776 B251
-7777 B252
-7778 B253
-7779 B6C3
-777A B254
-777B B255
-777C B256
-777D EEA5
-777E D8BA
-777F EEA3
-7780 EEA6
-7781 B257
-7782 B258
-7783 B259
-7784 C3E9
-7785 B3F2
-7786 B25A
-7787 B25B
-7788 B25C
-7789 B25D
-778A B25E
-778B B25F
-778C EEA7
-778D EEA4
-778E CFB9
-778F B260
-7790 B261
-7791 EEA8
-7792 C2F7
-7793 B262
-7794 B263
-7795 B264
-7796 B265
-7797 B266
-7798 B267
-7799 B268
-779A B269
-779B B26A
-779C B26B
-779D B26C
-779E B26D
-779F EEA9
-77A0 EEAA
-77A1 B26E
-77A2 DEAB
-77A3 B26F
-77A4 B270
-77A5 C6B3
-77A6 B271
-77A7 C7C6
-77A8 B272
-77A9 D6F5
-77AA B5C9
-77AB B273
-77AC CBB2
-77AD B274
-77AE B275
-77AF B276
-77B0 EEAB
-77B1 B277
-77B2 B278
-77B3 CDAB
-77B4 B279
-77B5 EEAC
-77B6 B27A
-77B7 B27B
-77B8 B27C
-77B9 B27D
-77BA B27E
-77BB D5B0
-77BC B280
-77BD EEAD
-77BE B281
-77BF F6C4
-77C0 B282
-77C1 B283
-77C2 B284
-77C3 B285
-77C4 B286
-77C5 B287
-77C6 B288
-77C7 B289
-77C8 B28A
-77C9 B28B
-77CA B28C
-77CB B28D
-77CC B28E
-77CD DBC7
-77CE B28F
-77CF B290
-77D0 B291
-77D1 B292
-77D2 B293
-77D3 B294
-77D4 B295
-77D5 B296
-77D6 B297
-77D7 B4A3
-77D8 B298
-77D9 B299
-77DA B29A
-77DB C3AC
-77DC F1E6
-77DD B29B
-77DE B29C
-77DF B29D
-77E0 B29E
-77E1 B29F
-77E2 CAB8
-77E3 D2D3
-77E4 B2A0
-77E5 D6AA
-77E6 B340
-77E7 EFF2
-77E8 B341
-77E9 BED8
-77EA B342
-77EB BDC3
-77EC EFF3
-77ED B6CC
-77EE B0AB
-77EF B343
-77F0 B344
-77F1 B345
-77F2 B346
-77F3 CAAF
-77F4 B347
-77F5 B348
-77F6 EDB6
-77F7 B349
-77F8 EDB7
-77F9 B34A
-77FA B34B
-77FB B34C
-77FC B34D
-77FD CEF9
-77FE B7AF
-77FF BFF3
-7800 EDB8
-7801 C2EB
-7802 C9B0
-7803 B34E
-7804 B34F
-7805 B350
-7806 B351
-7807 B352
-7808 B353
-7809 EDB9
-780A B354
-780B B355
-780C C6F6
-780D BFB3
-780E B356
-780F B357
-7810 B358
-7811 EDBC
-7812 C5F8
-7813 B359
-7814 D1D0
-7815 B35A
-7816 D7A9
-7817 EDBA
-7818 EDBB
-7819 B35B
-781A D1E2
-781B B35C
-781C EDBF
-781D EDC0
-781E B35D
-781F EDC4
-7820 B35E
-7821 B35F
-7822 B360
-7823 EDC8
-7824 B361
-7825 EDC6
-7826 EDCE
-7827 D5E8
-7828 B362
-7829 EDC9
-782A B363
-782B B364
-782C EDC7
-782D EDBE
-782E B365
-782F B366
-7830 C5E9
-7831 B367
-7832 B368
-7833 B369
-7834 C6C6
-7835 B36A
-7836 B36B
-7837 C9E9
-7838 D4D2
-7839 EDC1
-783A EDC2
-783B EDC3
-783C EDC5
-783D B36C
-783E C0F9
-783F B36D
-7840 B4A1
-7841 B36E
-7842 B36F
-7843 B370
-7844 B371
-7845 B9E8
-7846 B372
-7847 EDD0
-7848 B373
-7849 B374
-784A B375
-784B B376
-784C EDD1
-784D B377
-784E EDCA
-784F B378
-7850 EDCF
-7851 B379
-7852 CEF8
-7853 B37A
-7854 B37B
-7855 CBB6
-7856 EDCC
-7857 EDCD
-7858 B37C
-7859 B37D
-785A B37E
-785B B380
-785C B381
-785D CFF5
-785E B382
-785F B383
-7860 B384
-7861 B385
-7862 B386
-7863 B387
-7864 B388
-7865 B389
-7866 B38A
-7867 B38B
-7868 B38C
-7869 B38D
-786A EDD2
-786B C1F2
-786C D3B2
-786D EDCB
-786E C8B7
-786F B38E
-7870 B38F
-7871 B390
-7872 B391
-7873 B392
-7874 B393
-7875 B394
-7876 B395
-7877 BCEF
-7878 B396
-7879 B397
-787A B398
-787B B399
-787C C5F0
-787D B39A
-787E B39B
-787F B39C
-7880 B39D
-7881 B39E
-7882 B39F
-7883 B3A0
-7884 B440
-7885 B441
-7886 B442
-7887 EDD6
-7888 B443
-7889 B5EF
-788A B444
-788B B445
-788C C2B5
-788D B0AD
-788E CBE9
-788F B446
-7890 B447
-7891 B1AE
-7892 B448
-7893 EDD4
-7894 B449
-7895 B44A
-7896 B44B
-7897 CDEB
-7898 B5E2
-7899 B44C
-789A EDD5
-789B EDD3
-789C EDD7
-789D B44D
-789E B44E
-789F B5FA
-78A0 B44F
-78A1 EDD8
-78A2 B450
-78A3 EDD9
-78A4 B451
-78A5 EDDC
-78A6 B452
-78A7 B1CC
-78A8 B453
-78A9 B454
-78AA B455
-78AB B456
-78AC B457
-78AD B458
-78AE B459
-78AF B45A
-78B0 C5F6
-78B1 BCEE
-78B2 EDDA
-78B3 CCBC
-78B4 B2EA
-78B5 B45B
-78B6 B45C
-78B7 B45D
-78B8 B45E
-78B9 EDDB
-78BA B45F
-78BB B460
-78BC B461
-78BD B462
-78BE C4EB
-78BF B463
-78C0 B464
-78C1 B4C5
-78C2 B465
-78C3 B466
-78C4 B467
-78C5 B0F5
-78C6 B468
-78C7 B469
-78C8 B46A
-78C9 EDDF
-78CA C0DA
-78CB B4E8
-78CC B46B
-78CD B46C
-78CE B46D
-78CF B46E
-78D0 C5CD
-78D1 B46F
-78D2 B470
-78D3 B471
-78D4 EDDD
-78D5 BFC4
-78D6 B472
-78D7 B473
-78D8 B474
-78D9 EDDE
-78DA B475
-78DB B476
-78DC B477
-78DD B478
-78DE B479
-78DF B47A
-78E0 B47B
-78E1 B47C
-78E2 B47D
-78E3 B47E
-78E4 B480
-78E5 B481
-78E6 B482
-78E7 B483
-78E8 C4A5
-78E9 B484
-78EA B485
-78EB B486
-78EC EDE0
-78ED B487
-78EE B488
-78EF B489
-78F0 B48A
-78F1 B48B
-78F2 EDE1
-78F3 B48C
-78F4 EDE3
-78F5 B48D
-78F6 B48E
-78F7 C1D7
-78F8 B48F
-78F9 B490
-78FA BBC7
-78FB B491
-78FC B492
-78FD B493
-78FE B494
-78FF B495
-7900 B496
-7901 BDB8
-7902 B497
-7903 B498
-7904 B499
-7905 EDE2
-7906 B49A
-7907 B49B
-7908 B49C
-7909 B49D
-790A B49E
-790B B49F
-790C B4A0
-790D B540
-790E B541
-790F B542
-7910 B543
-7911 B544
-7912 B545
-7913 EDE4
-7914 B546
-7915 B547
-7916 B548
-7917 B549
-7918 B54A
-7919 B54B
-791A B54C
-791B B54D
-791C B54E
-791D B54F
-791E EDE6
-791F B550
-7920 B551
-7921 B552
-7922 B553
-7923 B554
-7924 EDE5
-7925 B555
-7926 B556
-7927 B557
-7928 B558
-7929 B559
-792A B55A
-792B B55B
-792C B55C
-792D B55D
-792E B55E
-792F B55F
-7930 B560
-7931 B561
-7932 B562
-7933 B563
-7934 EDE7
-7935 B564
-7936 B565
-7937 B566
-7938 B567
-7939 B568
-793A CABE
-793B ECEA
-793C C0F1
-793D B569
-793E C9E7
-793F B56A
-7940 ECEB
-7941 C6EE
-7942 B56B
-7943 B56C
-7944 B56D
-7945 B56E
-7946 ECEC
-7947 B56F
-7948 C6ED
-7949 ECED
-794A B570
-794B B571
-794C B572
-794D B573
-794E B574
-794F B575
-7950 B576
-7951 B577
-7952 B578
-7953 ECF0
-7954 B579
-7955 B57A
-7956 D7E6
-7957 ECF3
-7958 B57B
-7959 B57C
-795A ECF1
-795B ECEE
-795C ECEF
-795D D7A3
-795E C9F1
-795F CBEE
-7960 ECF4
-7961 B57D
-7962 ECF2
-7963 B57E
-7964 B580
-7965 CFE9
-7966 B581
-7967 ECF6
-7968 C6B1
-7969 B582
-796A B583
-796B B584
-796C B585
-796D BCC0
-796E B586
-796F ECF5
-7970 B587
-7971 B588
-7972 B589
-7973 B58A
-7974 B58B
-7975 B58C
-7976 B58D
-7977 B5BB
-7978 BBF6
-7979 B58E
-797A ECF7
-797B B58F
-797C B590
-797D B591
-797E B592
-797F B593
-7980 D9F7
-7981 BDFB
-7982 B594
-7983 B595
-7984 C2BB
-7985 ECF8
-7986 B596
-7987 B597
-7988 B598
-7989 B599
-798A ECF9
-798B B59A
-798C B59B
-798D B59C
-798E B59D
-798F B8A3
-7990 B59E
-7991 B59F
-7992 B5A0
-7993 B640
-7994 B641
-7995 B642
-7996 B643
-7997 B644
-7998 B645
-7999 B646
-799A ECFA
-799B B647
-799C B648
-799D B649
-799E B64A
-799F B64B
-79A0 B64C
-79A1 B64D
-79A2 B64E
-79A3 B64F
-79A4 B650
-79A5 B651
-79A6 B652
-79A7 ECFB
-79A8 B653
-79A9 B654
-79AA B655
-79AB B656
-79AC B657
-79AD B658
-79AE B659
-79AF B65A
-79B0 B65B
-79B1 B65C
-79B2 B65D
-79B3 ECFC
-79B4 B65E
-79B5 B65F
-79B6 B660
-79B7 B661
-79B8 B662
-79B9 D3ED
-79BA D8AE
-79BB C0EB
-79BC B663
-79BD C7DD
-79BE BACC
-79BF B664
-79C0 D0E3
-79C1 CBBD
-79C2 B665
-79C3 CDBA
-79C4 B666
-79C5 B667
-79C6 B8D1
-79C7 B668
-79C8 B669
-79C9 B1FC
-79CA B66A
-79CB C7EF
-79CC B66B
-79CD D6D6
-79CE B66C
-79CF B66D
-79D0 B66E
-79D1 BFC6
-79D2 C3EB
-79D3 B66F
-79D4 B670
-79D5 EFF5
-79D6 B671
-79D7 B672
-79D8 C3D8
-79D9 B673
-79DA B674
-79DB B675
-79DC B676
-79DD B677
-79DE B678
-79DF D7E2
-79E0 B679
-79E1 B67A
-79E2 B67B
-79E3 EFF7
-79E4 B3D3
-79E5 B67C
-79E6 C7D8
-79E7 D1ED
-79E8 B67D
-79E9 D6C8
-79EA B67E
-79EB EFF8
-79EC B680
-79ED EFF6
-79EE B681
-79EF BBFD
-79F0 B3C6
-79F1 B682
-79F2 B683
-79F3 B684
-79F4 B685
-79F5 B686
-79F6 B687
-79F7 B688
-79F8 BDD5
-79F9 B689
-79FA B68A
-79FB D2C6
-79FC B68B
-79FD BBE0
-79FE B68C
-79FF B68D
-7A00 CFA1
-7A01 B68E
-7A02 EFFC
-7A03 EFFB
-7A04 B68F
-7A05 B690
-7A06 EFF9
-7A07 B691
-7A08 B692
-7A09 B693
-7A0A B694
-7A0B B3CC
-7A0C B695
-7A0D C9D4
-7A0E CBB0
-7A0F B696
-7A10 B697
-7A11 B698
-7A12 B699
-7A13 B69A
-7A14 EFFE
-7A15 B69B
-7A16 B69C
-7A17 B0DE
-7A18 B69D
-7A19 B69E
-7A1A D6C9
-7A1B B69F
-7A1C B6A0
-7A1D B740
-7A1E EFFD
-7A1F B741
-7A20 B3ED
-7A21 B742
-7A22 B743
-7A23 F6D5
-7A24 B744
-7A25 B745
-7A26 B746
-7A27 B747
-7A28 B748
-7A29 B749
-7A2A B74A
-7A2B B74B
-7A2C B74C
-7A2D B74D
-7A2E B74E
-7A2F B74F
-7A30 B750
-7A31 B751
-7A32 B752
-7A33 CEC8
-7A34 B753
-7A35 B754
-7A36 B755
-7A37 F0A2
-7A38 B756
-7A39 F0A1
-7A3A B757
-7A3B B5BE
-7A3C BCDA
-7A3D BBFC
-7A3E B758
-7A3F B8E5
-7A40 B759
-7A41 B75A
-7A42 B75B
-7A43 B75C
-7A44 B75D
-7A45 B75E
-7A46 C4C2
-7A47 B75F
-7A48 B760
-7A49 B761
-7A4A B762
-7A4B B763
-7A4C B764
-7A4D B765
-7A4E B766
-7A4F B767
-7A50 B768
-7A51 F0A3
-7A52 B769
-7A53 B76A
-7A54 B76B
-7A55 B76C
-7A56 B76D
-7A57 CBEB
-7A58 B76E
-7A59 B76F
-7A5A B770
-7A5B B771
-7A5C B772
-7A5D B773
-7A5E B774
-7A5F B775
-7A60 B776
-7A61 B777
-7A62 B778
-7A63 B779
-7A64 B77A
-7A65 B77B
-7A66 B77C
-7A67 B77D
-7A68 B77E
-7A69 B780
-7A6A B781
-7A6B B782
-7A6C B783
-7A6D B784
-7A6E B785
-7A6F B786
-7A70 F0A6
-7A71 B787
-7A72 B788
-7A73 B789
-7A74 D1A8
-7A75 B78A
-7A76 BEBF
-7A77 C7EE
-7A78 F1B6
-7A79 F1B7
-7A7A BFD5
-7A7B B78B
-7A7C B78C
-7A7D B78D
-7A7E B78E
-7A7F B4A9
-7A80 F1B8
-7A81 CDBB
-7A82 B78F
-7A83 C7D4
-7A84 D5AD
-7A85 B790
-7A86 F1B9
-7A87 B791
-7A88 F1BA
-7A89 B792
-7A8A B793
-7A8B B794
-7A8C B795
-7A8D C7CF
-7A8E B796
-7A8F B797
-7A90 B798
-7A91 D2A4
-7A92 D6CF
-7A93 B799
-7A94 B79A
-7A95 F1BB
-7A96 BDD1
-7A97 B4B0
-7A98 BEBD
-7A99 B79B
-7A9A B79C
-7A9B B79D
-7A9C B4DC
-7A9D CED1
-7A9E B79E
-7A9F BFDF
-7AA0 F1BD
-7AA1 B79F
-7AA2 B7A0
-7AA3 B840
-7AA4 B841
-7AA5 BFFA
-7AA6 F1BC
-7AA7 B842
-7AA8 F1BF
-7AA9 B843
-7AAA B844
-7AAB B845
-7AAC F1BE
-7AAD F1C0
-7AAE B846
-7AAF B847
-7AB0 B848
-7AB1 B849
-7AB2 B84A
-7AB3 F1C1
-7AB4 B84B
-7AB5 B84C
-7AB6 B84D
-7AB7 B84E
-7AB8 B84F
-7AB9 B850
-7ABA B851
-7ABB B852
-7ABC B853
-7ABD B854
-7ABE B855
-7ABF C1FE
-7AC0 B856
-7AC1 B857
-7AC2 B858
-7AC3 B859
-7AC4 B85A
-7AC5 B85B
-7AC6 B85C
-7AC7 B85D
-7AC8 B85E
-7AC9 B85F
-7ACA B860
-7ACB C1A2
-7ACC B861
-7ACD B862
-7ACE B863
-7ACF B864
-7AD0 B865
-7AD1 B866
-7AD2 B867
-7AD3 B868
-7AD4 B869
-7AD5 B86A
-7AD6 CAFA
-7AD7 B86B
-7AD8 B86C
-7AD9 D5BE
-7ADA B86D
-7ADB B86E
-7ADC B86F
-7ADD B870
-7ADE BEBA
-7ADF BEB9
-7AE0 D5C2
-7AE1 B871
-7AE2 B872
-7AE3 BFA2
-7AE4 B873
-7AE5 CDAF
-7AE6 F1B5
-7AE7 B874
-7AE8 B875
-7AE9 B876
-7AEA B877
-7AEB B878
-7AEC B879
-7AED BDDF
-7AEE B87A
-7AEF B6CB
-7AF0 B87B
-7AF1 B87C
-7AF2 B87D
-7AF3 B87E
-7AF4 B880
-7AF5 B881
-7AF6 B882
-7AF7 B883
-7AF8 B884
-7AF9 D6F1
-7AFA F3C3
-7AFB B885
-7AFC B886
-7AFD F3C4
-7AFE B887
-7AFF B8CD
-7B00 B888
-7B01 B889
-7B02 B88A
-7B03 F3C6
-7B04 F3C7
-7B05 B88B
-7B06 B0CA
-7B07 B88C
-7B08 F3C5
-7B09 B88D
-7B0A F3C9
-7B0B CBF1
-7B0C B88E
-7B0D B88F
-7B0E B890
-7B0F F3CB
-7B10 B891
-7B11 D0A6
-7B12 B892
-7B13 B893
-7B14 B1CA
-7B15 F3C8
-7B16 B894
-7B17 B895
-7B18 B896
-7B19 F3CF
-7B1A B897
-7B1B B5D1
-7B1C B898
-7B1D B899
-7B1E F3D7
-7B1F B89A
-7B20 F3D2
-7B21 B89B
-7B22 B89C
-7B23 B89D
-7B24 F3D4
-7B25 F3D3
-7B26 B7FB
-7B27 B89E
-7B28 B1BF
-7B29 B89F
-7B2A F3CE
-7B2B F3CA
-7B2C B5DA
-7B2D B8A0
-7B2E F3D0
-7B2F B940
-7B30 B941
-7B31 F3D1
-7B32 B942
-7B33 F3D5
-7B34 B943
-7B35 B944
-7B36 B945
-7B37 B946
-7B38 F3CD
-7B39 B947
-7B3A BCE3
-7B3B B948
-7B3C C1FD
-7B3D B949
-7B3E F3D6
-7B3F B94A
-7B40 B94B
-7B41 B94C
-7B42 B94D
-7B43 B94E
-7B44 B94F
-7B45 F3DA
-7B46 B950
-7B47 F3CC
-7B48 B951
-7B49 B5C8
-7B4A B952
-7B4B BDEE
-7B4C F3DC
-7B4D B953
-7B4E B954
-7B4F B7A4
-7B50 BFF0
-7B51 D6FE
-7B52 CDB2
-7B53 B955
-7B54 B4F0
-7B55 B956
-7B56 B2DF
-7B57 B957
-7B58 F3D8
-7B59 B958
-7B5A F3D9
-7B5B C9B8
-7B5C B959
-7B5D F3DD
-7B5E B95A
-7B5F B95B
-7B60 F3DE
-7B61 B95C
-7B62 F3E1
-7B63 B95D
-7B64 B95E
-7B65 B95F
-7B66 B960
-7B67 B961
-7B68 B962
-7B69 B963
-7B6A B964
-7B6B B965
-7B6C B966
-7B6D B967
-7B6E F3DF
-7B6F B968
-7B70 B969
-7B71 F3E3
-7B72 F3E2
-7B73 B96A
-7B74 B96B
-7B75 F3DB
-7B76 B96C
-7B77 BFEA
-7B78 B96D
-7B79 B3EF
-7B7A B96E
-7B7B F3E0
-7B7C B96F
-7B7D B970
-7B7E C7A9
-7B7F B971
-7B80 BCF2
-7B81 B972
-7B82 B973
-7B83 B974
-7B84 B975
-7B85 F3EB
-7B86 B976
-7B87 B977
-7B88 B978
-7B89 B979
-7B8A B97A
-7B8B B97B
-7B8C B97C
-7B8D B9BF
-7B8E B97D
-7B8F B97E
-7B90 F3E4
-7B91 B980
-7B92 B981
-7B93 B982
-7B94 B2AD
-7B95 BBFE
-7B96 B983
-7B97 CBE3
-7B98 B984
-7B99 B985
-7B9A B986
-7B9B B987
-7B9C F3ED
-7B9D F3E9
-7B9E B988
-7B9F B989
-7BA0 B98A
-7BA1 B9DC
-7BA2 F3EE
-7BA3 B98B
-7BA4 B98C
-7BA5 B98D
-7BA6 F3E5
-7BA7 F3E6
-7BA8 F3EA
-7BA9 C2E1
-7BAA F3EC
-7BAB F3EF
-7BAC F3E8
-7BAD BCFD
-7BAE B98E
-7BAF B98F
-7BB0 B990
-7BB1 CFE4
-7BB2 B991
-7BB3 B992
-7BB4 F3F0
-7BB5 B993
-7BB6 B994
-7BB7 B995
-7BB8 F3E7
-7BB9 B996
-7BBA B997
-7BBB B998
-7BBC B999
-7BBD B99A
-7BBE B99B
-7BBF B99C
-7BC0 B99D
-7BC1 F3F2
-7BC2 B99E
-7BC3 B99F
-7BC4 B9A0
-7BC5 BA40
-7BC6 D7AD
-7BC7 C6AA
-7BC8 BA41
-7BC9 BA42
-7BCA BA43
-7BCB BA44
-7BCC F3F3
-7BCD BA45
-7BCE BA46
-7BCF BA47
-7BD0 BA48
-7BD1 F3F1
-7BD2 BA49
-7BD3 C2A8
-7BD4 BA4A
-7BD5 BA4B
-7BD6 BA4C
-7BD7 BA4D
-7BD8 BA4E
-7BD9 B8DD
-7BDA F3F5
-7BDB BA4F
-7BDC BA50
-7BDD F3F4
-7BDE BA51
-7BDF BA52
-7BE0 BA53
-7BE1 B4DB
-7BE2 BA54
-7BE3 BA55
-7BE4 BA56
-7BE5 F3F6
-7BE6 F3F7
-7BE7 BA57
-7BE8 BA58
-7BE9 BA59
-7BEA F3F8
-7BEB BA5A
-7BEC BA5B
-7BED BA5C
-7BEE C0BA
-7BEF BA5D
-7BF0 BA5E
-7BF1 C0E9
-7BF2 BA5F
-7BF3 BA60
-7BF4 BA61
-7BF5 BA62
-7BF6 BA63
-7BF7 C5F1
-7BF8 BA64
-7BF9 BA65
-7BFA BA66
-7BFB BA67
-7BFC F3FB
-7BFD BA68
-7BFE F3FA
-7BFF BA69
-7C00 BA6A
-7C01 BA6B
-7C02 BA6C
-7C03 BA6D
-7C04 BA6E
-7C05 BA6F
-7C06 BA70
-7C07 B4D8
-7C08 BA71
-7C09 BA72
-7C0A BA73
-7C0B F3FE
-7C0C F3F9
-7C0D BA74
-7C0E BA75
-7C0F F3FC
-7C10 BA76
-7C11 BA77
-7C12 BA78
-7C13 BA79
-7C14 BA7A
-7C15 BA7B
-7C16 F3FD
-7C17 BA7C
-7C18 BA7D
-7C19 BA7E
-7C1A BA80
-7C1B BA81
-7C1C BA82
-7C1D BA83
-7C1E BA84
-7C1F F4A1
-7C20 BA85
-7C21 BA86
-7C22 BA87
-7C23 BA88
-7C24 BA89
-7C25 BA8A
-7C26 F4A3
-7C27 BBC9
-7C28 BA8B
-7C29 BA8C
-7C2A F4A2
-7C2B BA8D
-7C2C BA8E
-7C2D BA8F
-7C2E BA90
-7C2F BA91
-7C30 BA92
-7C31 BA93
-7C32 BA94
-7C33 BA95
-7C34 BA96
-7C35 BA97
-7C36 BA98
-7C37 BA99
-7C38 F4A4
-7C39 BA9A
-7C3A BA9B
-7C3B BA9C
-7C3C BA9D
-7C3D BA9E
-7C3E BA9F
-7C3F B2BE
-7C40 F4A6
-7C41 F4A5
-7C42 BAA0
-7C43 BB40
-7C44 BB41
-7C45 BB42
-7C46 BB43
-7C47 BB44
-7C48 BB45
-7C49 BB46
-7C4A BB47
-7C4B BB48
-7C4C BB49
-7C4D BCAE
-7C4E BB4A
-7C4F BB4B
-7C50 BB4C
-7C51 BB4D
-7C52 BB4E
-7C53 BB4F
-7C54 BB50
-7C55 BB51
-7C56 BB52
-7C57 BB53
-7C58 BB54
-7C59 BB55
-7C5A BB56
-7C5B BB57
-7C5C BB58
-7C5D BB59
-7C5E BB5A
-7C5F BB5B
-7C60 BB5C
-7C61 BB5D
-7C62 BB5E
-7C63 BB5F
-7C64 BB60
-7C65 BB61
-7C66 BB62
-7C67 BB63
-7C68 BB64
-7C69 BB65
-7C6A BB66
-7C6B BB67
-7C6C BB68
-7C6D BB69
-7C6E BB6A
-7C6F BB6B
-7C70 BB6C
-7C71 BB6D
-7C72 BB6E
-7C73 C3D7
-7C74 D9E1
-7C75 BB6F
-7C76 BB70
-7C77 BB71
-7C78 BB72
-7C79 BB73
-7C7A BB74
-7C7B C0E0
-7C7C F4CC
-7C7D D7D1
-7C7E BB75
-7C7F BB76
-7C80 BB77
-7C81 BB78
-7C82 BB79
-7C83 BB7A
-7C84 BB7B
-7C85 BB7C
-7C86 BB7D
-7C87 BB7E
-7C88 BB80
-7C89 B7DB
-7C8A BB81
-7C8B BB82
-7C8C BB83
-7C8D BB84
-7C8E BB85
-7C8F BB86
-7C90 BB87
-7C91 F4CE
-7C92 C1A3
-7C93 BB88
-7C94 BB89
-7C95 C6C9
-7C96 BB8A
-7C97 B4D6
-7C98 D5B3
-7C99 BB8B
-7C9A BB8C
-7C9B BB8D
-7C9C F4D0
-7C9D F4CF
-7C9E F4D1
-7C9F CBDA
-7CA0 BB8E
-7CA1 BB8F
-7CA2 F4D2
-7CA3 BB90
-7CA4 D4C1
-7CA5 D6E0
-7CA6 BB91
-7CA7 BB92
-7CA8 BB93
-7CA9 BB94
-7CAA B7E0
-7CAB BB95
-7CAC BB96
-7CAD BB97
-7CAE C1B8
-7CAF BB98
-7CB0 BB99
-7CB1 C1BB
-7CB2 F4D3
-7CB3 BEAC
-7CB4 BB9A
-7CB5 BB9B
-7CB6 BB9C
-7CB7 BB9D
-7CB8 BB9E
-7CB9 B4E2
-7CBA BB9F
-7CBB BBA0
-7CBC F4D4
-7CBD F4D5
-7CBE BEAB
-7CBF BC40
-7CC0 BC41
-7CC1 F4D6
-7CC2 BC42
-7CC3 BC43
-7CC4 BC44
-7CC5 F4DB
-7CC6 BC45
-7CC7 F4D7
-7CC8 F4DA
-7CC9 BC46
-7CCA BAFD
-7CCB BC47
-7CCC F4D8
-7CCD F4D9
-7CCE BC48
-7CCF BC49
-7CD0 BC4A
-7CD1 BC4B
-7CD2 BC4C
-7CD3 BC4D
-7CD4 BC4E
-7CD5 B8E2
-7CD6 CCC7
-7CD7 F4DC
-7CD8 BC4F
-7CD9 B2DA
-7CDA BC50
-7CDB BC51
-7CDC C3D3
-7CDD BC52
-7CDE BC53
-7CDF D4E3
-7CE0 BFB7
-7CE1 BC54
-7CE2 BC55
-7CE3 BC56
-7CE4 BC57
-7CE5 BC58
-7CE6 BC59
-7CE7 BC5A
-7CE8 F4DD
-7CE9 BC5B
-7CEA BC5C
-7CEB BC5D
-7CEC BC5E
-7CED BC5F
-7CEE BC60
-7CEF C5B4
-7CF0 BC61
-7CF1 BC62
-7CF2 BC63
-7CF3 BC64
-7CF4 BC65
-7CF5 BC66
-7CF6 BC67
-7CF7 BC68
-7CF8 F4E9
-7CF9 BC69
-7CFA BC6A
-7CFB CFB5
-7CFC BC6B
-7CFD BC6C
-7CFE BC6D
-7CFF BC6E
-7D00 BC6F
-7D01 BC70
-7D02 BC71
-7D03 BC72
-7D04 BC73
-7D05 BC74
-7D06 BC75
-7D07 BC76
-7D08 BC77
-7D09 BC78
-7D0A CEC9
-7D0B BC79
-7D0C BC7A
-7D0D BC7B
-7D0E BC7C
-7D0F BC7D
-7D10 BC7E
-7D11 BC80
-7D12 BC81
-7D13 BC82
-7D14 BC83
-7D15 BC84
-7D16 BC85
-7D17 BC86
-7D18 BC87
-7D19 BC88
-7D1A BC89
-7D1B BC8A
-7D1C BC8B
-7D1D BC8C
-7D1E BC8D
-7D1F BC8E
-7D20 CBD8
-7D21 BC8F
-7D22 CBF7
-7D23 BC90
-7D24 BC91
-7D25 BC92
-7D26 BC93
-7D27 BDF4
-7D28 BC94
-7D29 BC95
-7D2A BC96
-7D2B D7CF
-7D2C BC97
-7D2D BC98
-7D2E BC99
-7D2F C0DB
-7D30 BC9A
-7D31 BC9B
-7D32 BC9C
-7D33 BC9D
-7D34 BC9E
-7D35 BC9F
-7D36 BCA0
-7D37 BD40
-7D38 BD41
-7D39 BD42
-7D3A BD43
-7D3B BD44
-7D3C BD45
-7D3D BD46
-7D3E BD47
-7D3F BD48
-7D40 BD49
-7D41 BD4A
-7D42 BD4B
-7D43 BD4C
-7D44 BD4D
-7D45 BD4E
-7D46 BD4F
-7D47 BD50
-7D48 BD51
-7D49 BD52
-7D4A BD53
-7D4B BD54
-7D4C BD55
-7D4D BD56
-7D4E BD57
-7D4F BD58
-7D50 BD59
-7D51 BD5A
-7D52 BD5B
-7D53 BD5C
-7D54 BD5D
-7D55 BD5E
-7D56 BD5F
-7D57 BD60
-7D58 BD61
-7D59 BD62
-7D5A BD63
-7D5B BD64
-7D5C BD65
-7D5D BD66
-7D5E BD67
-7D5F BD68
-7D60 BD69
-7D61 BD6A
-7D62 BD6B
-7D63 BD6C
-7D64 BD6D
-7D65 BD6E
-7D66 BD6F
-7D67 BD70
-7D68 BD71
-7D69 BD72
-7D6A BD73
-7D6B BD74
-7D6C BD75
-7D6D BD76
-7D6E D0F5
-7D6F BD77
-7D70 BD78
-7D71 BD79
-7D72 BD7A
-7D73 BD7B
-7D74 BD7C
-7D75 BD7D
-7D76 BD7E
-7D77 F4EA
-7D78 BD80
-7D79 BD81
-7D7A BD82
-7D7B BD83
-7D7C BD84
-7D7D BD85
-7D7E BD86
-7D7F BD87
-7D80 BD88
-7D81 BD89
-7D82 BD8A
-7D83 BD8B
-7D84 BD8C
-7D85 BD8D
-7D86 BD8E
-7D87 BD8F
-7D88 BD90
-7D89 BD91
-7D8A BD92
-7D8B BD93
-7D8C BD94
-7D8D BD95
-7D8E BD96
-7D8F BD97
-7D90 BD98
-7D91 BD99
-7D92 BD9A
-7D93 BD9B
-7D94 BD9C
-7D95 BD9D
-7D96 BD9E
-7D97 BD9F
-7D98 BDA0
-7D99 BE40
-7D9A BE41
-7D9B BE42
-7D9C BE43
-7D9D BE44
-7D9E BE45
-7D9F BE46
-7DA0 BE47
-7DA1 BE48
-7DA2 BE49
-7DA3 BE4A
-7DA4 BE4B
-7DA5 BE4C
-7DA6 F4EB
-7DA7 BE4D
-7DA8 BE4E
-7DA9 BE4F
-7DAA BE50
-7DAB BE51
-7DAC BE52
-7DAD BE53
-7DAE F4EC
-7DAF BE54
-7DB0 BE55
-7DB1 BE56
-7DB2 BE57
-7DB3 BE58
-7DB4 BE59
-7DB5 BE5A
-7DB6 BE5B
-7DB7 BE5C
-7DB8 BE5D
-7DB9 BE5E
-7DBA BE5F
-7DBB BE60
-7DBC BE61
-7DBD BE62
-7DBE BE63
-7DBF BE64
-7DC0 BE65
-7DC1 BE66
-7DC2 BE67
-7DC3 BE68
-7DC4 BE69
-7DC5 BE6A
-7DC6 BE6B
-7DC7 BE6C
-7DC8 BE6D
-7DC9 BE6E
-7DCA BE6F
-7DCB BE70
-7DCC BE71
-7DCD BE72
-7DCE BE73
-7DCF BE74
-7DD0 BE75
-7DD1 BE76
-7DD2 BE77
-7DD3 BE78
-7DD4 BE79
-7DD5 BE7A
-7DD6 BE7B
-7DD7 BE7C
-7DD8 BE7D
-7DD9 BE7E
-7DDA BE80
-7DDB BE81
-7DDC BE82
-7DDD BE83
-7DDE BE84
-7DDF BE85
-7DE0 BE86
-7DE1 BE87
-7DE2 BE88
-7DE3 BE89
-7DE4 BE8A
-7DE5 BE8B
-7DE6 BE8C
-7DE7 BE8D
-7DE8 BE8E
-7DE9 BE8F
-7DEA BE90
-7DEB BE91
-7DEC BE92
-7DED BE93
-7DEE BE94
-7DEF BE95
-7DF0 BE96
-7DF1 BE97
-7DF2 BE98
-7DF3 BE99
-7DF4 BE9A
-7DF5 BE9B
-7DF6 BE9C
-7DF7 BE9D
-7DF8 BE9E
-7DF9 BE9F
-7DFA BEA0
-7DFB BF40
-7DFC BF41
-7DFD BF42
-7DFE BF43
-7DFF BF44
-7E00 BF45
-7E01 BF46
-7E02 BF47
-7E03 BF48
-7E04 BF49
-7E05 BF4A
-7E06 BF4B
-7E07 BF4C
-7E08 BF4D
-7E09 BF4E
-7E0A BF4F
-7E0B BF50
-7E0C BF51
-7E0D BF52
-7E0E BF53
-7E0F BF54
-7E10 BF55
-7E11 BF56
-7E12 BF57
-7E13 BF58
-7E14 BF59
-7E15 BF5A
-7E16 BF5B
-7E17 BF5C
-7E18 BF5D
-7E19 BF5E
-7E1A BF5F
-7E1B BF60
-7E1C BF61
-7E1D BF62
-7E1E BF63
-7E1F BF64
-7E20 BF65
-7E21 BF66
-7E22 BF67
-7E23 BF68
-7E24 BF69
-7E25 BF6A
-7E26 BF6B
-7E27 BF6C
-7E28 BF6D
-7E29 BF6E
-7E2A BF6F
-7E2B BF70
-7E2C BF71
-7E2D BF72
-7E2E BF73
-7E2F BF74
-7E30 BF75
-7E31 BF76
-7E32 BF77
-7E33 BF78
-7E34 BF79
-7E35 BF7A
-7E36 BF7B
-7E37 BF7C
-7E38 BF7D
-7E39 BF7E
-7E3A BF80
-7E3B F7E3
-7E3C BF81
-7E3D BF82
-7E3E BF83
-7E3F BF84
-7E40 BF85
-7E41 B7B1
-7E42 BF86
-7E43 BF87
-7E44 BF88
-7E45 BF89
-7E46 BF8A
-7E47 F4ED
-7E48 BF8B
-7E49 BF8C
-7E4A BF8D
-7E4B BF8E
-7E4C BF8F
-7E4D BF90
-7E4E BF91
-7E4F BF92
-7E50 BF93
-7E51 BF94
-7E52 BF95
-7E53 BF96
-7E54 BF97
-7E55 BF98
-7E56 BF99
-7E57 BF9A
-7E58 BF9B
-7E59 BF9C
-7E5A BF9D
-7E5B BF9E
-7E5C BF9F
-7E5D BFA0
-7E5E C040
-7E5F C041
-7E60 C042
-7E61 C043
-7E62 C044
-7E63 C045
-7E64 C046
-7E65 C047
-7E66 C048
-7E67 C049
-7E68 C04A
-7E69 C04B
-7E6A C04C
-7E6B C04D
-7E6C C04E
-7E6D C04F
-7E6E C050
-7E6F C051
-7E70 C052
-7E71 C053
-7E72 C054
-7E73 C055
-7E74 C056
-7E75 C057
-7E76 C058
-7E77 C059
-7E78 C05A
-7E79 C05B
-7E7A C05C
-7E7B C05D
-7E7C C05E
-7E7D C05F
-7E7E C060
-7E7F C061
-7E80 C062
-7E81 C063
-7E82 D7EB
-7E83 C064
-7E84 C065
-7E85 C066
-7E86 C067
-7E87 C068
-7E88 C069
-7E89 C06A
-7E8A C06B
-7E8B C06C
-7E8C C06D
-7E8D C06E
-7E8E C06F
-7E8F C070
-7E90 C071
-7E91 C072
-7E92 C073
-7E93 C074
-7E94 C075
-7E95 C076
-7E96 C077
-7E97 C078
-7E98 C079
-7E99 C07A
-7E9A C07B
-7E9B F4EE
-7E9C C07C
-7E9D C07D
-7E9E C07E
-7E9F E6F9
-7EA0 BEC0
-7EA1 E6FA
-7EA2 BAEC
-7EA3 E6FB
-7EA4 CFCB
-7EA5 E6FC
-7EA6 D4BC
-7EA7 BCB6
-7EA8 E6FD
-7EA9 E6FE
-7EAA BCCD
-7EAB C8D2
-7EAC CEB3
-7EAD E7A1
-7EAE C080
-7EAF B4BF
-7EB0 E7A2
-7EB1 C9B4
-7EB2 B8D9
-7EB3 C4C9
-7EB4 C081
-7EB5 D7DD
-7EB6 C2DA
-7EB7 B7D7
-7EB8 D6BD
-7EB9 CEC6
-7EBA B7C4
-7EBB C082
-7EBC C083
-7EBD C5A6
-7EBE E7A3
-7EBF CFDF
-7EC0 E7A4
-7EC1 E7A5
-7EC2 E7A6
-7EC3 C1B7
-7EC4 D7E9
-7EC5 C9F0
-7EC6 CFB8
-7EC7 D6AF
-7EC8 D6D5
-7EC9 E7A7
-7ECA B0ED
-7ECB E7A8
-7ECC E7A9
-7ECD C9DC
-7ECE D2EF
-7ECF BEAD
-7ED0 E7AA
-7ED1 B0F3
-7ED2 C8DE
-7ED3 BDE1
-7ED4 E7AB
-7ED5 C8C6
-7ED6 C084
-7ED7 E7AC
-7ED8 BBE6
-7ED9 B8F8
-7EDA D1A4
-7EDB E7AD
-7EDC C2E7
-7EDD BEF8
-7EDE BDCA
-7EDF CDB3
-7EE0 E7AE
-7EE1 E7AF
-7EE2 BEEE
-7EE3 D0E5
-7EE4 C085
-7EE5 CBE7
-7EE6 CCD0
-7EE7 BCCC
-7EE8 E7B0
-7EE9 BCA8
-7EEA D0F7
-7EEB E7B1
-7EEC C086
-7EED D0F8
-7EEE E7B2
-7EEF E7B3
-7EF0 B4C2
-7EF1 E7B4
-7EF2 E7B5
-7EF3 C9FE
-7EF4 CEAC
-7EF5 C3E0
-7EF6 E7B7
-7EF7 B1C1
-7EF8 B3F1
-7EF9 C087
-7EFA E7B8
-7EFB E7B9
-7EFC D7DB
-7EFD D5C0
-7EFE E7BA
-7EFF C2CC
-7F00 D7BA
-7F01 E7BB
-7F02 E7BC
-7F03 E7BD
-7F04 BCEA
-7F05 C3E5
-7F06 C0C2
-7F07 E7BE
-7F08 E7BF
-7F09 BCA9
-7F0A C088
-7F0B E7C0
-7F0C E7C1
-7F0D E7B6
-7F0E B6D0
-7F0F E7C2
-7F10 C089
-7F11 E7C3
-7F12 E7C4
-7F13 BBBA
-7F14 B5DE
-7F15 C2C6
-7F16 B1E0
-7F17 E7C5
-7F18 D4B5
-7F19 E7C6
-7F1A B8BF
-7F1B E7C8
-7F1C E7C7
-7F1D B7EC
-7F1E C08A
-7F1F E7C9
-7F20 B2F8
-7F21 E7CA
-7F22 E7CB
-7F23 E7CC
-7F24 E7CD
-7F25 E7CE
-7F26 E7CF
-7F27 E7D0
-7F28 D3A7
-7F29 CBF5
-7F2A E7D1
-7F2B E7D2
-7F2C E7D3
-7F2D E7D4
-7F2E C9C9
-7F2F E7D5
-7F30 E7D6
-7F31 E7D7
-7F32 E7D8
-7F33 E7D9
-7F34 BDC9
-7F35 E7DA
-7F36 F3BE
-7F37 C08B
-7F38 B8D7
-7F39 C08C
-7F3A C8B1
-7F3B C08D
-7F3C C08E
-7F3D C08F
-7F3E C090
-7F3F C091
-7F40 C092
-7F41 C093
-7F42 F3BF
-7F43 C094
-7F44 F3C0
-7F45 F3C1
-7F46 C095
-7F47 C096
-7F48 C097
-7F49 C098
-7F4A C099
-7F4B C09A
-7F4C C09B
-7F4D C09C
-7F4E C09D
-7F4F C09E
-7F50 B9DE
-7F51 CDF8
-7F52 C09F
-7F53 C0A0
-7F54 D8E8
-7F55 BAB1
-7F56 C140
-7F57 C2DE
-7F58 EEB7
-7F59 C141
-7F5A B7A3
-7F5B C142
-7F5C C143
-7F5D C144
-7F5E C145
-7F5F EEB9
-7F60 C146
-7F61 EEB8
-7F62 B0D5
-7F63 C147
-7F64 C148
-7F65 C149
-7F66 C14A
-7F67 C14B
-7F68 EEBB
-7F69 D5D6
-7F6A D7EF
-7F6B C14C
-7F6C C14D
-7F6D C14E
-7F6E D6C3
-7F6F C14F
-7F70 C150
-7F71 EEBD
-7F72 CAF0
-7F73 C151
-7F74 EEBC
-7F75 C152
-7F76 C153
-7F77 C154
-7F78 C155
-7F79 EEBE
-7F7A C156
-7F7B C157
-7F7C C158
-7F7D C159
-7F7E EEC0
-7F7F C15A
-7F80 C15B
-7F81 EEBF
-7F82 C15C
-7F83 C15D
-7F84 C15E
-7F85 C15F
-7F86 C160
-7F87 C161
-7F88 C162
-7F89 C163
-7F8A D1F2
-7F8B C164
-7F8C C7BC
-7F8D C165
-7F8E C3C0
-7F8F C166
-7F90 C167
-7F91 C168
-7F92 C169
-7F93 C16A
-7F94 B8E1
-7F95 C16B
-7F96 C16C
-7F97 C16D
-7F98 C16E
-7F99 C16F
-7F9A C1E7
-7F9B C170
-7F9C C171
-7F9D F4C6
-7F9E D0DF
-7F9F F4C7
-7FA0 C172
-7FA1 CFDB
-7FA2 C173
-7FA3 C174
-7FA4 C8BA
-7FA5 C175
-7FA6 C176
-7FA7 F4C8
-7FA8 C177
-7FA9 C178
-7FAA C179
-7FAB C17A
-7FAC C17B
-7FAD C17C
-7FAE C17D
-7FAF F4C9
-7FB0 F4CA
-7FB1 C17E
-7FB2 F4CB
-7FB3 C180
-7FB4 C181
-7FB5 C182
-7FB6 C183
-7FB7 C184
-7FB8 D9FA
-7FB9 B8FE
-7FBA C185
-7FBB C186
-7FBC E5F1
-7FBD D3F0
-7FBE C187
-7FBF F4E0
-7FC0 C188
-7FC1 CECC
-7FC2 C189
-7FC3 C18A
-7FC4 C18B
-7FC5 B3E1
-7FC6 C18C
-7FC7 C18D
-7FC8 C18E
-7FC9 C18F
-7FCA F1B4
-7FCB C190
-7FCC D2EE
-7FCD C191
-7FCE F4E1
-7FCF C192
-7FD0 C193
-7FD1 C194
-7FD2 C195
-7FD3 C196
-7FD4 CFE8
-7FD5 F4E2
-7FD6 C197
-7FD7 C198
-7FD8 C7CC
-7FD9 C199
-7FDA C19A
-7FDB C19B
-7FDC C19C
-7FDD C19D
-7FDE C19E
-7FDF B5D4
-7FE0 B4E4
-7FE1 F4E4
-7FE2 C19F
-7FE3 C1A0
-7FE4 C240
-7FE5 F4E3
-7FE6 F4E5
-7FE7 C241
-7FE8 C242
-7FE9 F4E6
-7FEA C243
-7FEB C244
-7FEC C245
-7FED C246
-7FEE F4E7
-7FEF C247
-7FF0 BAB2
-7FF1 B0BF
-7FF2 C248
-7FF3 F4E8
-7FF4 C249
-7FF5 C24A
-7FF6 C24B
-7FF7 C24C
-7FF8 C24D
-7FF9 C24E
-7FFA C24F
-7FFB B7AD
-7FFC D2ED
-7FFD C250
-7FFE C251
-7FFF C252
-8000 D2AB
-8001 C0CF
-8002 C253
-8003 BFBC
-8004 EBA3
-8005 D5DF
-8006 EAC8
-8007 C254
-8008 C255
-8009 C256
-800A C257
-800B F1F3
-800C B6F8
-800D CBA3
-800E C258
-800F C259
-8010 C4CD
-8011 C25A
-8012 F1E7
-8013 C25B
-8014 F1E8
-8015 B8FB
-8016 F1E9
-8017 BAC4
-8018 D4C5
-8019 B0D2
-801A C25C
-801B C25D
-801C F1EA
-801D C25E
-801E C25F
-801F C260
-8020 F1EB
-8021 C261
-8022 F1EC
-8023 C262
-8024 C263
-8025 F1ED
-8026 F1EE
-8027 F1EF
-8028 F1F1
-8029 F1F0
-802A C5D5
-802B C264
-802C C265
-802D C266
-802E C267
-802F C268
-8030 C269
-8031 F1F2
-8032 C26A
-8033 B6FA
-8034 C26B
-8035 F1F4
-8036 D2AE
-8037 DEC7
-8038 CBCA
-8039 C26C
-803A C26D
-803B B3DC
-803C C26E
-803D B5A2
-803E C26F
-803F B9A2
-8040 C270
-8041 C271
-8042 C4F4
-8043 F1F5
-8044 C272
-8045 C273
-8046 F1F6
-8047 C274
-8048 C275
-8049 C276
-804A C1C4
-804B C1FB
-804C D6B0
-804D F1F7
-804E C277
-804F C278
-8050 C279
-8051 C27A
-8052 F1F8
-8053 C27B
-8054 C1AA
-8055 C27C
-8056 C27D
-8057 C27E
-8058 C6B8
-8059 C280
-805A BEDB
-805B C281
-805C C282
-805D C283
-805E C284
-805F C285
-8060 C286
-8061 C287
-8062 C288
-8063 C289
-8064 C28A
-8065 C28B
-8066 C28C
-8067 C28D
-8068 C28E
-8069 F1F9
-806A B4CF
-806B C28F
-806C C290
-806D C291
-806E C292
-806F C293
-8070 C294
-8071 F1FA
-8072 C295
-8073 C296
-8074 C297
-8075 C298
-8076 C299
-8077 C29A
-8078 C29B
-8079 C29C
-807A C29D
-807B C29E
-807C C29F
-807D C2A0
-807E C340
-807F EDB2
-8080 EDB1
-8081 C341
-8082 C342
-8083 CBE0
-8084 D2DE
-8085 C343
-8086 CBC1
-8087 D5D8
-8088 C344
-8089 C8E2
-808A C345
-808B C0DF
-808C BCA1
-808D C346
-808E C347
-808F C348
-8090 C349
-8091 C34A
-8092 C34B
-8093 EBC1
-8094 C34C
-8095 C34D
-8096 D0A4
-8097 C34E
-8098 D6E2
-8099 C34F
-809A B6C7
-809B B8D8
-809C EBC0
-809D B8CE
-809E C350
-809F EBBF
-80A0 B3A6
-80A1 B9C9
-80A2 D6AB
-80A3 C351
-80A4 B7F4
-80A5 B7CA
-80A6 C352
-80A7 C353
-80A8 C354
-80A9 BCE7
-80AA B7BE
-80AB EBC6
-80AC C355
-80AD EBC7
-80AE B0B9
-80AF BFCF
-80B0 C356
-80B1 EBC5
-80B2 D3FD
-80B3 C357
-80B4 EBC8
-80B5 C358
-80B6 C359
-80B7 EBC9
-80B8 C35A
-80B9 C35B
-80BA B7CE
-80BB C35C
-80BC EBC2
-80BD EBC4
-80BE C9F6
-80BF D6D7
-80C0 D5CD
-80C1 D0B2
-80C2 EBCF
-80C3 CEB8
-80C4 EBD0
-80C5 C35D
-80C6 B5A8
-80C7 C35E
-80C8 C35F
-80C9 C360
-80CA C361
-80CB C362
-80CC B1B3
-80CD EBD2
-80CE CCA5
-80CF C363
-80D0 C364
-80D1 C365
-80D2 C366
-80D3 C367
-80D4 C368
-80D5 C369
-80D6 C5D6
-80D7 EBD3
-80D8 C36A
-80D9 EBD1
-80DA C5DF
-80DB EBCE
-80DC CAA4
-80DD EBD5
-80DE B0FB
-80DF C36B
-80E0 C36C
-80E1 BAFA
-80E2 C36D
-80E3 C36E
-80E4 D8B7
-80E5 F1E3
-80E6 C36F
-80E7 EBCA
-80E8 EBCB
-80E9 EBCC
-80EA EBCD
-80EB EBD6
-80EC E6C0
-80ED EBD9
-80EE C370
-80EF BFE8
-80F0 D2C8
-80F1 EBD7
-80F2 EBDC
-80F3 B8EC
-80F4 EBD8
-80F5 C371
-80F6 BDBA
-80F7 C372
-80F8 D0D8
-80F9 C373
-80FA B0B7
-80FB C374
-80FC EBDD
-80FD C4DC
-80FE C375
-80FF C376
-8100 C377
-8101 C378
-8102 D6AC
-8103 C379
-8104 C37A
-8105 C37B
-8106 B4E0
-8107 C37C
-8108 C37D
-8109 C2F6
-810A BCB9
-810B C37E
-810C C380
-810D EBDA
-810E EBDB
-810F D4E0
-8110 C6EA
-8111 C4D4
-8112 EBDF
-8113 C5A7
-8114 D9F5
-8115 C381
-8116 B2B1
-8117 C382
-8118 EBE4
-8119 C383
-811A BDC5
-811B C384
-811C C385
-811D C386
-811E EBE2
-811F C387
-8120 C388
-8121 C389
-8122 C38A
-8123 C38B
-8124 C38C
-8125 C38D
-8126 C38E
-8127 C38F
-8128 C390
-8129 C391
-812A C392
-812B C393
-812C EBE3
-812D C394
-812E C395
-812F B8AC
-8130 C396
-8131 CDD1
-8132 EBE5
-8133 C397
-8134 C398
-8135 C399
-8136 EBE1
-8137 C39A
-8138 C1B3
-8139 C39B
-813A C39C
-813B C39D
-813C C39E
-813D C39F
-813E C6A2
-813F C3A0
-8140 C440
-8141 C441
-8142 C442
-8143 C443
-8144 C444
-8145 C445
-8146 CCF3
-8147 C446
-8148 EBE6
-8149 C447
-814A C0B0
-814B D2B8
-814C EBE7
-814D C448
-814E C449
-814F C44A
-8150 B8AF
-8151 B8AD
-8152 C44B
-8153 EBE8
-8154 C7BB
-8155 CDF3
-8156 C44C
-8157 C44D
-8158 C44E
-8159 EBEA
-815A EBEB
-815B C44F
-815C C450
-815D C451
-815E C452
-815F C453
-8160 EBED
-8161 C454
-8162 C455
-8163 C456
-8164 C457
-8165 D0C8
-8166 C458
-8167 EBF2
-8168 C459
-8169 EBEE
-816A C45A
-816B C45B
-816C C45C
-816D EBF1
-816E C8F9
-816F C45D
-8170 D1FC
-8171 EBEC
-8172 C45E
-8173 C45F
-8174 EBE9
-8175 C460
-8176 C461
-8177 C462
-8178 C463
-8179 B8B9
-817A CFD9
-817B C4E5
-817C EBEF
-817D EBF0
-817E CCDA
-817F CDC8
-8180 B0F2
-8181 C464
-8182 EBF6
-8183 C465
-8184 C466
-8185 C467
-8186 C468
-8187 C469
-8188 EBF5
-8189 C46A
-818A B2B2
-818B C46B
-818C C46C
-818D C46D
-818E C46E
-818F B8E0
-8190 C46F
-8191 EBF7
-8192 C470
-8193 C471
-8194 C472
-8195 C473
-8196 C474
-8197 C475
-8198 B1EC
-8199 C476
-819A C477
-819B CCC5
-819C C4A4
-819D CFA5
-819E C478
-819F C479
-81A0 C47A
-81A1 C47B
-81A2 C47C
-81A3 EBF9
-81A4 C47D
-81A5 C47E
-81A6 ECA2
-81A7 C480
-81A8 C5F2
-81A9 C481
-81AA EBFA
-81AB C482
-81AC C483
-81AD C484
-81AE C485
-81AF C486
-81B0 C487
-81B1 C488
-81B2 C489
-81B3 C9C5
-81B4 C48A
-81B5 C48B
-81B6 C48C
-81B7 C48D
-81B8 C48E
-81B9 C48F
-81BA E2DF
-81BB EBFE
-81BC C490
-81BD C491
-81BE C492
-81BF C493
-81C0 CDCE
-81C1 ECA1
-81C2 B1DB
-81C3 D3B7
-81C4 C494
-81C5 C495
-81C6 D2DC
-81C7 C496
-81C8 C497
-81C9 C498
-81CA EBFD
-81CB C499
-81CC EBFB
-81CD C49A
-81CE C49B
-81CF C49C
-81D0 C49D
-81D1 C49E
-81D2 C49F
-81D3 C4A0
-81D4 C540
-81D5 C541
-81D6 C542
-81D7 C543
-81D8 C544
-81D9 C545
-81DA C546
-81DB C547
-81DC C548
-81DD C549
-81DE C54A
-81DF C54B
-81E0 C54C
-81E1 C54D
-81E2 C54E
-81E3 B3BC
-81E4 C54F
-81E5 C550
-81E6 C551
-81E7 EAB0
-81E8 C552
-81E9 C553
-81EA D7D4
-81EB C554
-81EC F4AB
-81ED B3F4
-81EE C555
-81EF C556
-81F0 C557
-81F1 C558
-81F2 C559
-81F3 D6C1
-81F4 D6C2
-81F5 C55A
-81F6 C55B
-81F7 C55C
-81F8 C55D
-81F9 C55E
-81FA C55F
-81FB D5E9
-81FC BECA
-81FD C560
-81FE F4A7
-81FF C561
-8200 D2A8
-8201 F4A8
-8202 F4A9
-8203 C562
-8204 F4AA
-8205 BECB
-8206 D3DF
-8207 C563
-8208 C564
-8209 C565
-820A C566
-820B C567
-820C C9E0
-820D C9E1
-820E C568
-820F C569
-8210 F3C2
-8211 C56A
-8212 CAE6
-8213 C56B
-8214 CCF2
-8215 C56C
-8216 C56D
-8217 C56E
-8218 C56F
-8219 C570
-821A C571
-821B E2B6
-821C CBB4
-821D C572
-821E CEE8
-821F D6DB
-8220 C573
-8221 F4AD
-8222 F4AE
-8223 F4AF
-8224 C574
-8225 C575
-8226 C576
-8227 C577
-8228 F4B2
-8229 C578
-822A BABD
-822B F4B3
-822C B0E3
-822D F4B0
-822E C579
-822F F4B1
-8230 BDA2
-8231 B2D5
-8232 C57A
-8233 F4B6
-8234 F4B7
-8235 B6E6
-8236 B2B0
-8237 CFCF
-8238 F4B4
-8239 B4AC
-823A C57B
-823B F4B5
-823C C57C
-823D C57D
-823E F4B8
-823F C57E
-8240 C580
-8241 C581
-8242 C582
-8243 C583
-8244 F4B9
-8245 C584
-8246 C585
-8247 CDA7
-8248 C586
-8249 F4BA
-824A C587
-824B F4BB
-824C C588
-824D C589
-824E C58A
-824F F4BC
-8250 C58B
-8251 C58C
-8252 C58D
-8253 C58E
-8254 C58F
-8255 C590
-8256 C591
-8257 C592
-8258 CBD2
-8259 C593
-825A F4BD
-825B C594
-825C C595
-825D C596
-825E C597
-825F F4BE
-8260 C598
-8261 C599
-8262 C59A
-8263 C59B
-8264 C59C
-8265 C59D
-8266 C59E
-8267 C59F
-8268 F4BF
-8269 C5A0
-826A C640
-826B C641
-826C C642
-826D C643
-826E F4DE
-826F C1BC
-8270 BCE8
-8271 C644
-8272 C9AB
-8273 D1DE
-8274 E5F5
-8275 C645
-8276 C646
-8277 C647
-8278 C648
-8279 DCB3
-827A D2D5
-827B C649
-827C C64A
-827D DCB4
-827E B0AC
-827F DCB5
-8280 C64B
-8281 C64C
-8282 BDDA
-8283 C64D
-8284 DCB9
-8285 C64E
-8286 C64F
-8287 C650
-8288 D8C2
-8289 C651
-828A DCB7
-828B D3F3
-828C C652
-828D C9D6
-828E DCBA
-828F DCB6
-8290 C653
-8291 DCBB
-8292 C3A2
-8293 C654
-8294 C655
-8295 C656
-8296 C657
-8297 DCBC
-8298 DCC5
-8299 DCBD
-829A C658
-829B C659
-829C CEDF
-829D D6A5
-829E C65A
-829F DCCF
-82A0 C65B
-82A1 DCCD
-82A2 C65C
-82A3 C65D
-82A4 DCD2
-82A5 BDE6
-82A6 C2AB
-82A7 C65E
-82A8 DCB8
-82A9 DCCB
-82AA DCCE
-82AB DCBE
-82AC B7D2
-82AD B0C5
-82AE DCC7
-82AF D0BE
-82B0 DCC1
-82B1 BBA8
-82B2 C65F
-82B3 B7BC
-82B4 DCCC
-82B5 C660
-82B6 C661
-82B7 DCC6
-82B8 DCBF
-82B9 C7DB
-82BA C662
-82BB C663
-82BC C664
-82BD D1BF
-82BE DCC0
-82BF C665
-82C0 C666
-82C1 DCCA
-82C2 C667
-82C3 C668
-82C4 DCD0
-82C5 C669
-82C6 C66A
-82C7 CEAD
-82C8 DCC2
-82C9 C66B
-82CA DCC3
-82CB DCC8
-82CC DCC9
-82CD B2D4
-82CE DCD1
-82CF CBD5
-82D0 C66C
-82D1 D4B7
-82D2 DCDB
-82D3 DCDF
-82D4 CCA6
-82D5 DCE6
-82D6 C66D
-82D7 C3E7
-82D8 DCDC
-82D9 C66E
-82DA C66F
-82DB BFC1
-82DC DCD9
-82DD C670
-82DE B0FA
-82DF B9B6
-82E0 DCE5
-82E1 DCD3
-82E2 C671
-82E3 DCC4
-82E4 DCD6
-82E5 C8F4
-82E6 BFE0
-82E7 C672
-82E8 C673
-82E9 C674
-82EA C675
-82EB C9BB
-82EC C676
-82ED C677
-82EE C678
-82EF B1BD
-82F0 C679
-82F1 D3A2
-82F2 C67A
-82F3 C67B
-82F4 DCDA
-82F5 C67C
-82F6 C67D
-82F7 DCD5
-82F8 C67E
-82F9 C6BB
-82FA C680
-82FB DCDE
-82FC C681
-82FD C682
-82FE C683
-82FF C684
-8300 C685
-8301 D7C2
-8302 C3AF
-8303 B7B6
-8304 C7D1
-8305 C3A9
-8306 DCE2
-8307 DCD8
-8308 DCEB
-8309 DCD4
-830A C686
-830B C687
-830C DCDD
-830D C688
-830E BEA5
-830F DCD7
-8310 C689
-8311 DCE0
-8312 C68A
-8313 C68B
-8314 DCE3
-8315 DCE4
-8316 C68C
-8317 DCF8
-8318 C68D
-8319 C68E
-831A DCE1
-831B DDA2
-831C DCE7
-831D C68F
-831E C690
-831F C691
-8320 C692
-8321 C693
-8322 C694
-8323 C695
-8324 C696
-8325 C697
-8326 C698
-8327 BCEB
-8328 B4C4
-8329 C699
-832A C69A
-832B C3A3
-832C B2E7
-832D DCFA
-832E C69B
-832F DCF2
-8330 C69C
-8331 DCEF
-8332 C69D
-8333 DCFC
-8334 DCEE
-8335 D2F0
-8336 B2E8
-8337 C69E
-8338 C8D7
-8339 C8E3
-833A DCFB
-833B C69F
-833C DCED
-833D C6A0
-833E C740
-833F C741
-8340 DCF7
-8341 C742
-8342 C743
-8343 DCF5
-8344 C744
-8345 C745
-8346 BEA3
-8347 DCF4
-8348 C746
-8349 B2DD
-834A C747
-834B C748
-834C C749
-834D C74A
-834E C74B
-834F DCF3
-8350 BCF6
-8351 DCE8
-8352 BBC4
-8353 C74C
-8354 C0F3
-8355 C74D
-8356 C74E
-8357 C74F
-8358 C750
-8359 C751
-835A BCD4
-835B DCE9
-835C DCEA
-835D C752
-835E DCF1
-835F DCF6
-8360 DCF9
-8361 B5B4
-8362 C753
-8363 C8D9
-8364 BBE7
-8365 DCFE
-8366 DCFD
-8367 D3AB
-8368 DDA1
-8369 DDA3
-836A DDA5
-836B D2F1
-836C DDA4
-836D DDA6
-836E DDA7
-836F D2A9
-8370 C754
-8371 C755
-8372 C756
-8373 C757
-8374 C758
-8375 C759
-8376 C75A
-8377 BAC9
-8378 DDA9
-8379 C75B
-837A C75C
-837B DDB6
-837C DDB1
-837D DDB4
-837E C75D
-837F C75E
-8380 C75F
-8381 C760
-8382 C761
-8383 C762
-8384 C763
-8385 DDB0
-8386 C6CE
-8387 C764
-8388 C765
-8389 C0F2
-838A C766
-838B C767
-838C C768
-838D C769
-838E C9AF
-838F C76A
-8390 C76B
-8391 C76C
-8392 DCEC
-8393 DDAE
-8394 C76D
-8395 C76E
-8396 C76F
-8397 C770
-8398 DDB7
-8399 C771
-839A C772
-839B DCF0
-839C DDAF
-839D C773
-839E DDB8
-839F C774
-83A0 DDAC
-83A1 C775
-83A2 C776
-83A3 C777
-83A4 C778
-83A5 C779
-83A6 C77A
-83A7 C77B
-83A8 DDB9
-83A9 DDB3
-83AA DDAD
-83AB C4AA
-83AC C77C
-83AD C77D
-83AE C77E
-83AF C780
-83B0 DDA8
-83B1 C0B3
-83B2 C1AB
-83B3 DDAA
-83B4 DDAB
-83B5 C781
-83B6 DDB2
-83B7 BBF1
-83B8 DDB5
-83B9 D3A8
-83BA DDBA
-83BB C782
-83BC DDBB
-83BD C3A7
-83BE C783
-83BF C784
-83C0 DDD2
-83C1 DDBC
-83C2 C785
-83C3 C786
-83C4 C787
-83C5 DDD1
-83C6 C788
-83C7 B9BD
-83C8 C789
-83C9 C78A
-83CA BED5
-83CB C78B
-83CC BEFA
-83CD C78C
-83CE C78D
-83CF BACA
-83D0 C78E
-83D1 C78F
-83D2 C790
-83D3 C791
-83D4 DDCA
-83D5 C792
-83D6 DDC5
-83D7 C793
-83D8 DDBF
-83D9 C794
-83DA C795
-83DB C796
-83DC B2CB
-83DD DDC3
-83DE C797
-83DF DDCB
-83E0 B2A4
-83E1 DDD5
-83E2 C798
-83E3 C799
-83E4 C79A
-83E5 DDBE
-83E6 C79B
-83E7 C79C
-83E8 C79D
-83E9 C6D0
-83EA DDD0
-83EB C79E
-83EC C79F
-83ED C7A0
-83EE C840
-83EF C841
-83F0 DDD4
-83F1 C1E2
-83F2 B7C6
-83F3 C842
-83F4 C843
-83F5 C844
-83F6 C845
-83F7 C846
-83F8 DDCE
-83F9 DDCF
-83FA C847
-83FB C848
-83FC C849
-83FD DDC4
-83FE C84A
-83FF C84B
-8400 C84C
-8401 DDBD
-8402 C84D
-8403 DDCD
-8404 CCD1
-8405 C84E
-8406 DDC9
-8407 C84F
-8408 C850
-8409 C851
-840A C852
-840B DDC2
-840C C3C8
-840D C6BC
-840E CEAE
-840F DDCC
-8410 C853
-8411 DDC8
-8412 C854
-8413 C855
-8414 C856
-8415 C857
-8416 C858
-8417 C859
-8418 DDC1
-8419 C85A
-841A C85B
-841B C85C
-841C DDC6
-841D C2DC
-841E C85D
-841F C85E
-8420 C85F
-8421 C860
-8422 C861
-8423 C862
-8424 D3A9
-8425 D3AA
-8426 DDD3
-8427 CFF4
-8428 C8F8
-8429 C863
-842A C864
-842B C865
-842C C866
-842D C867
-842E C868
-842F C869
-8430 C86A
-8431 DDE6
-8432 C86B
-8433 C86C
-8434 C86D
-8435 C86E
-8436 C86F
-8437 C870
-8438 DDC7
-8439 C871
-843A C872
-843B C873
-843C DDE0
-843D C2E4
-843E C874
-843F C875
-8440 C876
-8441 C877
-8442 C878
-8443 C879
-8444 C87A
-8445 C87B
-8446 DDE1
-8447 C87C
-8448 C87D
-8449 C87E
-844A C880
-844B C881
-844C C882
-844D C883
-844E C884
-844F C885
-8450 C886
-8451 DDD7
-8452 C887
-8453 C888
-8454 C889
-8455 C88A
-8456 C88B
-8457 D6F8
-8458 C88C
-8459 DDD9
-845A DDD8
-845B B8F0
-845C DDD6
-845D C88D
-845E C88E
-845F C88F
-8460 C890
-8461 C6CF
-8462 C891
-8463 B6AD
-8464 C892
-8465 C893
-8466 C894
-8467 C895
-8468 C896
-8469 DDE2
-846A C897
-846B BAF9
-846C D4E1
-846D DDE7
-846E C898
-846F C899
-8470 C89A
-8471 B4D0
-8472 C89B
-8473 DDDA
-8474 C89C
-8475 BFFB
-8476 DDE3
-8477 C89D
-8478 DDDF
-8479 C89E
-847A DDDD
-847B C89F
-847C C8A0
-847D C940
-847E C941
-847F C942
-8480 C943
-8481 C944
-8482 B5D9
-8483 C945
-8484 C946
-8485 C947
-8486 C948
-8487 DDDB
-8488 DDDC
-8489 DDDE
-848A C949
-848B BDAF
-848C DDE4
-848D C94A
-848E DDE5
-848F C94B
-8490 C94C
-8491 C94D
-8492 C94E
-8493 C94F
-8494 C950
-8495 C951
-8496 C952
-8497 DDF5
-8498 C953
-8499 C3C9
-849A C954
-849B C955
-849C CBE2
-849D C956
-849E C957
-849F C958
-84A0 C959
-84A1 DDF2
-84A2 C95A
-84A3 C95B
-84A4 C95C
-84A5 C95D
-84A6 C95E
-84A7 C95F
-84A8 C960
-84A9 C961
-84AA C962
-84AB C963
-84AC C964
-84AD C965
-84AE C966
-84AF D8E1
-84B0 C967
-84B1 C968
-84B2 C6D1
-84B3 C969
-84B4 DDF4
-84B5 C96A
-84B6 C96B
-84B7 C96C
-84B8 D5F4
-84B9 DDF3
-84BA DDF0
-84BB C96D
-84BC C96E
-84BD DDEC
-84BE C96F
-84BF DDEF
-84C0 C970
-84C1 DDE8
-84C2 C971
-84C3 C972
-84C4 D0EE
-84C5 C973
-84C6 C974
-84C7 C975
-84C8 C976
-84C9 C8D8
-84CA DDEE
-84CB C977
-84CC C978
-84CD DDE9
-84CE C979
-84CF C97A
-84D0 DDEA
-84D1 CBF2
-84D2 C97B
-84D3 DDED
-84D4 C97C
-84D5 C97D
-84D6 B1CD
-84D7 C97E
-84D8 C980
-84D9 C981
-84DA C982
-84DB C983
-84DC C984
-84DD C0B6
-84DE C985
-84DF BCBB
-84E0 DDF1
-84E1 C986
-84E2 C987
-84E3 DDF7
-84E4 C988
-84E5 DDF6
-84E6 DDEB
-84E7 C989
-84E8 C98A
-84E9 C98B
-84EA C98C
-84EB C98D
-84EC C5EE
-84ED C98E
-84EE C98F
-84EF C990
-84F0 DDFB
-84F1 C991
-84F2 C992
-84F3 C993
-84F4 C994
-84F5 C995
-84F6 C996
-84F7 C997
-84F8 C998
-84F9 C999
-84FA C99A
-84FB C99B
-84FC DEA4
-84FD C99C
-84FE C99D
-84FF DEA3
-8500 C99E
-8501 C99F
-8502 C9A0
-8503 CA40
-8504 CA41
-8505 CA42
-8506 CA43
-8507 CA44
-8508 CA45
-8509 CA46
-850A CA47
-850B CA48
-850C DDF8
-850D CA49
-850E CA4A
-850F CA4B
-8510 CA4C
-8511 C3EF
-8512 CA4D
-8513 C2FB
-8514 CA4E
-8515 CA4F
-8516 CA50
-8517 D5E1
-8518 CA51
-8519 CA52
-851A CEB5
-851B CA53
-851C CA54
-851D CA55
-851E CA56
-851F DDFD
-8520 CA57
-8521 B2CC
-8522 CA58
-8523 CA59
-8524 CA5A
-8525 CA5B
-8526 CA5C
-8527 CA5D
-8528 CA5E
-8529 CA5F
-852A CA60
-852B C4E8
-852C CADF
-852D CA61
-852E CA62
-852F CA63
-8530 CA64
-8531 CA65
-8532 CA66
-8533 CA67
-8534 CA68
-8535 CA69
-8536 CA6A
-8537 C7BE
-8538 DDFA
-8539 DDFC
-853A DDFE
-853B DEA2
-853C B0AA
-853D B1CE
-853E CA6B
-853F CA6C
-8540 CA6D
-8541 CA6E
-8542 CA6F
-8543 DEAC
-8544 CA70
-8545 CA71
-8546 CA72
-8547 CA73
-8548 DEA6
-8549 BDB6
-854A C8EF
-854B CA74
-854C CA75
-854D CA76
-854E CA77
-854F CA78
-8550 CA79
-8551 CA7A
-8552 CA7B
-8553 CA7C
-8554 CA7D
-8555 CA7E
-8556 DEA1
-8557 CA80
-8558 CA81
-8559 DEA5
-855A CA82
-855B CA83
-855C CA84
-855D CA85
-855E DEA9
-855F CA86
-8560 CA87
-8561 CA88
-8562 CA89
-8563 CA8A
-8564 DEA8
-8565 CA8B
-8566 CA8C
-8567 CA8D
-8568 DEA7
-8569 CA8E
-856A CA8F
-856B CA90
-856C CA91
-856D CA92
-856E CA93
-856F CA94
-8570 CA95
-8571 CA96
-8572 DEAD
-8573 CA97
-8574 D4CC
-8575 CA98
-8576 CA99
-8577 CA9A
-8578 CA9B
-8579 DEB3
-857A DEAA
-857B DEAE
-857C CA9C
-857D CA9D
-857E C0D9
-857F CA9E
-8580 CA9F
-8581 CAA0
-8582 CB40
-8583 CB41
-8584 B1A1
-8585 DEB6
-8586 CB42
-8587 DEB1
-8588 CB43
-8589 CB44
-858A CB45
-858B CB46
-858C CB47
-858D CB48
-858E CB49
-858F DEB2
-8590 CB4A
-8591 CB4B
-8592 CB4C
-8593 CB4D
-8594 CB4E
-8595 CB4F
-8596 CB50
-8597 CB51
-8598 CB52
-8599 CB53
-859A CB54
-859B D1A6
-859C DEB5
-859D CB55
-859E CB56
-859F CB57
-85A0 CB58
-85A1 CB59
-85A2 CB5A
-85A3 CB5B
-85A4 DEAF
-85A5 CB5C
-85A6 CB5D
-85A7 CB5E
-85A8 DEB0
-85A9 CB5F
-85AA D0BD
-85AB CB60
-85AC CB61
-85AD CB62
-85AE DEB4
-85AF CAED
-85B0 DEB9
-85B1 CB63
-85B2 CB64
-85B3 CB65
-85B4 CB66
-85B5 CB67
-85B6 CB68
-85B7 DEB8
-85B8 CB69
-85B9 DEB7
-85BA CB6A
-85BB CB6B
-85BC CB6C
-85BD CB6D
-85BE CB6E
-85BF CB6F
-85C0 CB70
-85C1 DEBB
-85C2 CB71
-85C3 CB72
-85C4 CB73
-85C5 CB74
-85C6 CB75
-85C7 CB76
-85C8 CB77
-85C9 BDE5
-85CA CB78
-85CB CB79
-85CC CB7A
-85CD CB7B
-85CE CB7C
-85CF B2D8
-85D0 C3EA
-85D1 CB7D
-85D2 CB7E
-85D3 DEBA
-85D4 CB80
-85D5 C5BA
-85D6 CB81
-85D7 CB82
-85D8 CB83
-85D9 CB84
-85DA CB85
-85DB CB86
-85DC DEBC
-85DD CB87
-85DE CB88
-85DF CB89
-85E0 CB8A
-85E1 CB8B
-85E2 CB8C
-85E3 CB8D
-85E4 CCD9
-85E5 CB8E
-85E6 CB8F
-85E7 CB90
-85E8 CB91
-85E9 B7AA
-85EA CB92
-85EB CB93
-85EC CB94
-85ED CB95
-85EE CB96
-85EF CB97
-85F0 CB98
-85F1 CB99
-85F2 CB9A
-85F3 CB9B
-85F4 CB9C
-85F5 CB9D
-85F6 CB9E
-85F7 CB9F
-85F8 CBA0
-85F9 CC40
-85FA CC41
-85FB D4E5
-85FC CC42
-85FD CC43
-85FE CC44
-85FF DEBD
-8600 CC45
-8601 CC46
-8602 CC47
-8603 CC48
-8604 CC49
-8605 DEBF
-8606 CC4A
-8607 CC4B
-8608 CC4C
-8609 CC4D
-860A CC4E
-860B CC4F
-860C CC50
-860D CC51
-860E CC52
-860F CC53
-8610 CC54
-8611 C4A2
-8612 CC55
-8613 CC56
-8614 CC57
-8615 CC58
-8616 DEC1
-8617 CC59
-8618 CC5A
-8619 CC5B
-861A CC5C
-861B CC5D
-861C CC5E
-861D CC5F
-861E CC60
-861F CC61
-8620 CC62
-8621 CC63
-8622 CC64
-8623 CC65
-8624 CC66
-8625 CC67
-8626 CC68
-8627 DEBE
-8628 CC69
-8629 DEC0
-862A CC6A
-862B CC6B
-862C CC6C
-862D CC6D
-862E CC6E
-862F CC6F
-8630 CC70
-8631 CC71
-8632 CC72
-8633 CC73
-8634 CC74
-8635 CC75
-8636 CC76
-8637 CC77
-8638 D5BA
-8639 CC78
-863A CC79
-863B CC7A
-863C DEC2
-863D CC7B
-863E CC7C
-863F CC7D
-8640 CC7E
-8641 CC80
-8642 CC81
-8643 CC82
-8644 CC83
-8645 CC84
-8646 CC85
-8647 CC86
-8648 CC87
-8649 CC88
-864A CC89
-864B CC8A
-864C CC8B
-864D F2AE
-864E BBA2
-864F C2B2
-8650 C5B0
-8651 C2C7
-8652 CC8C
-8653 CC8D
-8654 F2AF
-8655 CC8E
-8656 CC8F
-8657 CC90
-8658 CC91
-8659 CC92
-865A D0E9
-865B CC93
-865C CC94
-865D CC95
-865E D3DD
-865F CC96
-8660 CC97
-8661 CC98
-8662 EBBD
-8663 CC99
-8664 CC9A
-8665 CC9B
-8666 CC9C
-8667 CC9D
-8668 CC9E
-8669 CC9F
-866A CCA0
-866B B3E6
-866C F2B0
-866D CD40
-866E F2B1
-866F CD41
-8670 CD42
-8671 CAAD
-8672 CD43
-8673 CD44
-8674 CD45
-8675 CD46
-8676 CD47
-8677 CD48
-8678 CD49
-8679 BAE7
-867A F2B3
-867B F2B5
-867C F2B4
-867D CBE4
-867E CFBA
-867F F2B2
-8680 CAB4
-8681 D2CF
-8682 C2EC
-8683 CD4A
-8684 CD4B
-8685 CD4C
-8686 CD4D
-8687 CD4E
-8688 CD4F
-8689 CD50
-868A CEC3
-868B F2B8
-868C B0F6
-868D F2B7
-868E CD51
-868F CD52
-8690 CD53
-8691 CD54
-8692 CD55
-8693 F2BE
-8694 CD56
-8695 B2CF
-8696 CD57
-8697 CD58
-8698 CD59
-8699 CD5A
-869A CD5B
-869B CD5C
-869C D1C1
-869D F2BA
-869E CD5D
-869F CD5E
-86A0 CD5F
-86A1 CD60
-86A2 CD61
-86A3 F2BC
-86A4 D4E9
-86A5 CD62
-86A6 CD63
-86A7 F2BB
-86A8 F2B6
-86A9 F2BF
-86AA F2BD
-86AB CD64
-86AC F2B9
-86AD CD65
-86AE CD66
-86AF F2C7
-86B0 F2C4
-86B1 F2C6
-86B2 CD67
-86B3 CD68
-86B4 F2CA
-86B5 F2C2
-86B6 F2C0
-86B7 CD69
-86B8 CD6A
-86B9 CD6B
-86BA F2C5
-86BB CD6C
-86BC CD6D
-86BD CD6E
-86BE CD6F
-86BF CD70
-86C0 D6FB
-86C1 CD71
-86C2 CD72
-86C3 CD73
-86C4 F2C1
-86C5 CD74
-86C6 C7F9
-86C7 C9DF
-86C8 CD75
-86C9 F2C8
-86CA B9C6
-86CB B5B0
-86CC CD76
-86CD CD77
-86CE F2C3
-86CF F2C9
-86D0 F2D0
-86D1 F2D6
-86D2 CD78
-86D3 CD79
-86D4 BBD7
-86D5 CD7A
-86D6 CD7B
-86D7 CD7C
-86D8 F2D5
-86D9 CDDC
-86DA CD7D
-86DB D6EB
-86DC CD7E
-86DD CD80
-86DE F2D2
-86DF F2D4
-86E0 CD81
-86E1 CD82
-86E2 CD83
-86E3 CD84
-86E4 B8F2
-86E5 CD85
-86E6 CD86
-86E7 CD87
-86E8 CD88
-86E9 F2CB
-86EA CD89
-86EB CD8A
-86EC CD8B
-86ED F2CE
-86EE C2F9
-86EF CD8C
-86F0 D5DD
-86F1 F2CC
-86F2 F2CD
-86F3 F2CF
-86F4 F2D3
-86F5 CD8D
-86F6 CD8E
-86F7 CD8F
-86F8 F2D9
-86F9 D3BC
-86FA CD90
-86FB CD91
-86FC CD92
-86FD CD93
-86FE B6EA
-86FF CD94
-8700 CAF1
-8701 CD95
-8702 B7E4
-8703 F2D7
-8704 CD96
-8705 CD97
-8706 CD98
-8707 F2D8
-8708 F2DA
-8709 F2DD
-870A F2DB
-870B CD99
-870C CD9A
-870D F2DC
-870E CD9B
-870F CD9C
-8710 CD9D
-8711 CD9E
-8712 D1D1
-8713 F2D1
-8714 CD9F
-8715 CDC9
-8716 CDA0
-8717 CECF
-8718 D6A9
-8719 CE40
-871A F2E3
-871B CE41
-871C C3DB
-871D CE42
-871E F2E0
-871F CE43
-8720 CE44
-8721 C0AF
-8722 F2EC
-8723 F2DE
-8724 CE45
-8725 F2E1
-8726 CE46
-8727 CE47
-8728 CE48
-8729 F2E8
-872A CE49
-872B CE4A
-872C CE4B
-872D CE4C
-872E F2E2
-872F CE4D
-8730 CE4E
-8731 F2E7
-8732 CE4F
-8733 CE50
-8734 F2E6
-8735 CE51
-8736 CE52
-8737 F2E9
-8738 CE53
-8739 CE54
-873A CE55
-873B F2DF
-873C CE56
-873D CE57
-873E F2E4
-873F F2EA
-8740 CE58
-8741 CE59
-8742 CE5A
-8743 CE5B
-8744 CE5C
-8745 CE5D
-8746 CE5E
-8747 D3AC
-8748 F2E5
-8749 B2F5
-874A CE5F
-874B CE60
-874C F2F2
-874D CE61
-874E D0AB
-874F CE62
-8750 CE63
-8751 CE64
-8752 CE65
-8753 F2F5
-8754 CE66
-8755 CE67
-8756 CE68
-8757 BBC8
-8758 CE69
-8759 F2F9
-875A CE6A
-875B CE6B
-875C CE6C
-875D CE6D
-875E CE6E
-875F CE6F
-8760 F2F0
-8761 CE70
-8762 CE71
-8763 F2F6
-8764 F2F8
-8765 F2FA
-8766 CE72
-8767 CE73
-8768 CE74
-8769 CE75
-876A CE76
-876B CE77
-876C CE78
-876D CE79
-876E F2F3
-876F CE7A
-8770 F2F1
-8771 CE7B
-8772 CE7C
-8773 CE7D
-8774 BAFB
-8775 CE7E
-8776 B5FB
-8777 CE80
-8778 CE81
-8779 CE82
-877A CE83
-877B F2EF
-877C F2F7
-877D F2ED
-877E F2EE
-877F CE84
-8780 CE85
-8781 CE86
-8782 F2EB
-8783 F3A6
-8784 CE87
-8785 F3A3
-8786 CE88
-8787 CE89
-8788 F3A2
-8789 CE8A
-878A CE8B
-878B F2F4
-878C CE8C
-878D C8DA
-878E CE8D
-878F CE8E
-8790 CE8F
-8791 CE90
-8792 CE91
-8793 F2FB
-8794 CE92
-8795 CE93
-8796 CE94
-8797 F3A5
-8798 CE95
-8799 CE96
-879A CE97
-879B CE98
-879C CE99
-879D CE9A
-879E CE9B
-879F C3F8
-87A0 CE9C
-87A1 CE9D
-87A2 CE9E
-87A3 CE9F
-87A4 CEA0
-87A5 CF40
-87A6 CF41
-87A7 CF42
-87A8 F2FD
-87A9 CF43
-87AA CF44
-87AB F3A7
-87AC F3A9
-87AD F3A4
-87AE CF45
-87AF F2FC
-87B0 CF46
-87B1 CF47
-87B2 CF48
-87B3 F3AB
-87B4 CF49
-87B5 F3AA
-87B6 CF4A
-87B7 CF4B
-87B8 CF4C
-87B9 CF4D
-87BA C2DD
-87BB CF4E
-87BC CF4F
-87BD F3AE
-87BE CF50
-87BF CF51
-87C0 F3B0
-87C1 CF52
-87C2 CF53
-87C3 CF54
-87C4 CF55
-87C5 CF56
-87C6 F3A1
-87C7 CF57
-87C8 CF58
-87C9 CF59
-87CA F3B1
-87CB F3AC
-87CC CF5A
-87CD CF5B
-87CE CF5C
-87CF CF5D
-87D0 CF5E
-87D1 F3AF
-87D2 F2FE
-87D3 F3AD
-87D4 CF5F
-87D5 CF60
-87D6 CF61
-87D7 CF62
-87D8 CF63
-87D9 CF64
-87DA CF65
-87DB F3B2
-87DC CF66
-87DD CF67
-87DE CF68
-87DF CF69
-87E0 F3B4
-87E1 CF6A
-87E2 CF6B
-87E3 CF6C
-87E4 CF6D
-87E5 F3A8
-87E6 CF6E
-87E7 CF6F
-87E8 CF70
-87E9 CF71
-87EA F3B3
-87EB CF72
-87EC CF73
-87ED CF74
-87EE F3B5
-87EF CF75
-87F0 CF76
-87F1 CF77
-87F2 CF78
-87F3 CF79
-87F4 CF7A
-87F5 CF7B
-87F6 CF7C
-87F7 CF7D
-87F8 CF7E
-87F9 D0B7
-87FA CF80
-87FB CF81
-87FC CF82
-87FD CF83
-87FE F3B8
-87FF CF84
-8800 CF85
-8801 CF86
-8802 CF87
-8803 D9F9
-8804 CF88
-8805 CF89
-8806 CF8A
-8807 CF8B
-8808 CF8C
-8809 CF8D
-880A F3B9
-880B CF8E
-880C CF8F
-880D CF90
-880E CF91
-880F CF92
-8810 CF93
-8811 CF94
-8812 CF95
-8813 F3B7
-8814 CF96
-8815 C8E4
-8816 F3B6
-8817 CF97
-8818 CF98
-8819 CF99
-881A CF9A
-881B F3BA
-881C CF9B
-881D CF9C
-881E CF9D
-881F CF9E
-8820 CF9F
-8821 F3BB
-8822 B4C0
-8823 CFA0
-8824 D040
-8825 D041
-8826 D042
-8827 D043
-8828 D044
-8829 D045
-882A D046
-882B D047
-882C D048
-882D D049
-882E D04A
-882F D04B
-8830 D04C
-8831 D04D
-8832 EEC3
-8833 D04E
-8834 D04F
-8835 D050
-8836 D051
-8837 D052
-8838 D053
-8839 F3BC
-883A D054
-883B D055
-883C F3BD
-883D D056
-883E D057
-883F D058
-8840 D1AA
-8841 D059
-8842 D05A
-8843 D05B
-8844 F4AC
-8845 D0C6
-8846 D05C
-8847 D05D
-8848 D05E
-8849 D05F
-884A D060
-884B D061
-884C D0D0
-884D D1DC
-884E D062
-884F D063
-8850 D064
-8851 D065
-8852 D066
-8853 D067
-8854 CFCE
-8855 D068
-8856 D069
-8857 BDD6
-8858 D06A
-8859 D1C3
-885A D06B
-885B D06C
-885C D06D
-885D D06E
-885E D06F
-885F D070
-8860 D071
-8861 BAE2
-8862 E1E9
-8863 D2C2
-8864 F1C2
-8865 B2B9
-8866 D072
-8867 D073
-8868 B1ED
-8869 F1C3
-886A D074
-886B C9C0
-886C B3C4
-886D D075
-886E D9F2
-886F D076
-8870 CBA5
-8871 D077
-8872 F1C4
-8873 D078
-8874 D079
-8875 D07A
-8876 D07B
-8877 D6D4
-8878 D07C
-8879 D07D
-887A D07E
-887B D080
-887C D081
-887D F1C5
-887E F4C0
-887F F1C6
-8880 D082
-8881 D4AC
-8882 F1C7
-8883 D083
-8884 B0C0
-8885 F4C1
-8886 D084
-8887 D085
-8888 F4C2
-8889 D086
-888A D087
-888B B4FC
-888C D088
-888D C5DB
-888E D089
-888F D08A
-8890 D08B
-8891 D08C
-8892 CCBB
-8893 D08D
-8894 D08E
-8895 D08F
-8896 D0E4
-8897 D090
-8898 D091
-8899 D092
-889A D093
-889B D094
-889C CDE0
-889D D095
-889E D096
-889F D097
-88A0 D098
-88A1 D099
-88A2 F1C8
-88A3 D09A
-88A4 D9F3
-88A5 D09B
-88A6 D09C
-88A7 D09D
-88A8 D09E
-88A9 D09F
-88AA D0A0
-88AB B1BB
-88AC D140
-88AD CFAE
-88AE D141
-88AF D142
-88B0 D143
-88B1 B8A4
-88B2 D144
-88B3 D145
-88B4 D146
-88B5 D147
-88B6 D148
-88B7 F1CA
-88B8 D149
-88B9 D14A
-88BA D14B
-88BB D14C
-88BC F1CB
-88BD D14D
-88BE D14E
-88BF D14F
-88C0 D150
-88C1 B2C3
-88C2 C1D1
-88C3 D151
-88C4 D152
-88C5 D7B0
-88C6 F1C9
-88C7 D153
-88C8 D154
-88C9 F1CC
-88CA D155
-88CB D156
-88CC D157
-88CD D158
-88CE F1CE
-88CF D159
-88D0 D15A
-88D1 D15B
-88D2 D9F6
-88D3 D15C
-88D4 D2E1
-88D5 D4A3
-88D6 D15D
-88D7 D15E
-88D8 F4C3
-88D9 C8B9
-88DA D15F
-88DB D160
-88DC D161
-88DD D162
-88DE D163
-88DF F4C4
-88E0 D164
-88E1 D165
-88E2 F1CD
-88E3 F1CF
-88E4 BFE3
-88E5 F1D0
-88E6 D166
-88E7 D167
-88E8 F1D4
-88E9 D168
-88EA D169
-88EB D16A
-88EC D16B
-88ED D16C
-88EE D16D
-88EF D16E
-88F0 F1D6
-88F1 F1D1
-88F2 D16F
-88F3 C9D1
-88F4 C5E1
-88F5 D170
-88F6 D171
-88F7 D172
-88F8 C2E3
-88F9 B9FC
-88FA D173
-88FB D174
-88FC F1D3
-88FD D175
-88FE F1D5
-88FF D176
-8900 D177
-8901 D178
-8902 B9D3
-8903 D179
-8904 D17A
-8905 D17B
-8906 D17C
-8907 D17D
-8908 D17E
-8909 D180
-890A F1DB
-890B D181
-890C D182
-890D D183
-890E D184
-890F D185
-8910 BAD6
-8911 D186
-8912 B0FD
-8913 F1D9
-8914 D187
-8915 D188
-8916 D189
-8917 D18A
-8918 D18B
-8919 F1D8
-891A F1D2
-891B F1DA
-891C D18C
-891D D18D
-891E D18E
-891F D18F
-8920 D190
-8921 F1D7
-8922 D191
-8923 D192
-8924 D193
-8925 C8EC
-8926 D194
-8927 D195
-8928 D196
-8929 D197
-892A CDCA
-892B F1DD
-892C D198
-892D D199
-892E D19A
-892F D19B
-8930 E5BD
-8931 D19C
-8932 D19D
-8933 D19E
-8934 F1DC
-8935 D19F
-8936 F1DE
-8937 D1A0
-8938 D240
-8939 D241
-893A D242
-893B D243
-893C D244
-893D D245
-893E D246
-893F D247
-8940 D248
-8941 F1DF
-8942 D249
-8943 D24A
-8944 CFE5
-8945 D24B
-8946 D24C
-8947 D24D
-8948 D24E
-8949 D24F
-894A D250
-894B D251
-894C D252
-894D D253
-894E D254
-894F D255
-8950 D256
-8951 D257
-8952 D258
-8953 D259
-8954 D25A
-8955 D25B
-8956 D25C
-8957 D25D
-8958 D25E
-8959 D25F
-895A D260
-895B D261
-895C D262
-895D D263
-895E F4C5
-895F BDF3
-8960 D264
-8961 D265
-8962 D266
-8963 D267
-8964 D268
-8965 D269
-8966 F1E0
-8967 D26A
-8968 D26B
-8969 D26C
-896A D26D
-896B D26E
-896C D26F
-896D D270
-896E D271
-896F D272
-8970 D273
-8971 D274
-8972 D275
-8973 D276
-8974 D277
-8975 D278
-8976 D279
-8977 D27A
-8978 D27B
-8979 D27C
-897A D27D
-897B F1E1
-897C D27E
-897D D280
-897E D281
-897F CEF7
-8980 D282
-8981 D2AA
-8982 D283
-8983 F1FB
-8984 D284
-8985 D285
-8986 B8B2
-8987 D286
-8988 D287
-8989 D288
-898A D289
-898B D28A
-898C D28B
-898D D28C
-898E D28D
-898F D28E
-8990 D28F
-8991 D290
-8992 D291
-8993 D292
-8994 D293
-8995 D294
-8996 D295
-8997 D296
-8998 D297
-8999 D298
-899A D299
-899B D29A
-899C D29B
-899D D29C
-899E D29D
-899F D29E
-89A0 D29F
-89A1 D2A0
-89A2 D340
-89A3 D341
-89A4 D342
-89A5 D343
-89A6 D344
-89A7 D345
-89A8 D346
-89A9 D347
-89AA D348
-89AB D349
-89AC D34A
-89AD D34B
-89AE D34C
-89AF D34D
-89B0 D34E
-89B1 D34F
-89B2 D350
-89B3 D351
-89B4 D352
-89B5 D353
-89B6 D354
-89B7 D355
-89B8 D356
-89B9 D357
-89BA D358
-89BB D359
-89BC D35A
-89BD D35B
-89BE D35C
-89BF D35D
-89C0 D35E
-89C1 BCFB
-89C2 B9DB
-89C3 D35F
-89C4 B9E6
-89C5 C3D9
-89C6 CAD3
-89C7 EAE8
-89C8 C0C0
-89C9 BEF5
-89CA EAE9
-89CB EAEA
-89CC EAEB
-89CD D360
-89CE EAEC
-89CF EAED
-89D0 EAEE
-89D1 EAEF
-89D2 BDC7
-89D3 D361
-89D4 D362
-89D5 D363
-89D6 F5FB
-89D7 D364
-89D8 D365
-89D9 D366
-89DA F5FD
-89DB D367
-89DC F5FE
-89DD D368
-89DE F5FC
-89DF D369
-89E0 D36A
-89E1 D36B
-89E2 D36C
-89E3 BDE2
-89E4 D36D
-89E5 F6A1
-89E6 B4A5
-89E7 D36E
-89E8 D36F
-89E9 D370
-89EA D371
-89EB F6A2
-89EC D372
-89ED D373
-89EE D374
-89EF F6A3
-89F0 D375
-89F1 D376
-89F2 D377
-89F3 ECB2
-89F4 D378
-89F5 D379
-89F6 D37A
-89F7 D37B
-89F8 D37C
-89F9 D37D
-89FA D37E
-89FB D380
-89FC D381
-89FD D382
-89FE D383
-89FF D384
-8A00 D1D4
-8A01 D385
-8A02 D386
-8A03 D387
-8A04 D388
-8A05 D389
-8A06 D38A
-8A07 D9EA
-8A08 D38B
-8A09 D38C
-8A0A D38D
-8A0B D38E
-8A0C D38F
-8A0D D390
-8A0E D391
-8A0F D392
-8A10 D393
-8A11 D394
-8A12 D395
-8A13 D396
-8A14 D397
-8A15 D398
-8A16 D399
-8A17 D39A
-8A18 D39B
-8A19 D39C
-8A1A D39D
-8A1B D39E
-8A1C D39F
-8A1D D3A0
-8A1E D440
-8A1F D441
-8A20 D442
-8A21 D443
-8A22 D444
-8A23 D445
-8A24 D446
-8A25 D447
-8A26 D448
-8A27 D449
-8A28 D44A
-8A29 D44B
-8A2A D44C
-8A2B D44D
-8A2C D44E
-8A2D D44F
-8A2E D450
-8A2F D451
-8A30 D452
-8A31 D453
-8A32 D454
-8A33 D455
-8A34 D456
-8A35 D457
-8A36 D458
-8A37 D459
-8A38 D45A
-8A39 D45B
-8A3A D45C
-8A3B D45D
-8A3C D45E
-8A3D D45F
-8A3E F6A4
-8A3F D460
-8A40 D461
-8A41 D462
-8A42 D463
-8A43 D464
-8A44 D465
-8A45 D466
-8A46 D467
-8A47 D468
-8A48 EEBA
-8A49 D469
-8A4A D46A
-8A4B D46B
-8A4C D46C
-8A4D D46D
-8A4E D46E
-8A4F D46F
-8A50 D470
-8A51 D471
-8A52 D472
-8A53 D473
-8A54 D474
-8A55 D475
-8A56 D476
-8A57 D477
-8A58 D478
-8A59 D479
-8A5A D47A
-8A5B D47B
-8A5C D47C
-8A5D D47D
-8A5E D47E
-8A5F D480
-8A60 D481
-8A61 D482
-8A62 D483
-8A63 D484
-8A64 D485
-8A65 D486
-8A66 D487
-8A67 D488
-8A68 D489
-8A69 D48A
-8A6A D48B
-8A6B D48C
-8A6C D48D
-8A6D D48E
-8A6E D48F
-8A6F D490
-8A70 D491
-8A71 D492
-8A72 D493
-8A73 D494
-8A74 D495
-8A75 D496
-8A76 D497
-8A77 D498
-8A78 D499
-8A79 D5B2
-8A7A D49A
-8A7B D49B
-8A7C D49C
-8A7D D49D
-8A7E D49E
-8A7F D49F
-8A80 D4A0
-8A81 D540
-8A82 D541
-8A83 D542
-8A84 D543
-8A85 D544
-8A86 D545
-8A87 D546
-8A88 D547
-8A89 D3FE
-8A8A CCDC
-8A8B D548
-8A8C D549
-8A8D D54A
-8A8E D54B
-8A8F D54C
-8A90 D54D
-8A91 D54E
-8A92 D54F
-8A93 CAC4
-8A94 D550
-8A95 D551
-8A96 D552
-8A97 D553
-8A98 D554
-8A99 D555
-8A9A D556
-8A9B D557
-8A9C D558
-8A9D D559
-8A9E D55A
-8A9F D55B
-8AA0 D55C
-8AA1 D55D
-8AA2 D55E
-8AA3 D55F
-8AA4 D560
-8AA5 D561
-8AA6 D562
-8AA7 D563
-8AA8 D564
-8AA9 D565
-8AAA D566
-8AAB D567
-8AAC D568
-8AAD D569
-8AAE D56A
-8AAF D56B
-8AB0 D56C
-8AB1 D56D
-8AB2 D56E
-8AB3 D56F
-8AB4 D570
-8AB5 D571
-8AB6 D572
-8AB7 D573
-8AB8 D574
-8AB9 D575
-8ABA D576
-8ABB D577
-8ABC D578
-8ABD D579
-8ABE D57A
-8ABF D57B
-8AC0 D57C
-8AC1 D57D
-8AC2 D57E
-8AC3 D580
-8AC4 D581
-8AC5 D582
-8AC6 D583
-8AC7 D584
-8AC8 D585
-8AC9 D586
-8ACA D587
-8ACB D588
-8ACC D589
-8ACD D58A
-8ACE D58B
-8ACF D58C
-8AD0 D58D
-8AD1 D58E
-8AD2 D58F
-8AD3 D590
-8AD4 D591
-8AD5 D592
-8AD6 D593
-8AD7 D594
-8AD8 D595
-8AD9 D596
-8ADA D597
-8ADB D598
-8ADC D599
-8ADD D59A
-8ADE D59B
-8ADF D59C
-8AE0 D59D
-8AE1 D59E
-8AE2 D59F
-8AE3 D5A0
-8AE4 D640
-8AE5 D641
-8AE6 D642
-8AE7 D643
-8AE8 D644
-8AE9 D645
-8AEA D646
-8AEB D647
-8AEC D648
-8AED D649
-8AEE D64A
-8AEF D64B
-8AF0 D64C
-8AF1 D64D
-8AF2 D64E
-8AF3 D64F
-8AF4 D650
-8AF5 D651
-8AF6 D652
-8AF7 D653
-8AF8 D654
-8AF9 D655
-8AFA D656
-8AFB D657
-8AFC D658
-8AFD D659
-8AFE D65A
-8AFF D65B
-8B00 D65C
-8B01 D65D
-8B02 D65E
-8B03 D65F
-8B04 D660
-8B05 D661
-8B06 D662
-8B07 E5C0
-8B08 D663
-8B09 D664
-8B0A D665
-8B0B D666
-8B0C D667
-8B0D D668
-8B0E D669
-8B0F D66A
-8B10 D66B
-8B11 D66C
-8B12 D66D
-8B13 D66E
-8B14 D66F
-8B15 D670
-8B16 D671
-8B17 D672
-8B18 D673
-8B19 D674
-8B1A D675
-8B1B D676
-8B1C D677
-8B1D D678
-8B1E D679
-8B1F D67A
-8B20 D67B
-8B21 D67C
-8B22 D67D
-8B23 D67E
-8B24 D680
-8B25 D681
-8B26 F6A5
-8B27 D682
-8B28 D683
-8B29 D684
-8B2A D685
-8B2B D686
-8B2C D687
-8B2D D688
-8B2E D689
-8B2F D68A
-8B30 D68B
-8B31 D68C
-8B32 D68D
-8B33 D68E
-8B34 D68F
-8B35 D690
-8B36 D691
-8B37 D692
-8B38 D693
-8B39 D694
-8B3A D695
-8B3B D696
-8B3C D697
-8B3D D698
-8B3E D699
-8B3F D69A
-8B40 D69B
-8B41 D69C
-8B42 D69D
-8B43 D69E
-8B44 D69F
-8B45 D6A0
-8B46 D740
-8B47 D741
-8B48 D742
-8B49 D743
-8B4A D744
-8B4B D745
-8B4C D746
-8B4D D747
-8B4E D748
-8B4F D749
-8B50 D74A
-8B51 D74B
-8B52 D74C
-8B53 D74D
-8B54 D74E
-8B55 D74F
-8B56 D750
-8B57 D751
-8B58 D752
-8B59 D753
-8B5A D754
-8B5B D755
-8B5C D756
-8B5D D757
-8B5E D758
-8B5F D759
-8B60 D75A
-8B61 D75B
-8B62 D75C
-8B63 D75D
-8B64 D75E
-8B65 D75F
-8B66 BEAF
-8B67 D760
-8B68 D761
-8B69 D762
-8B6A D763
-8B6B D764
-8B6C C6A9
-8B6D D765
-8B6E D766
-8B6F D767
-8B70 D768
-8B71 D769
-8B72 D76A
-8B73 D76B
-8B74 D76C
-8B75 D76D
-8B76 D76E
-8B77 D76F
-8B78 D770
-8B79 D771
-8B7A D772
-8B7B D773
-8B7C D774
-8B7D D775
-8B7E D776
-8B7F D777
-8B80 D778
-8B81 D779
-8B82 D77A
-8B83 D77B
-8B84 D77C
-8B85 D77D
-8B86 D77E
-8B87 D780
-8B88 D781
-8B89 D782
-8B8A D783
-8B8B D784
-8B8C D785
-8B8D D786
-8B8E D787
-8B8F D788
-8B90 D789
-8B91 D78A
-8B92 D78B
-8B93 D78C
-8B94 D78D
-8B95 D78E
-8B96 D78F
-8B97 D790
-8B98 D791
-8B99 D792
-8B9A D793
-8B9B D794
-8B9C D795
-8B9D D796
-8B9E D797
-8B9F D798
-8BA0 DAA5
-8BA1 BCC6
-8BA2 B6A9
-8BA3 B8BC
-8BA4 C8CF
-8BA5 BCA5
-8BA6 DAA6
-8BA7 DAA7
-8BA8 CCD6
-8BA9 C8C3
-8BAA DAA8
-8BAB C6FD
-8BAC D799
-8BAD D1B5
-8BAE D2E9
-8BAF D1B6
-8BB0 BCC7
-8BB1 D79A
-8BB2 BDB2
-8BB3 BBE4
-8BB4 DAA9
-8BB5 DAAA
-8BB6 D1C8
-8BB7 DAAB
-8BB8 D0ED
-8BB9 B6EF
-8BBA C2DB
-8BBB D79B
-8BBC CBCF
-8BBD B7ED
-8BBE C9E8
-8BBF B7C3
-8BC0 BEF7
-8BC1 D6A4
-8BC2 DAAC
-8BC3 DAAD
-8BC4 C6C0
-8BC5 D7E7
-8BC6 CAB6
-8BC7 D79C
-8BC8 D5A9
-8BC9 CBDF
-8BCA D5EF
-8BCB DAAE
-8BCC D6DF
-8BCD B4CA
-8BCE DAB0
-8BCF DAAF
-8BD0 D79D
-8BD1 D2EB
-8BD2 DAB1
-8BD3 DAB2
-8BD4 DAB3
-8BD5 CAD4
-8BD6 DAB4
-8BD7 CAAB
-8BD8 DAB5
-8BD9 DAB6
-8BDA B3CF
-8BDB D6EF
-8BDC DAB7
-8BDD BBB0
-8BDE B5AE
-8BDF DAB8
-8BE0 DAB9
-8BE1 B9EE
-8BE2 D1AF
-8BE3 D2E8
-8BE4 DABA
-8BE5 B8C3
-8BE6 CFEA
-8BE7 B2EF
-8BE8 DABB
-8BE9 DABC
-8BEA D79E
-8BEB BDEB
-8BEC CEDC
-8BED D3EF
-8BEE DABD
-8BEF CEF3
-8BF0 DABE
-8BF1 D3D5
-8BF2 BBE5
-8BF3 DABF
-8BF4 CBB5
-8BF5 CBD0
-8BF6 DAC0
-8BF7 C7EB
-8BF8 D6EE
-8BF9 DAC1
-8BFA C5B5
-8BFB B6C1
-8BFC DAC2
-8BFD B7CC
-8BFE BFCE
-8BFF DAC3
-8C00 DAC4
-8C01 CBAD
-8C02 DAC5
-8C03 B5F7
-8C04 DAC6
-8C05 C1C2
-8C06 D7BB
-8C07 DAC7
-8C08 CCB8
-8C09 D79F
-8C0A D2EA
-8C0B C4B1
-8C0C DAC8
-8C0D B5FD
-8C0E BBD1
-8C0F DAC9
-8C10 D0B3
-8C11 DACA
-8C12 DACB
-8C13 CEBD
-8C14 DACC
-8C15 DACD
-8C16 DACE
-8C17 B2F7
-8C18 DAD1
-8C19 DACF
-8C1A D1E8
-8C1B DAD0
-8C1C C3D5
-8C1D DAD2
-8C1E D7A0
-8C1F DAD3
-8C20 DAD4
-8C21 DAD5
-8C22 D0BB
-8C23 D2A5
-8C24 B0F9
-8C25 DAD6
-8C26 C7AB
-8C27 DAD7
-8C28 BDF7
-8C29 C3A1
-8C2A DAD8
-8C2B DAD9
-8C2C C3FD
-8C2D CCB7
-8C2E DADA
-8C2F DADB
-8C30 C0BE
-8C31 C6D7
-8C32 DADC
-8C33 DADD
-8C34 C7B4
-8C35 DADE
-8C36 DADF
-8C37 B9C8
-8C38 D840
-8C39 D841
-8C3A D842
-8C3B D843
-8C3C D844
-8C3D D845
-8C3E D846
-8C3F D847
-8C40 D848
-8C41 BBED
-8C42 D849
-8C43 D84A
-8C44 D84B
-8C45 D84C
-8C46 B6B9
-8C47 F4F8
-8C48 D84D
-8C49 F4F9
-8C4A D84E
-8C4B D84F
-8C4C CDE3
-8C4D D850
-8C4E D851
-8C4F D852
-8C50 D853
-8C51 D854
-8C52 D855
-8C53 D856
-8C54 D857
-8C55 F5B9
-8C56 D858
-8C57 D859
-8C58 D85A
-8C59 D85B
-8C5A EBE0
-8C5B D85C
-8C5C D85D
-8C5D D85E
-8C5E D85F
-8C5F D860
-8C60 D861
-8C61 CFF3
-8C62 BBBF
-8C63 D862
-8C64 D863
-8C65 D864
-8C66 D865
-8C67 D866
-8C68 D867
-8C69 D868
-8C6A BAC0
-8C6B D4A5
-8C6C D869
-8C6D D86A
-8C6E D86B
-8C6F D86C
-8C70 D86D
-8C71 D86E
-8C72 D86F
-8C73 E1D9
-8C74 D870
-8C75 D871
-8C76 D872
-8C77 D873
-8C78 F5F4
-8C79 B1AA
-8C7A B2F2
-8C7B D874
-8C7C D875
-8C7D D876
-8C7E D877
-8C7F D878
-8C80 D879
-8C81 D87A
-8C82 F5F5
-8C83 D87B
-8C84 D87C
-8C85 F5F7
-8C86 D87D
-8C87 D87E
-8C88 D880
-8C89 BAD1
-8C8A F5F6
-8C8B D881
-8C8C C3B2
-8C8D D882
-8C8E D883
-8C8F D884
-8C90 D885
-8C91 D886
-8C92 D887
-8C93 D888
-8C94 F5F9
-8C95 D889
-8C96 D88A
-8C97 D88B
-8C98 F5F8
-8C99 D88C
-8C9A D88D
-8C9B D88E
-8C9C D88F
-8C9D D890
-8C9E D891
-8C9F D892
-8CA0 D893
-8CA1 D894
-8CA2 D895
-8CA3 D896
-8CA4 D897
-8CA5 D898
-8CA6 D899
-8CA7 D89A
-8CA8 D89B
-8CA9 D89C
-8CAA D89D
-8CAB D89E
-8CAC D89F
-8CAD D8A0
-8CAE D940
-8CAF D941
-8CB0 D942
-8CB1 D943
-8CB2 D944
-8CB3 D945
-8CB4 D946
-8CB5 D947
-8CB6 D948
-8CB7 D949
-8CB8 D94A
-8CB9 D94B
-8CBA D94C
-8CBB D94D
-8CBC D94E
-8CBD D94F
-8CBE D950
-8CBF D951
-8CC0 D952
-8CC1 D953
-8CC2 D954
-8CC3 D955
-8CC4 D956
-8CC5 D957
-8CC6 D958
-8CC7 D959
-8CC8 D95A
-8CC9 D95B
-8CCA D95C
-8CCB D95D
-8CCC D95E
-8CCD D95F
-8CCE D960
-8CCF D961
-8CD0 D962
-8CD1 D963
-8CD2 D964
-8CD3 D965
-8CD4 D966
-8CD5 D967
-8CD6 D968
-8CD7 D969
-8CD8 D96A
-8CD9 D96B
-8CDA D96C
-8CDB D96D
-8CDC D96E
-8CDD D96F
-8CDE D970
-8CDF D971
-8CE0 D972
-8CE1 D973
-8CE2 D974
-8CE3 D975
-8CE4 D976
-8CE5 D977
-8CE6 D978
-8CE7 D979
-8CE8 D97A
-8CE9 D97B
-8CEA D97C
-8CEB D97D
-8CEC D97E
-8CED D980
-8CEE D981
-8CEF D982
-8CF0 D983
-8CF1 D984
-8CF2 D985
-8CF3 D986
-8CF4 D987
-8CF5 D988
-8CF6 D989
-8CF7 D98A
-8CF8 D98B
-8CF9 D98C
-8CFA D98D
-8CFB D98E
-8CFC D98F
-8CFD D990
-8CFE D991
-8CFF D992
-8D00 D993
-8D01 D994
-8D02 D995
-8D03 D996
-8D04 D997
-8D05 D998
-8D06 D999
-8D07 D99A
-8D08 D99B
-8D09 D99C
-8D0A D99D
-8D0B D99E
-8D0C D99F
-8D0D D9A0
-8D0E DA40
-8D0F DA41
-8D10 DA42
-8D11 DA43
-8D12 DA44
-8D13 DA45
-8D14 DA46
-8D15 DA47
-8D16 DA48
-8D17 DA49
-8D18 DA4A
-8D19 DA4B
-8D1A DA4C
-8D1B DA4D
-8D1C DA4E
-8D1D B1B4
-8D1E D5EA
-8D1F B8BA
-8D20 DA4F
-8D21 B9B1
-8D22 B2C6
-8D23 D4F0
-8D24 CFCD
-8D25 B0DC
-8D26 D5CB
-8D27 BBF5
-8D28 D6CA
-8D29 B7B7
-8D2A CCB0
-8D2B C6B6
-8D2C B1E1
-8D2D B9BA
-8D2E D6FC
-8D2F B9E1
-8D30 B7A1
-8D31 BCFA
-8D32 EADA
-8D33 EADB
-8D34 CCF9
-8D35 B9F3
-8D36 EADC
-8D37 B4FB
-8D38 C3B3
-8D39 B7D1
-8D3A BAD8
-8D3B EADD
-8D3C D4F4
-8D3D EADE
-8D3E BCD6
-8D3F BBDF
-8D40 EADF
-8D41 C1DE
-8D42 C2B8
-8D43 D4DF
-8D44 D7CA
-8D45 EAE0
-8D46 EAE1
-8D47 EAE4
-8D48 EAE2
-8D49 EAE3
-8D4A C9DE
-8D4B B8B3
-8D4C B6C4
-8D4D EAE5
-8D4E CAEA
-8D4F C9CD
-8D50 B4CD
-8D51 DA50
-8D52 DA51
-8D53 E2D9
-8D54 C5E2
-8D55 EAE6
-8D56 C0B5
-8D57 DA52
-8D58 D7B8
-8D59 EAE7
-8D5A D7AC
-8D5B C8FC
-8D5C D8D3
-8D5D D8CD
-8D5E D4DE
-8D5F DA53
-8D60 D4F9
-8D61 C9C4
-8D62 D3AE
-8D63 B8D3
-8D64 B3E0
-8D65 DA54
-8D66 C9E2
-8D67 F4F6
-8D68 DA55
-8D69 DA56
-8D6A DA57
-8D6B BAD5
-8D6C DA58
-8D6D F4F7
-8D6E DA59
-8D6F DA5A
-8D70 D7DF
-8D71 DA5B
-8D72 DA5C
-8D73 F4F1
-8D74 B8B0
-8D75 D5D4
-8D76 B8CF
-8D77 C6F0
-8D78 DA5D
-8D79 DA5E
-8D7A DA5F
-8D7B DA60
-8D7C DA61
-8D7D DA62
-8D7E DA63
-8D7F DA64
-8D80 DA65
-8D81 B3C3
-8D82 DA66
-8D83 DA67
-8D84 F4F2
-8D85 B3AC
-8D86 DA68
-8D87 DA69
-8D88 DA6A
-8D89 DA6B
-8D8A D4BD
-8D8B C7F7
-8D8C DA6C
-8D8D DA6D
-8D8E DA6E
-8D8F DA6F
-8D90 DA70
-8D91 F4F4
-8D92 DA71
-8D93 DA72
-8D94 F4F3
-8D95 DA73
-8D96 DA74
-8D97 DA75
-8D98 DA76
-8D99 DA77
-8D9A DA78
-8D9B DA79
-8D9C DA7A
-8D9D DA7B
-8D9E DA7C
-8D9F CCCB
-8DA0 DA7D
-8DA1 DA7E
-8DA2 DA80
-8DA3 C8A4
-8DA4 DA81
-8DA5 DA82
-8DA6 DA83
-8DA7 DA84
-8DA8 DA85
-8DA9 DA86
-8DAA DA87
-8DAB DA88
-8DAC DA89
-8DAD DA8A
-8DAE DA8B
-8DAF DA8C
-8DB0 DA8D
-8DB1 F4F5
-8DB2 DA8E
-8DB3 D7E3
-8DB4 C5BF
-8DB5 F5C0
-8DB6 DA8F
-8DB7 DA90
-8DB8 F5BB
-8DB9 DA91
-8DBA F5C3
-8DBB DA92
-8DBC F5C2
-8DBD DA93
-8DBE D6BA
-8DBF F5C1
-8DC0 DA94
-8DC1 DA95
-8DC2 DA96
-8DC3 D4BE
-8DC4 F5C4
-8DC5 DA97
-8DC6 F5CC
-8DC7 DA98
-8DC8 DA99
-8DC9 DA9A
-8DCA DA9B
-8DCB B0CF
-8DCC B5F8
-8DCD DA9C
-8DCE F5C9
-8DCF F5CA
-8DD0 DA9D
-8DD1 C5DC
-8DD2 DA9E
-8DD3 DA9F
-8DD4 DAA0
-8DD5 DB40
-8DD6 F5C5
-8DD7 F5C6
-8DD8 DB41
-8DD9 DB42
-8DDA F5C7
-8DDB F5CB
-8DDC DB43
-8DDD BEE0
-8DDE F5C8
-8DDF B8FA
-8DE0 DB44
-8DE1 DB45
-8DE2 DB46
-8DE3 F5D0
-8DE4 F5D3
-8DE5 DB47
-8DE6 DB48
-8DE7 DB49
-8DE8 BFE7
-8DE9 DB4A
-8DEA B9F2
-8DEB F5BC
-8DEC F5CD
-8DED DB4B
-8DEE DB4C
-8DEF C2B7
-8DF0 DB4D
-8DF1 DB4E
-8DF2 DB4F
-8DF3 CCF8
-8DF4 DB50
-8DF5 BCF9
-8DF6 DB51
-8DF7 F5CE
-8DF8 F5CF
-8DF9 F5D1
-8DFA B6E5
-8DFB F5D2
-8DFC DB52
-8DFD F5D5
-8DFE DB53
-8DFF DB54
-8E00 DB55
-8E01 DB56
-8E02 DB57
-8E03 DB58
-8E04 DB59
-8E05 F5BD
-8E06 DB5A
-8E07 DB5B
-8E08 DB5C
-8E09 F5D4
-8E0A D3BB
-8E0B DB5D
-8E0C B3EC
-8E0D DB5E
-8E0E DB5F
-8E0F CCA4
-8E10 DB60
-8E11 DB61
-8E12 DB62
-8E13 DB63
-8E14 F5D6
-8E15 DB64
-8E16 DB65
-8E17 DB66
-8E18 DB67
-8E19 DB68
-8E1A DB69
-8E1B DB6A
-8E1C DB6B
-8E1D F5D7
-8E1E BEE1
-8E1F F5D8
-8E20 DB6C
-8E21 DB6D
-8E22 CCDF
-8E23 F5DB
-8E24 DB6E
-8E25 DB6F
-8E26 DB70
-8E27 DB71
-8E28 DB72
-8E29 B2C8
-8E2A D7D9
-8E2B DB73
-8E2C F5D9
-8E2D DB74
-8E2E F5DA
-8E2F F5DC
-8E30 DB75
-8E31 F5E2
-8E32 DB76
-8E33 DB77
-8E34 DB78
-8E35 F5E0
-8E36 DB79
-8E37 DB7A
-8E38 DB7B
-8E39 F5DF
-8E3A F5DD
-8E3B DB7C
-8E3C DB7D
-8E3D F5E1
-8E3E DB7E
-8E3F DB80
-8E40 F5DE
-8E41 F5E4
-8E42 F5E5
-8E43 DB81
-8E44 CCE3
-8E45 DB82
-8E46 DB83
-8E47 E5BF
-8E48 B5B8
-8E49 F5E3
-8E4A F5E8
-8E4B CCA3
-8E4C DB84
-8E4D DB85
-8E4E DB86
-8E4F DB87
-8E50 DB88
-8E51 F5E6
-8E52 F5E7
-8E53 DB89
-8E54 DB8A
-8E55 DB8B
-8E56 DB8C
-8E57 DB8D
-8E58 DB8E
-8E59 F5BE
-8E5A DB8F
-8E5B DB90
-8E5C DB91
-8E5D DB92
-8E5E DB93
-8E5F DB94
-8E60 DB95
-8E61 DB96
-8E62 DB97
-8E63 DB98
-8E64 DB99
-8E65 DB9A
-8E66 B1C4
-8E67 DB9B
-8E68 DB9C
-8E69 F5BF
-8E6A DB9D
-8E6B DB9E
-8E6C B5C5
-8E6D B2E4
-8E6E DB9F
-8E6F F5EC
-8E70 F5E9
-8E71 DBA0
-8E72 B6D7
-8E73 DC40
-8E74 F5ED
-8E75 DC41
-8E76 F5EA
-8E77 DC42
-8E78 DC43
-8E79 DC44
-8E7A DC45
-8E7B DC46
-8E7C F5EB
-8E7D DC47
-8E7E DC48
-8E7F B4DA
-8E80 DC49
-8E81 D4EA
-8E82 DC4A
-8E83 DC4B
-8E84 DC4C
-8E85 F5EE
-8E86 DC4D
-8E87 B3F9
-8E88 DC4E
-8E89 DC4F
-8E8A DC50
-8E8B DC51
-8E8C DC52
-8E8D DC53
-8E8E DC54
-8E8F F5EF
-8E90 F5F1
-8E91 DC55
-8E92 DC56
-8E93 DC57
-8E94 F5F0
-8E95 DC58
-8E96 DC59
-8E97 DC5A
-8E98 DC5B
-8E99 DC5C
-8E9A DC5D
-8E9B DC5E
-8E9C F5F2
-8E9D DC5F
-8E9E F5F3
-8E9F DC60
-8EA0 DC61
-8EA1 DC62
-8EA2 DC63
-8EA3 DC64
-8EA4 DC65
-8EA5 DC66
-8EA6 DC67
-8EA7 DC68
-8EA8 DC69
-8EA9 DC6A
-8EAA DC6B
-8EAB C9ED
-8EAC B9AA
-8EAD DC6C
-8EAE DC6D
-8EAF C7FB
-8EB0 DC6E
-8EB1 DC6F
-8EB2 B6E3
-8EB3 DC70
-8EB4 DC71
-8EB5 DC72
-8EB6 DC73
-8EB7 DC74
-8EB8 DC75
-8EB9 DC76
-8EBA CCC9
-8EBB DC77
-8EBC DC78
-8EBD DC79
-8EBE DC7A
-8EBF DC7B
-8EC0 DC7C
-8EC1 DC7D
-8EC2 DC7E
-8EC3 DC80
-8EC4 DC81
-8EC5 DC82
-8EC6 DC83
-8EC7 DC84
-8EC8 DC85
-8EC9 DC86
-8ECA DC87
-8ECB DC88
-8ECC DC89
-8ECD DC8A
-8ECE EAA6
-8ECF DC8B
-8ED0 DC8C
-8ED1 DC8D
-8ED2 DC8E
-8ED3 DC8F
-8ED4 DC90
-8ED5 DC91
-8ED6 DC92
-8ED7 DC93
-8ED8 DC94
-8ED9 DC95
-8EDA DC96
-8EDB DC97
-8EDC DC98
-8EDD DC99
-8EDE DC9A
-8EDF DC9B
-8EE0 DC9C
-8EE1 DC9D
-8EE2 DC9E
-8EE3 DC9F
-8EE4 DCA0
-8EE5 DD40
-8EE6 DD41
-8EE7 DD42
-8EE8 DD43
-8EE9 DD44
-8EEA DD45
-8EEB DD46
-8EEC DD47
-8EED DD48
-8EEE DD49
-8EEF DD4A
-8EF0 DD4B
-8EF1 DD4C
-8EF2 DD4D
-8EF3 DD4E
-8EF4 DD4F
-8EF5 DD50
-8EF6 DD51
-8EF7 DD52
-8EF8 DD53
-8EF9 DD54
-8EFA DD55
-8EFB DD56
-8EFC DD57
-8EFD DD58
-8EFE DD59
-8EFF DD5A
-8F00 DD5B
-8F01 DD5C
-8F02 DD5D
-8F03 DD5E
-8F04 DD5F
-8F05 DD60
-8F06 DD61
-8F07 DD62
-8F08 DD63
-8F09 DD64
-8F0A DD65
-8F0B DD66
-8F0C DD67
-8F0D DD68
-8F0E DD69
-8F0F DD6A
-8F10 DD6B
-8F11 DD6C
-8F12 DD6D
-8F13 DD6E
-8F14 DD6F
-8F15 DD70
-8F16 DD71
-8F17 DD72
-8F18 DD73
-8F19 DD74
-8F1A DD75
-8F1B DD76
-8F1C DD77
-8F1D DD78
-8F1E DD79
-8F1F DD7A
-8F20 DD7B
-8F21 DD7C
-8F22 DD7D
-8F23 DD7E
-8F24 DD80
-8F25 DD81
-8F26 DD82
-8F27 DD83
-8F28 DD84
-8F29 DD85
-8F2A DD86
-8F2B DD87
-8F2C DD88
-8F2D DD89
-8F2E DD8A
-8F2F DD8B
-8F30 DD8C
-8F31 DD8D
-8F32 DD8E
-8F33 DD8F
-8F34 DD90
-8F35 DD91
-8F36 DD92
-8F37 DD93
-8F38 DD94
-8F39 DD95
-8F3A DD96
-8F3B DD97
-8F3C DD98
-8F3D DD99
-8F3E DD9A
-8F3F DD9B
-8F40 DD9C
-8F41 DD9D
-8F42 DD9E
-8F43 DD9F
-8F44 DDA0
-8F45 DE40
-8F46 DE41
-8F47 DE42
-8F48 DE43
-8F49 DE44
-8F4A DE45
-8F4B DE46
-8F4C DE47
-8F4D DE48
-8F4E DE49
-8F4F DE4A
-8F50 DE4B
-8F51 DE4C
-8F52 DE4D
-8F53 DE4E
-8F54 DE4F
-8F55 DE50
-8F56 DE51
-8F57 DE52
-8F58 DE53
-8F59 DE54
-8F5A DE55
-8F5B DE56
-8F5C DE57
-8F5D DE58
-8F5E DE59
-8F5F DE5A
-8F60 DE5B
-8F61 DE5C
-8F62 DE5D
-8F63 DE5E
-8F64 DE5F
-8F65 DE60
-8F66 B3B5
-8F67 D4FE
-8F68 B9EC
-8F69 D0F9
-8F6A DE61
-8F6B E9ED
-8F6C D7AA
-8F6D E9EE
-8F6E C2D6
-8F6F C8ED
-8F70 BAE4
-8F71 E9EF
-8F72 E9F0
-8F73 E9F1
-8F74 D6E1
-8F75 E9F2
-8F76 E9F3
-8F77 E9F5
-8F78 E9F4
-8F79 E9F6
-8F7A E9F7
-8F7B C7E1
-8F7C E9F8
-8F7D D4D8
-8F7E E9F9
-8F7F BDCE
-8F80 DE62
-8F81 E9FA
-8F82 E9FB
-8F83 BDCF
-8F84 E9FC
-8F85 B8A8
-8F86 C1BE
-8F87 E9FD
-8F88 B1B2
-8F89 BBD4
-8F8A B9F5
-8F8B E9FE
-8F8C DE63
-8F8D EAA1
-8F8E EAA2
-8F8F EAA3
-8F90 B7F8
-8F91 BCAD
-8F92 DE64
-8F93 CAE4
-8F94 E0CE
-8F95 D4AF
-8F96 CFBD
-8F97 D5B7
-8F98 EAA4
-8F99 D5DE
-8F9A EAA5
-8F9B D0C1
-8F9C B9BC
-8F9D DE65
-8F9E B4C7
-8F9F B1D9
-8FA0 DE66
-8FA1 DE67
-8FA2 DE68
-8FA3 C0B1
-8FA4 DE69
-8FA5 DE6A
-8FA6 DE6B
-8FA7 DE6C
-8FA8 B1E6
-8FA9 B1E7
-8FAA DE6D
-8FAB B1E8
-8FAC DE6E
-8FAD DE6F
-8FAE DE70
-8FAF DE71
-8FB0 B3BD
-8FB1 C8E8
-8FB2 DE72
-8FB3 DE73
-8FB4 DE74
-8FB5 DE75
-8FB6 E5C1
-8FB7 DE76
-8FB8 DE77
-8FB9 B1DF
-8FBA DE78
-8FBB DE79
-8FBC DE7A
-8FBD C1C9
-8FBE B4EF
-8FBF DE7B
-8FC0 DE7C
-8FC1 C7A8
-8FC2 D3D8
-8FC3 DE7D
-8FC4 C6F9
-8FC5 D1B8
-8FC6 DE7E
-8FC7 B9FD
-8FC8 C2F5
-8FC9 DE80
-8FCA DE81
-8FCB DE82
-8FCC DE83
-8FCD DE84
-8FCE D3AD
-8FCF DE85
-8FD0 D4CB
-8FD1 BDFC
-8FD2 DE86
-8FD3 E5C2
-8FD4 B7B5
-8FD5 E5C3
-8FD6 DE87
-8FD7 DE88
-8FD8 BBB9
-8FD9 D5E2
-8FDA DE89
-8FDB BDF8
-8FDC D4B6
-8FDD CEA5
-8FDE C1AC
-8FDF B3D9
-8FE0 DE8A
-8FE1 DE8B
-8FE2 CCF6
-8FE3 DE8C
-8FE4 E5C6
-8FE5 E5C4
-8FE6 E5C8
-8FE7 DE8D
-8FE8 E5CA
-8FE9 E5C7
-8FEA B5CF
-8FEB C6C8
-8FEC DE8E
-8FED B5FC
-8FEE E5C5
-8FEF DE8F
-8FF0 CAF6
-8FF1 DE90
-8FF2 DE91
-8FF3 E5C9
-8FF4 DE92
-8FF5 DE93
-8FF6 DE94
-8FF7 C3D4
-8FF8 B1C5
-8FF9 BCA3
-8FFA DE95
-8FFB DE96
-8FFC DE97
-8FFD D7B7
-8FFE DE98
-8FFF DE99
-9000 CDCB
-9001 CBCD
-9002 CACA
-9003 CCD3
-9004 E5CC
-9005 E5CB
-9006 C4E6
-9007 DE9A
-9008 DE9B
-9009 D1A1
-900A D1B7
-900B E5CD
-900C DE9C
-900D E5D0
-900E DE9D
-900F CDB8
-9010 D6F0
-9011 E5CF
-9012 B5DD
-9013 DE9E
-9014 CDBE
-9015 DE9F
-9016 E5D1
-9017 B6BA
-9018 DEA0
-9019 DF40
-901A CDA8
-901B B9E4
-901C DF41
-901D CAC5
-901E B3D1
-901F CBD9
-9020 D4EC
-9021 E5D2
-9022 B7EA
-9023 DF42
-9024 DF43
-9025 DF44
-9026 E5CE
-9027 DF45
-9028 DF46
-9029 DF47
-902A DF48
-902B DF49
-902C DF4A
-902D E5D5
-902E B4FE
-902F E5D6
-9030 DF4B
-9031 DF4C
-9032 DF4D
-9033 DF4E
-9034 DF4F
-9035 E5D3
-9036 E5D4
-9037 DF50
-9038 D2DD
-9039 DF51
-903A DF52
-903B C2DF
-903C B1C6
-903D DF53
-903E D3E2
-903F DF54
-9040 DF55
-9041 B6DD
-9042 CBEC
-9043 DF56
-9044 E5D7
-9045 DF57
-9046 DF58
-9047 D3F6
-9048 DF59
-9049 DF5A
-904A DF5B
-904B DF5C
-904C DF5D
-904D B1E9
-904E DF5E
-904F B6F4
-9050 E5DA
-9051 E5D8
-9052 E5D9
-9053 B5C0
-9054 DF5F
-9055 DF60
-9056 DF61
-9057 D2C5
-9058 E5DC
-9059 DF62
-905A DF63
-905B E5DE
-905C DF64
-905D DF65
-905E DF66
-905F DF67
-9060 DF68
-9061 DF69
-9062 E5DD
-9063 C7B2
-9064 DF6A
-9065 D2A3
-9066 DF6B
-9067 DF6C
-9068 E5DB
-9069 DF6D
-906A DF6E
-906B DF6F
-906C DF70
-906D D4E2
-906E D5DA
-906F DF71
-9070 DF72
-9071 DF73
-9072 DF74
-9073 DF75
-9074 E5E0
-9075 D7F1
-9076 DF76
-9077 DF77
-9078 DF78
-9079 DF79
-907A DF7A
-907B DF7B
-907C DF7C
-907D E5E1
-907E DF7D
-907F B1DC
-9080 D1FB
-9081 DF7E
-9082 E5E2
-9083 E5E4
-9084 DF80
-9085 DF81
-9086 DF82
-9087 DF83
-9088 E5E3
-9089 DF84
-908A DF85
-908B E5E5
-908C DF86
-908D DF87
-908E DF88
-908F DF89
-9090 DF8A
-9091 D2D8
-9092 DF8B
-9093 B5CB
-9094 DF8C
-9095 E7DF
-9096 DF8D
-9097 DAF5
-9098 DF8E
-9099 DAF8
-909A DF8F
-909B DAF6
-909C DF90
-909D DAF7
-909E DF91
-909F DF92
-90A0 DF93
-90A1 DAFA
-90A2 D0CF
-90A3 C4C7
-90A4 DF94
-90A5 DF95
-90A6 B0EE
-90A7 DF96
-90A8 DF97
-90A9 DF98
-90AA D0B0
-90AB DF99
-90AC DAF9
-90AD DF9A
-90AE D3CA
-90AF BAAA
-90B0 DBA2
-90B1 C7F1
-90B2 DF9B
-90B3 DAFC
-90B4 DAFB
-90B5 C9DB
-90B6 DAFD
-90B7 DF9C
-90B8 DBA1
-90B9 D7DE
-90BA DAFE
-90BB C1DA
-90BC DF9D
-90BD DF9E
-90BE DBA5
-90BF DF9F
-90C0 DFA0
-90C1 D3F4
-90C2 E040
-90C3 E041
-90C4 DBA7
-90C5 DBA4
-90C6 E042
-90C7 DBA8
-90C8 E043
-90C9 E044
-90CA BDBC
-90CB E045
-90CC E046
-90CD E047
-90CE C0C9
-90CF DBA3
-90D0 DBA6
-90D1 D6A3
-90D2 E048
-90D3 DBA9
-90D4 E049
-90D5 E04A
-90D6 E04B
-90D7 DBAD
-90D8 E04C
-90D9 E04D
-90DA E04E
-90DB DBAE
-90DC DBAC
-90DD BAC2
-90DE E04F
-90DF E050
-90E0 E051
-90E1 BFA4
-90E2 DBAB
-90E3 E052
-90E4 E053
-90E5 E054
-90E6 DBAA
-90E7 D4C7
-90E8 B2BF
-90E9 E055
-90EA E056
-90EB DBAF
-90EC E057
-90ED B9F9
-90EE E058
-90EF DBB0
-90F0 E059
-90F1 E05A
-90F2 E05B
-90F3 E05C
-90F4 B3BB
-90F5 E05D
-90F6 E05E
-90F7 E05F
-90F8 B5A6
-90F9 E060
-90FA E061
-90FB E062
-90FC E063
-90FD B6BC
-90FE DBB1
-90FF E064
-9100 E065
-9101 E066
-9102 B6F5
-9103 E067
-9104 DBB2
-9105 E068
-9106 E069
-9107 E06A
-9108 E06B
-9109 E06C
-910A E06D
-910B E06E
-910C E06F
-910D E070
-910E E071
-910F E072
-9110 E073
-9111 E074
-9112 E075
-9113 E076
-9114 E077
-9115 E078
-9116 E079
-9117 E07A
-9118 E07B
-9119 B1C9
-911A E07C
-911B E07D
-911C E07E
-911D E080
-911E DBB4
-911F E081
-9120 E082
-9121 E083
-9122 DBB3
-9123 DBB5
-9124 E084
-9125 E085
-9126 E086
-9127 E087
-9128 E088
-9129 E089
-912A E08A
-912B E08B
-912C E08C
-912D E08D
-912E E08E
-912F DBB7
-9130 E08F
-9131 DBB6
-9132 E090
-9133 E091
-9134 E092
-9135 E093
-9136 E094
-9137 E095
-9138 E096
-9139 DBB8
-913A E097
-913B E098
-913C E099
-913D E09A
-913E E09B
-913F E09C
-9140 E09D
-9141 E09E
-9142 E09F
-9143 DBB9
-9144 E0A0
-9145 E140
-9146 DBBA
-9147 E141
-9148 E142
-9149 D3CF
-914A F4FA
-914B C7F5
-914C D7C3
-914D C5E4
-914E F4FC
-914F F4FD
-9150 F4FB
-9151 E143
-9152 BEC6
-9153 E144
-9154 E145
-9155 E146
-9156 E147
-9157 D0EF
-9158 E148
-9159 E149
-915A B7D3
-915B E14A
-915C E14B
-915D D4CD
-915E CCAA
-915F E14C
-9160 E14D
-9161 F5A2
-9162 F5A1
-9163 BAA8
-9164 F4FE
-9165 CBD6
-9166 E14E
-9167 E14F
-9168 E150
-9169 F5A4
-916A C0D2
-916B E151
-916C B3EA
-916D E152
-916E CDAA
-916F F5A5
-9170 F5A3
-9171 BDB4
-9172 F5A8
-9173 E153
-9174 F5A9
-9175 BDCD
-9176 C3B8
-9177 BFE1
-9178 CBE1
-9179 F5AA
-917A E154
-917B E155
-917C E156
-917D F5A6
-917E F5A7
-917F C4F0
-9180 E157
-9181 E158
-9182 E159
-9183 E15A
-9184 E15B
-9185 F5AC
-9186 E15C
-9187 B4BC
-9188 E15D
-9189 D7ED
-918A E15E
-918B B4D7
-918C F5AB
-918D F5AE
-918E E15F
-918F E160
-9190 F5AD
-9191 F5AF
-9192 D0D1
-9193 E161
-9194 E162
-9195 E163
-9196 E164
-9197 E165
-9198 E166
-9199 E167
-919A C3D1
-919B C8A9
-919C E168
-919D E169
-919E E16A
-919F E16B
-91A0 E16C
-91A1 E16D
-91A2 F5B0
-91A3 F5B1
-91A4 E16E
-91A5 E16F
-91A6 E170
-91A7 E171
-91A8 E172
-91A9 E173
-91AA F5B2
-91AB E174
-91AC E175
-91AD F5B3
-91AE F5B4
-91AF F5B5
-91B0 E176
-91B1 E177
-91B2 E178
-91B3 E179
-91B4 F5B7
-91B5 F5B6
-91B6 E17A
-91B7 E17B
-91B8 E17C
-91B9 E17D
-91BA F5B8
-91BB E17E
-91BC E180
-91BD E181
-91BE E182
-91BF E183
-91C0 E184
-91C1 E185
-91C2 E186
-91C3 E187
-91C4 E188
-91C5 E189
-91C6 E18A
-91C7 B2C9
-91C8 E18B
-91C9 D3D4
-91CA CACD
-91CB E18C
-91CC C0EF
-91CD D6D8
-91CE D2B0
-91CF C1BF
-91D0 E18D
-91D1 BDF0
-91D2 E18E
-91D3 E18F
-91D4 E190
-91D5 E191
-91D6 E192
-91D7 E193
-91D8 E194
-91D9 E195
-91DA E196
-91DB E197
-91DC B8AA
-91DD E198
-91DE E199
-91DF E19A
-91E0 E19B
-91E1 E19C
-91E2 E19D
-91E3 E19E
-91E4 E19F
-91E5 E1A0
-91E6 E240
-91E7 E241
-91E8 E242
-91E9 E243
-91EA E244
-91EB E245
-91EC E246
-91ED E247
-91EE E248
-91EF E249
-91F0 E24A
-91F1 E24B
-91F2 E24C
-91F3 E24D
-91F4 E24E
-91F5 E24F
-91F6 E250
-91F7 E251
-91F8 E252
-91F9 E253
-91FA E254
-91FB E255
-91FC E256
-91FD E257
-91FE E258
-91FF E259
-9200 E25A
-9201 E25B
-9202 E25C
-9203 E25D
-9204 E25E
-9205 E25F
-9206 E260
-9207 E261
-9208 E262
-9209 E263
-920A E264
-920B E265
-920C E266
-920D E267
-920E E268
-920F E269
-9210 E26A
-9211 E26B
-9212 E26C
-9213 E26D
-9214 E26E
-9215 E26F
-9216 E270
-9217 E271
-9218 E272
-9219 E273
-921A E274
-921B E275
-921C E276
-921D E277
-921E E278
-921F E279
-9220 E27A
-9221 E27B
-9222 E27C
-9223 E27D
-9224 E27E
-9225 E280
-9226 E281
-9227 E282
-9228 E283
-9229 E284
-922A E285
-922B E286
-922C E287
-922D E288
-922E E289
-922F E28A
-9230 E28B
-9231 E28C
-9232 E28D
-9233 E28E
-9234 E28F
-9235 E290
-9236 E291
-9237 E292
-9238 E293
-9239 E294
-923A E295
-923B E296
-923C E297
-923D E298
-923E E299
-923F E29A
-9240 E29B
-9241 E29C
-9242 E29D
-9243 E29E
-9244 E29F
-9245 E2A0
-9246 E340
-9247 E341
-9248 E342
-9249 E343
-924A E344
-924B E345
-924C E346
-924D E347
-924E E348
-924F E349
-9250 E34A
-9251 E34B
-9252 E34C
-9253 E34D
-9254 E34E
-9255 E34F
-9256 E350
-9257 E351
-9258 E352
-9259 E353
-925A E354
-925B E355
-925C E356
-925D E357
-925E E358
-925F E359
-9260 E35A
-9261 E35B
-9262 E35C
-9263 E35D
-9264 E35E
-9265 E35F
-9266 E360
-9267 E361
-9268 E362
-9269 E363
-926A E364
-926B E365
-926C E366
-926D E367
-926E E368
-926F E369
-9270 E36A
-9271 E36B
-9272 E36C
-9273 E36D
-9274 BCF8
-9275 E36E
-9276 E36F
-9277 E370
-9278 E371
-9279 E372
-927A E373
-927B E374
-927C E375
-927D E376
-927E E377
-927F E378
-9280 E379
-9281 E37A
-9282 E37B
-9283 E37C
-9284 E37D
-9285 E37E
-9286 E380
-9287 E381
-9288 E382
-9289 E383
-928A E384
-928B E385
-928C E386
-928D E387
-928E F6C6
-928F E388
-9290 E389
-9291 E38A
-9292 E38B
-9293 E38C
-9294 E38D
-9295 E38E
-9296 E38F
-9297 E390
-9298 E391
-9299 E392
-929A E393
-929B E394
-929C E395
-929D E396
-929E E397
-929F E398
-92A0 E399
-92A1 E39A
-92A2 E39B
-92A3 E39C
-92A4 E39D
-92A5 E39E
-92A6 E39F
-92A7 E3A0
-92A8 E440
-92A9 E441
-92AA E442
-92AB E443
-92AC E444
-92AD E445
-92AE F6C7
-92AF E446
-92B0 E447
-92B1 E448
-92B2 E449
-92B3 E44A
-92B4 E44B
-92B5 E44C
-92B6 E44D
-92B7 E44E
-92B8 E44F
-92B9 E450
-92BA E451
-92BB E452
-92BC E453
-92BD E454
-92BE E455
-92BF E456
-92C0 E457
-92C1 E458
-92C2 E459
-92C3 E45A
-92C4 E45B
-92C5 E45C
-92C6 E45D
-92C7 E45E
-92C8 F6C8
-92C9 E45F
-92CA E460
-92CB E461
-92CC E462
-92CD E463
-92CE E464
-92CF E465
-92D0 E466
-92D1 E467
-92D2 E468
-92D3 E469
-92D4 E46A
-92D5 E46B
-92D6 E46C
-92D7 E46D
-92D8 E46E
-92D9 E46F
-92DA E470
-92DB E471
-92DC E472
-92DD E473
-92DE E474
-92DF E475
-92E0 E476
-92E1 E477
-92E2 E478
-92E3 E479
-92E4 E47A
-92E5 E47B
-92E6 E47C
-92E7 E47D
-92E8 E47E
-92E9 E480
-92EA E481
-92EB E482
-92EC E483
-92ED E484
-92EE E485
-92EF E486
-92F0 E487
-92F1 E488
-92F2 E489
-92F3 E48A
-92F4 E48B
-92F5 E48C
-92F6 E48D
-92F7 E48E
-92F8 E48F
-92F9 E490
-92FA E491
-92FB E492
-92FC E493
-92FD E494
-92FE E495
-92FF E496
-9300 E497
-9301 E498
-9302 E499
-9303 E49A
-9304 E49B
-9305 E49C
-9306 E49D
-9307 E49E
-9308 E49F
-9309 E4A0
-930A E540
-930B E541
-930C E542
-930D E543
-930E E544
-930F E545
-9310 E546
-9311 E547
-9312 E548
-9313 E549
-9314 E54A
-9315 E54B
-9316 E54C
-9317 E54D
-9318 E54E
-9319 E54F
-931A E550
-931B E551
-931C E552
-931D E553
-931E E554
-931F E555
-9320 E556
-9321 E557
-9322 E558
-9323 E559
-9324 E55A
-9325 E55B
-9326 E55C
-9327 E55D
-9328 E55E
-9329 E55F
-932A E560
-932B E561
-932C E562
-932D E563
-932E E564
-932F E565
-9330 E566
-9331 E567
-9332 E568
-9333 E569
-9334 E56A
-9335 E56B
-9336 E56C
-9337 E56D
-9338 E56E
-9339 E56F
-933A E570
-933B E571
-933C E572
-933D E573
-933E F6C9
-933F E574
-9340 E575
-9341 E576
-9342 E577
-9343 E578
-9344 E579
-9345 E57A
-9346 E57B
-9347 E57C
-9348 E57D
-9349 E57E
-934A E580
-934B E581
-934C E582
-934D E583
-934E E584
-934F E585
-9350 E586
-9351 E587
-9352 E588
-9353 E589
-9354 E58A
-9355 E58B
-9356 E58C
-9357 E58D
-9358 E58E
-9359 E58F
-935A E590
-935B E591
-935C E592
-935D E593
-935E E594
-935F E595
-9360 E596
-9361 E597
-9362 E598
-9363 E599
-9364 E59A
-9365 E59B
-9366 E59C
-9367 E59D
-9368 E59E
-9369 E59F
-936A F6CA
-936B E5A0
-936C E640
-936D E641
-936E E642
-936F E643
-9370 E644
-9371 E645
-9372 E646
-9373 E647
-9374 E648
-9375 E649
-9376 E64A
-9377 E64B
-9378 E64C
-9379 E64D
-937A E64E
-937B E64F
-937C E650
-937D E651
-937E E652
-937F E653
-9380 E654
-9381 E655
-9382 E656
-9383 E657
-9384 E658
-9385 E659
-9386 E65A
-9387 E65B
-9388 E65C
-9389 E65D
-938A E65E
-938B E65F
-938C E660
-938D E661
-938E E662
-938F F6CC
-9390 E663
-9391 E664
-9392 E665
-9393 E666
-9394 E667
-9395 E668
-9396 E669
-9397 E66A
-9398 E66B
-9399 E66C
-939A E66D
-939B E66E
-939C E66F
-939D E670
-939E E671
-939F E672
-93A0 E673
-93A1 E674
-93A2 E675
-93A3 E676
-93A4 E677
-93A5 E678
-93A6 E679
-93A7 E67A
-93A8 E67B
-93A9 E67C
-93AA E67D
-93AB E67E
-93AC E680
-93AD E681
-93AE E682
-93AF E683
-93B0 E684
-93B1 E685
-93B2 E686
-93B3 E687
-93B4 E688
-93B5 E689
-93B6 E68A
-93B7 E68B
-93B8 E68C
-93B9 E68D
-93BA E68E
-93BB E68F
-93BC E690
-93BD E691
-93BE E692
-93BF E693
-93C0 E694
-93C1 E695
-93C2 E696
-93C3 E697
-93C4 E698
-93C5 E699
-93C6 E69A
-93C7 E69B
-93C8 E69C
-93C9 E69D
-93CA F6CB
-93CB E69E
-93CC E69F
-93CD E6A0
-93CE E740
-93CF E741
-93D0 E742
-93D1 E743
-93D2 E744
-93D3 E745
-93D4 E746
-93D5 E747
-93D6 F7E9
-93D7 E748
-93D8 E749
-93D9 E74A
-93DA E74B
-93DB E74C
-93DC E74D
-93DD E74E
-93DE E74F
-93DF E750
-93E0 E751
-93E1 E752
-93E2 E753
-93E3 E754
-93E4 E755
-93E5 E756
-93E6 E757
-93E7 E758
-93E8 E759
-93E9 E75A
-93EA E75B
-93EB E75C
-93EC E75D
-93ED E75E
-93EE E75F
-93EF E760
-93F0 E761
-93F1 E762
-93F2 E763
-93F3 E764
-93F4 E765
-93F5 E766
-93F6 E767
-93F7 E768
-93F8 E769
-93F9 E76A
-93FA E76B
-93FB E76C
-93FC E76D
-93FD E76E
-93FE E76F
-93FF E770
-9400 E771
-9401 E772
-9402 E773
-9403 E774
-9404 E775
-9405 E776
-9406 E777
-9407 E778
-9408 E779
-9409 E77A
-940A E77B
-940B E77C
-940C E77D
-940D E77E
-940E E780
-940F E781
-9410 E782
-9411 E783
-9412 E784
-9413 E785
-9414 E786
-9415 E787
-9416 E788
-9417 E789
-9418 E78A
-9419 E78B
-941A E78C
-941B E78D
-941C E78E
-941D E78F
-941E E790
-941F E791
-9420 E792
-9421 E793
-9422 E794
-9423 E795
-9424 E796
-9425 E797
-9426 E798
-9427 E799
-9428 E79A
-9429 E79B
-942A E79C
-942B E79D
-942C E79E
-942D E79F
-942E E7A0
-942F E840
-9430 E841
-9431 E842
-9432 E843
-9433 E844
-9434 E845
-9435 E846
-9436 E847
-9437 E848
-9438 E849
-9439 E84A
-943A E84B
-943B E84C
-943C E84D
-943D E84E
-943E F6CD
-943F E84F
-9440 E850
-9441 E851
-9442 E852
-9443 E853
-9444 E854
-9445 E855
-9446 E856
-9447 E857
-9448 E858
-9449 E859
-944A E85A
-944B E85B
-944C E85C
-944D E85D
-944E E85E
-944F E85F
-9450 E860
-9451 E861
-9452 E862
-9453 E863
-9454 E864
-9455 E865
-9456 E866
-9457 E867
-9458 E868
-9459 E869
-945A E86A
-945B E86B
-945C E86C
-945D E86D
-945E E86E
-945F E86F
-9460 E870
-9461 E871
-9462 E872
-9463 E873
-9464 E874
-9465 E875
-9466 E876
-9467 E877
-9468 E878
-9469 E879
-946A E87A
-946B F6CE
-946C E87B
-946D E87C
-946E E87D
-946F E87E
-9470 E880
-9471 E881
-9472 E882
-9473 E883
-9474 E884
-9475 E885
-9476 E886
-9477 E887
-9478 E888
-9479 E889
-947A E88A
-947B E88B
-947C E88C
-947D E88D
-947E E88E
-947F E88F
-9480 E890
-9481 E891
-9482 E892
-9483 E893
-9484 E894
-9485 EEC4
-9486 EEC5
-9487 EEC6
-9488 D5EB
-9489 B6A4
-948A EEC8
-948B EEC7
-948C EEC9
-948D EECA
-948E C7A5
-948F EECB
-9490 EECC
-9491 E895
-9492 B7B0
-9493 B5F6
-9494 EECD
-9495 EECF
-9496 E896
-9497 EECE
-9498 E897
-9499 B8C6
-949A EED0
-949B EED1
-949C EED2
-949D B6DB
-949E B3AE
-949F D6D3
-94A0 C4C6
-94A1 B1B5
-94A2 B8D6
-94A3 EED3
-94A4 EED4
-94A5 D4BF
-94A6 C7D5
-94A7 BEFB
-94A8 CED9
-94A9 B9B3
-94AA EED6
-94AB EED5
-94AC EED8
-94AD EED7
-94AE C5A5
-94AF EED9
-94B0 EEDA
-94B1 C7AE
-94B2 EEDB
-94B3 C7AF
-94B4 EEDC
-94B5 B2A7
-94B6 EEDD
-94B7 EEDE
-94B8 EEDF
-94B9 EEE0
-94BA EEE1
-94BB D7EA
-94BC EEE2
-94BD EEE3
-94BE BCD8
-94BF EEE4
-94C0 D3CB
-94C1 CCFA
-94C2 B2AC
-94C3 C1E5
-94C4 EEE5
-94C5 C7A6
-94C6 C3AD
-94C7 E898
-94C8 EEE6
-94C9 EEE7
-94CA EEE8
-94CB EEE9
-94CC EEEA
-94CD EEEB
-94CE EEEC
-94CF E899
-94D0 EEED
-94D1 EEEE
-94D2 EEEF
-94D3 E89A
-94D4 E89B
-94D5 EEF0
-94D6 EEF1
-94D7 EEF2
-94D8 EEF4
-94D9 EEF3
-94DA E89C
-94DB EEF5
-94DC CDAD
-94DD C2C1
-94DE EEF6
-94DF EEF7
-94E0 EEF8
-94E1 D5A1
-94E2 EEF9
-94E3 CFB3
-94E4 EEFA
-94E5 EEFB
-94E6 E89D
-94E7 EEFC
-94E8 EEFD
-94E9 EFA1
-94EA EEFE
-94EB EFA2
-94EC B8F5
-94ED C3FA
-94EE EFA3
-94EF EFA4
-94F0 BDC2
-94F1 D2BF
-94F2 B2F9
-94F3 EFA5
-94F4 EFA6
-94F5 EFA7
-94F6 D2F8
-94F7 EFA8
-94F8 D6FD
-94F9 EFA9
-94FA C6CC
-94FB E89E
-94FC EFAA
-94FD EFAB
-94FE C1B4
-94FF EFAC
-9500 CFFA
-9501 CBF8
-9502 EFAE
-9503 EFAD
-9504 B3FA
-9505 B9F8
-9506 EFAF
-9507 EFB0
-9508 D0E2
-9509 EFB1
-950A EFB2
-950B B7E6
-950C D0BF
-950D EFB3
-950E EFB4
-950F EFB5
-9510 C8F1
-9511 CCE0
-9512 EFB6
-9513 EFB7
-9514 EFB8
-9515 EFB9
-9516 EFBA
-9517 D5E0
-9518 EFBB
-9519 B4ED
-951A C3AA
-951B EFBC
-951C E89F
-951D EFBD
-951E EFBE
-951F EFBF
-9520 E8A0
-9521 CEFD
-9522 EFC0
-9523 C2E0
-9524 B4B8
-9525 D7B6
-9526 BDF5
-9527 E940
-9528 CFC7
-9529 EFC3
-952A EFC1
-952B EFC2
-952C EFC4
-952D B6A7
-952E BCFC
-952F BEE2
-9530 C3CC
-9531 EFC5
-9532 EFC6
-9533 E941
-9534 EFC7
-9535 EFCF
-9536 EFC8
-9537 EFC9
-9538 EFCA
-9539 C7C2
-953A EFF1
-953B B6CD
-953C EFCB
-953D E942
-953E EFCC
-953F EFCD
-9540 B6C6
-9541 C3BE
-9542 EFCE
-9543 E943
-9544 EFD0
-9545 EFD1
-9546 EFD2
-9547 D5F2
-9548 E944
-9549 EFD3
-954A C4F7
-954B E945
-954C EFD4
-954D C4F8
-954E EFD5
-954F EFD6
-9550 B8E4
-9551 B0F7
-9552 EFD7
-9553 EFD8
-9554 EFD9
-9555 E946
-9556 EFDA
-9557 EFDB
-9558 EFDC
-9559 EFDD
-955A E947
-955B EFDE
-955C BEB5
-955D EFE1
-955E EFDF
-955F EFE0
-9560 E948
-9561 EFE2
-9562 EFE3
-9563 C1CD
-9564 EFE4
-9565 EFE5
-9566 EFE6
-9567 EFE7
-9568 EFE8
-9569 EFE9
-956A EFEA
-956B EFEB
-956C EFEC
-956D C0D8
-956E E949
-956F EFED
-9570 C1AD
-9571 EFEE
-9572 EFEF
-9573 EFF0
-9574 E94A
-9575 E94B
-9576 CFE2
-9577 E94C
-9578 E94D
-9579 E94E
-957A E94F
-957B E950
-957C E951
-957D E952
-957E E953
-957F B3A4
-9580 E954
-9581 E955
-9582 E956
-9583 E957
-9584 E958
-9585 E959
-9586 E95A
-9587 E95B
-9588 E95C
-9589 E95D
-958A E95E
-958B E95F
-958C E960
-958D E961
-958E E962
-958F E963
-9590 E964
-9591 E965
-9592 E966
-9593 E967
-9594 E968
-9595 E969
-9596 E96A
-9597 E96B
-9598 E96C
-9599 E96D
-959A E96E
-959B E96F
-959C E970
-959D E971
-959E E972
-959F E973
-95A0 E974
-95A1 E975
-95A2 E976
-95A3 E977
-95A4 E978
-95A5 E979
-95A6 E97A
-95A7 E97B
-95A8 E97C
-95A9 E97D
-95AA E97E
-95AB E980
-95AC E981
-95AD E982
-95AE E983
-95AF E984
-95B0 E985
-95B1 E986
-95B2 E987
-95B3 E988
-95B4 E989
-95B5 E98A
-95B6 E98B
-95B7 E98C
-95B8 E98D
-95B9 E98E
-95BA E98F
-95BB E990
-95BC E991
-95BD E992
-95BE E993
-95BF E994
-95C0 E995
-95C1 E996
-95C2 E997
-95C3 E998
-95C4 E999
-95C5 E99A
-95C6 E99B
-95C7 E99C
-95C8 E99D
-95C9 E99E
-95CA E99F
-95CB E9A0
-95CC EA40
-95CD EA41
-95CE EA42
-95CF EA43
-95D0 EA44
-95D1 EA45
-95D2 EA46
-95D3 EA47
-95D4 EA48
-95D5 EA49
-95D6 EA4A
-95D7 EA4B
-95D8 EA4C
-95D9 EA4D
-95DA EA4E
-95DB EA4F
-95DC EA50
-95DD EA51
-95DE EA52
-95DF EA53
-95E0 EA54
-95E1 EA55
-95E2 EA56
-95E3 EA57
-95E4 EA58
-95E5 EA59
-95E6 EA5A
-95E7 EA5B
-95E8 C3C5
-95E9 E3C5
-95EA C9C1
-95EB E3C6
-95EC EA5C
-95ED B1D5
-95EE CECA
-95EF B4B3
-95F0 C8F2
-95F1 E3C7
-95F2 CFD0
-95F3 E3C8
-95F4 BCE4
-95F5 E3C9
-95F6 E3CA
-95F7 C3C6
-95F8 D5A2
-95F9 C4D6
-95FA B9EB
-95FB CEC5
-95FC E3CB
-95FD C3F6
-95FE E3CC
-95FF EA5D
-9600 B7A7
-9601 B8F3
-9602 BAD2
-9603 E3CD
-9604 E3CE
-9605 D4C4
-9606 E3CF
-9607 EA5E
-9608 E3D0
-9609 D1CB
-960A E3D1
-960B E3D2
-960C E3D3
-960D E3D4
-960E D1D6
-960F E3D5
-9610 B2FB
-9611 C0BB
-9612 E3D6
-9613 EA5F
-9614 C0AB
-9615 E3D7
-9616 E3D8
-9617 E3D9
-9618 EA60
-9619 E3DA
-961A E3DB
-961B EA61
-961C B8B7
-961D DAE2
-961E EA62
-961F B6D3
-9620 EA63
-9621 DAE4
-9622 DAE3
-9623 EA64
-9624 EA65
-9625 EA66
-9626 EA67
-9627 EA68
-9628 EA69
-9629 EA6A
-962A DAE6
-962B EA6B
-962C EA6C
-962D EA6D
-962E C8EE
-962F EA6E
-9630 EA6F
-9631 DAE5
-9632 B7C0
-9633 D1F4
-9634 D2F5
-9635 D5F3
-9636 BDD7
-9637 EA70
-9638 EA71
-9639 EA72
-963A EA73
-963B D7E8
-963C DAE8
-963D DAE7
-963E EA74
-963F B0A2
-9640 CDD3
-9641 EA75
-9642 DAE9
-9643 EA76
-9644 B8BD
-9645 BCCA
-9646 C2BD
-9647 C2A4
-9648 B3C2
-9649 DAEA
-964A EA77
-964B C2AA
-964C C4B0
-964D BDB5
-964E EA78
-964F EA79
-9650 CFDE
-9651 EA7A
-9652 EA7B
-9653 EA7C
-9654 DAEB
-9655 C9C2
-9656 EA7D
-9657 EA7E
-9658 EA80
-9659 EA81
-965A EA82
-965B B1DD
-965C EA83
-965D EA84
-965E EA85
-965F DAEC
-9660 EA86
-9661 B6B8
-9662 D4BA
-9663 EA87
-9664 B3FD
-9665 EA88
-9666 EA89
-9667 DAED
-9668 D4C9
-9669 CFD5
-966A C5E3
-966B EA8A
-966C DAEE
-966D EA8B
-966E EA8C
-966F EA8D
-9670 EA8E
-9671 EA8F
-9672 DAEF
-9673 EA90
-9674 DAF0
-9675 C1EA
-9676 CCD5
-9677 CFDD
-9678 EA91
-9679 EA92
-967A EA93
-967B EA94
-967C EA95
-967D EA96
-967E EA97
-967F EA98
-9680 EA99
-9681 EA9A
-9682 EA9B
-9683 EA9C
-9684 EA9D
-9685 D3E7
-9686 C2A1
-9687 EA9E
-9688 DAF1
-9689 EA9F
-968A EAA0
-968B CBE5
-968C EB40
-968D DAF2
-968E EB41
-968F CBE6
-9690 D2FE
-9691 EB42
-9692 EB43
-9693 EB44
-9694 B8F4
-9695 EB45
-9696 EB46
-9697 DAF3
-9698 B0AF
-9699 CFB6
-969A EB47
-969B EB48
-969C D5CF
-969D EB49
-969E EB4A
-969F EB4B
-96A0 EB4C
-96A1 EB4D
-96A2 EB4E
-96A3 EB4F
-96A4 EB50
-96A5 EB51
-96A6 EB52
-96A7 CBED
-96A8 EB53
-96A9 EB54
-96AA EB55
-96AB EB56
-96AC EB57
-96AD EB58
-96AE EB59
-96AF EB5A
-96B0 DAF4
-96B1 EB5B
-96B2 EB5C
-96B3 E3C4
-96B4 EB5D
-96B5 EB5E
-96B6 C1A5
-96B7 EB5F
-96B8 EB60
-96B9 F6BF
-96BA EB61
-96BB EB62
-96BC F6C0
-96BD F6C1
-96BE C4D1
-96BF EB63
-96C0 C8B8
-96C1 D1E3
-96C2 EB64
-96C3 EB65
-96C4 D0DB
-96C5 D1C5
-96C6 BCAF
-96C7 B9CD
-96C8 EB66
-96C9 EFF4
-96CA EB67
-96CB EB68
-96CC B4C6
-96CD D3BA
-96CE F6C2
-96CF B3FB
-96D0 EB69
-96D1 EB6A
-96D2 F6C3
-96D3 EB6B
-96D4 EB6C
-96D5 B5F1
-96D6 EB6D
-96D7 EB6E
-96D8 EB6F
-96D9 EB70
-96DA EB71
-96DB EB72
-96DC EB73
-96DD EB74
-96DE EB75
-96DF EB76
-96E0 F6C5
-96E1 EB77
-96E2 EB78
-96E3 EB79
-96E4 EB7A
-96E5 EB7B
-96E6 EB7C
-96E7 EB7D
-96E8 D3EA
-96E9 F6A7
-96EA D1A9
-96EB EB7E
-96EC EB80
-96ED EB81
-96EE EB82
-96EF F6A9
-96F0 EB83
-96F1 EB84
-96F2 EB85
-96F3 F6A8
-96F4 EB86
-96F5 EB87
-96F6 C1E3
-96F7 C0D7
-96F8 EB88
-96F9 B1A2
-96FA EB89
-96FB EB8A
-96FC EB8B
-96FD EB8C
-96FE CEED
-96FF EB8D
-9700 D0E8
-9701 F6AB
-9702 EB8E
-9703 EB8F
-9704 CFF6
-9705 EB90
-9706 F6AA
-9707 D5F0
-9708 F6AC
-9709 C3B9
-970A EB91
-970B EB92
-970C EB93
-970D BBF4
-970E F6AE
-970F F6AD
-9710 EB94
-9711 EB95
-9712 EB96
-9713 C4DE
-9714 EB97
-9715 EB98
-9716 C1D8
-9717 EB99
-9718 EB9A
-9719 EB9B
-971A EB9C
-971B EB9D
-971C CBAA
-971D EB9E
-971E CFBC
-971F EB9F
-9720 EBA0
-9721 EC40
-9722 EC41
-9723 EC42
-9724 EC43
-9725 EC44
-9726 EC45
-9727 EC46
-9728 EC47
-9729 EC48
-972A F6AF
-972B EC49
-972C EC4A
-972D F6B0
-972E EC4B
-972F EC4C
-9730 F6B1
-9731 EC4D
-9732 C2B6
-9733 EC4E
-9734 EC4F
-9735 EC50
-9736 EC51
-9737 EC52
-9738 B0D4
-9739 C5F9
-973A EC53
-973B EC54
-973C EC55
-973D EC56
-973E F6B2
-973F EC57
-9740 EC58
-9741 EC59
-9742 EC5A
-9743 EC5B
-9744 EC5C
-9745 EC5D
-9746 EC5E
-9747 EC5F
-9748 EC60
-9749 EC61
-974A EC62
-974B EC63
-974C EC64
-974D EC65
-974E EC66
-974F EC67
-9750 EC68
-9751 EC69
-9752 C7E0
-9753 F6A6
-9754 EC6A
-9755 EC6B
-9756 BEB8
-9757 EC6C
-9758 EC6D
-9759 BEB2
-975A EC6E
-975B B5E5
-975C EC6F
-975D EC70
-975E B7C7
-975F EC71
-9760 BFBF
-9761 C3D2
-9762 C3E6
-9763 EC72
-9764 EC73
-9765 D8CC
-9766 EC74
-9767 EC75
-9768 EC76
-9769 B8EF
-976A EC77
-976B EC78
-976C EC79
-976D EC7A
-976E EC7B
-976F EC7C
-9770 EC7D
-9771 EC7E
-9772 EC80
-9773 BDF9
-9774 D1A5
-9775 EC81
-9776 B0D0
-9777 EC82
-9778 EC83
-9779 EC84
-977A EC85
-977B EC86
-977C F7B0
-977D EC87
-977E EC88
-977F EC89
-9780 EC8A
-9781 EC8B
-9782 EC8C
-9783 EC8D
-9784 EC8E
-9785 F7B1
-9786 EC8F
-9787 EC90
-9788 EC91
-9789 EC92
-978A EC93
-978B D0AC
-978C EC94
-978D B0B0
-978E EC95
-978F EC96
-9790 EC97
-9791 F7B2
-9792 F7B3
-9793 EC98
-9794 F7B4
-9795 EC99
-9796 EC9A
-9797 EC9B
-9798 C7CA
-9799 EC9C
-979A EC9D
-979B EC9E
-979C EC9F
-979D ECA0
-979E ED40
-979F ED41
-97A0 BECF
-97A1 ED42
-97A2 ED43
-97A3 F7B7
-97A4 ED44
-97A5 ED45
-97A6 ED46
-97A7 ED47
-97A8 ED48
-97A9 ED49
-97AA ED4A
-97AB F7B6
-97AC ED4B
-97AD B1DE
-97AE ED4C
-97AF F7B5
-97B0 ED4D
-97B1 ED4E
-97B2 F7B8
-97B3 ED4F
-97B4 F7B9
-97B5 ED50
-97B6 ED51
-97B7 ED52
-97B8 ED53
-97B9 ED54
-97BA ED55
-97BB ED56
-97BC ED57
-97BD ED58
-97BE ED59
-97BF ED5A
-97C0 ED5B
-97C1 ED5C
-97C2 ED5D
-97C3 ED5E
-97C4 ED5F
-97C5 ED60
-97C6 ED61
-97C7 ED62
-97C8 ED63
-97C9 ED64
-97CA ED65
-97CB ED66
-97CC ED67
-97CD ED68
-97CE ED69
-97CF ED6A
-97D0 ED6B
-97D1 ED6C
-97D2 ED6D
-97D3 ED6E
-97D4 ED6F
-97D5 ED70
-97D6 ED71
-97D7 ED72
-97D8 ED73
-97D9 ED74
-97DA ED75
-97DB ED76
-97DC ED77
-97DD ED78
-97DE ED79
-97DF ED7A
-97E0 ED7B
-97E1 ED7C
-97E2 ED7D
-97E3 ED7E
-97E4 ED80
-97E5 ED81
-97E6 CEA4
-97E7 C8CD
-97E8 ED82
-97E9 BAAB
-97EA E8B8
-97EB E8B9
-97EC E8BA
-97ED BEC2
-97EE ED83
-97EF ED84
-97F0 ED85
-97F1 ED86
-97F2 ED87
-97F3 D2F4
-97F4 ED88
-97F5 D4CF
-97F6 C9D8
-97F7 ED89
-97F8 ED8A
-97F9 ED8B
-97FA ED8C
-97FB ED8D
-97FC ED8E
-97FD ED8F
-97FE ED90
-97FF ED91
-9800 ED92
-9801 ED93
-9802 ED94
-9803 ED95
-9804 ED96
-9805 ED97
-9806 ED98
-9807 ED99
-9808 ED9A
-9809 ED9B
-980A ED9C
-980B ED9D
-980C ED9E
-980D ED9F
-980E EDA0
-980F EE40
-9810 EE41
-9811 EE42
-9812 EE43
-9813 EE44
-9814 EE45
-9815 EE46
-9816 EE47
-9817 EE48
-9818 EE49
-9819 EE4A
-981A EE4B
-981B EE4C
-981C EE4D
-981D EE4E
-981E EE4F
-981F EE50
-9820 EE51
-9821 EE52
-9822 EE53
-9823 EE54
-9824 EE55
-9825 EE56
-9826 EE57
-9827 EE58
-9828 EE59
-9829 EE5A
-982A EE5B
-982B EE5C
-982C EE5D
-982D EE5E
-982E EE5F
-982F EE60
-9830 EE61
-9831 EE62
-9832 EE63
-9833 EE64
-9834 EE65
-9835 EE66
-9836 EE67
-9837 EE68
-9838 EE69
-9839 EE6A
-983A EE6B
-983B EE6C
-983C EE6D
-983D EE6E
-983E EE6F
-983F EE70
-9840 EE71
-9841 EE72
-9842 EE73
-9843 EE74
-9844 EE75
-9845 EE76
-9846 EE77
-9847 EE78
-9848 EE79
-9849 EE7A
-984A EE7B
-984B EE7C
-984C EE7D
-984D EE7E
-984E EE80
-984F EE81
-9850 EE82
-9851 EE83
-9852 EE84
-9853 EE85
-9854 EE86
-9855 EE87
-9856 EE88
-9857 EE89
-9858 EE8A
-9859 EE8B
-985A EE8C
-985B EE8D
-985C EE8E
-985D EE8F
-985E EE90
-985F EE91
-9860 EE92
-9861 EE93
-9862 EE94
-9863 EE95
-9864 EE96
-9865 EE97
-9866 EE98
-9867 EE99
-9868 EE9A
-9869 EE9B
-986A EE9C
-986B EE9D
-986C EE9E
-986D EE9F
-986E EEA0
-986F EF40
-9870 EF41
-9871 EF42
-9872 EF43
-9873 EF44
-9874 EF45
-9875 D2B3
-9876 B6A5
-9877 C7EA
-9878 F1FC
-9879 CFEE
-987A CBB3
-987B D0EB
-987C E7EF
-987D CDE7
-987E B9CB
-987F B6D9
-9880 F1FD
-9881 B0E4
-9882 CBCC
-9883 F1FE
-9884 D4A4
-9885 C2AD
-9886 C1EC
-9887 C6C4
-9888 BEB1
-9889 F2A1
-988A BCD5
-988B EF46
-988C F2A2
-988D F2A3
-988E EF47
-988F F2A4
-9890 D2C3
-9891 C6B5
-9892 EF48
-9893 CDC7
-9894 F2A5
-9895 EF49
-9896 D3B1
-9897 BFC5
-9898 CCE2
-9899 EF4A
-989A F2A6
-989B F2A7
-989C D1D5
-989D B6EE
-989E F2A8
-989F F2A9
-98A0 B5DF
-98A1 F2AA
-98A2 F2AB
-98A3 EF4B
-98A4 B2FC
-98A5 F2AC
-98A6 F2AD
-98A7 C8A7
-98A8 EF4C
-98A9 EF4D
-98AA EF4E
-98AB EF4F
-98AC EF50
-98AD EF51
-98AE EF52
-98AF EF53
-98B0 EF54
-98B1 EF55
-98B2 EF56
-98B3 EF57
-98B4 EF58
-98B5 EF59
-98B6 EF5A
-98B7 EF5B
-98B8 EF5C
-98B9 EF5D
-98BA EF5E
-98BB EF5F
-98BC EF60
-98BD EF61
-98BE EF62
-98BF EF63
-98C0 EF64
-98C1 EF65
-98C2 EF66
-98C3 EF67
-98C4 EF68
-98C5 EF69
-98C6 EF6A
-98C7 EF6B
-98C8 EF6C
-98C9 EF6D
-98CA EF6E
-98CB EF6F
-98CC EF70
-98CD EF71
-98CE B7E7
-98CF EF72
-98D0 EF73
-98D1 ECA9
-98D2 ECAA
-98D3 ECAB
-98D4 EF74
-98D5 ECAC
-98D6 EF75
-98D7 EF76
-98D8 C6AE
-98D9 ECAD
-98DA ECAE
-98DB EF77
-98DC EF78
-98DD EF79
-98DE B7C9
-98DF CAB3
-98E0 EF7A
-98E1 EF7B
-98E2 EF7C
-98E3 EF7D
-98E4 EF7E
-98E5 EF80
-98E6 EF81
-98E7 E2B8
-98E8 F7CF
-98E9 EF82
-98EA EF83
-98EB EF84
-98EC EF85
-98ED EF86
-98EE EF87
-98EF EF88
-98F0 EF89
-98F1 EF8A
-98F2 EF8B
-98F3 EF8C
-98F4 EF8D
-98F5 EF8E
-98F6 EF8F
-98F7 EF90
-98F8 EF91
-98F9 EF92
-98FA EF93
-98FB EF94
-98FC EF95
-98FD EF96
-98FE EF97
-98FF EF98
-9900 EF99
-9901 EF9A
-9902 EF9B
-9903 EF9C
-9904 EF9D
-9905 EF9E
-9906 EF9F
-9907 EFA0
-9908 F040
-9909 F041
-990A F042
-990B F043
-990C F044
-990D F7D0
-990E F045
-990F F046
-9910 B2CD
-9911 F047
-9912 F048
-9913 F049
-9914 F04A
-9915 F04B
-9916 F04C
-9917 F04D
-9918 F04E
-9919 F04F
-991A F050
-991B F051
-991C F052
-991D F053
-991E F054
-991F F055
-9920 F056
-9921 F057
-9922 F058
-9923 F059
-9924 F05A
-9925 F05B
-9926 F05C
-9927 F05D
-9928 F05E
-9929 F05F
-992A F060
-992B F061
-992C F062
-992D F063
-992E F7D1
-992F F064
-9930 F065
-9931 F066
-9932 F067
-9933 F068
-9934 F069
-9935 F06A
-9936 F06B
-9937 F06C
-9938 F06D
-9939 F06E
-993A F06F
-993B F070
-993C F071
-993D F072
-993E F073
-993F F074
-9940 F075
-9941 F076
-9942 F077
-9943 F078
-9944 F079
-9945 F07A
-9946 F07B
-9947 F07C
-9948 F07D
-9949 F07E
-994A F080
-994B F081
-994C F082
-994D F083
-994E F084
-994F F085
-9950 F086
-9951 F087
-9952 F088
-9953 F089
-9954 F7D3
-9955 F7D2
-9956 F08A
-9957 F08B
-9958 F08C
-9959 F08D
-995A F08E
-995B F08F
-995C F090
-995D F091
-995E F092
-995F F093
-9960 F094
-9961 F095
-9962 F096
-9963 E2BB
-9964 F097
-9965 BCA2
-9966 F098
-9967 E2BC
-9968 E2BD
-9969 E2BE
-996A E2BF
-996B E2C0
-996C E2C1
-996D B7B9
-996E D2FB
-996F BDA4
-9970 CACE
-9971 B1A5
-9972 CBC7
-9973 F099
-9974 E2C2
-9975 B6FC
-9976 C8C4
-9977 E2C3
-9978 F09A
-9979 F09B
-997A BDC8
-997B F09C
-997C B1FD
-997D E2C4
-997E F09D
-997F B6F6
-9980 E2C5
-9981 C4D9
-9982 F09E
-9983 F09F
-9984 E2C6
-9985 CFDA
-9986 B9DD
-9987 E2C7
-9988 C0A1
-9989 F0A0
-998A E2C8
-998B B2F6
-998C F140
-998D E2C9
-998E F141
-998F C1F3
-9990 E2CA
-9991 E2CB
-9992 C2F8
-9993 E2CC
-9994 E2CD
-9995 E2CE
-9996 CAD7
-9997 D8B8
-9998 D9E5
-9999 CFE3
-999A F142
-999B F143
-999C F144
-999D F145
-999E F146
-999F F147
-99A0 F148
-99A1 F149
-99A2 F14A
-99A3 F14B
-99A4 F14C
-99A5 F0A5
-99A6 F14D
-99A7 F14E
-99A8 DCB0
-99A9 F14F
-99AA F150
-99AB F151
-99AC F152
-99AD F153
-99AE F154
-99AF F155
-99B0 F156
-99B1 F157
-99B2 F158
-99B3 F159
-99B4 F15A
-99B5 F15B
-99B6 F15C
-99B7 F15D
-99B8 F15E
-99B9 F15F
-99BA F160
-99BB F161
-99BC F162
-99BD F163
-99BE F164
-99BF F165
-99C0 F166
-99C1 F167
-99C2 F168
-99C3 F169
-99C4 F16A
-99C5 F16B
-99C6 F16C
-99C7 F16D
-99C8 F16E
-99C9 F16F
-99CA F170
-99CB F171
-99CC F172
-99CD F173
-99CE F174
-99CF F175
-99D0 F176
-99D1 F177
-99D2 F178
-99D3 F179
-99D4 F17A
-99D5 F17B
-99D6 F17C
-99D7 F17D
-99D8 F17E
-99D9 F180
-99DA F181
-99DB F182
-99DC F183
-99DD F184
-99DE F185
-99DF F186
-99E0 F187
-99E1 F188
-99E2 F189
-99E3 F18A
-99E4 F18B
-99E5 F18C
-99E6 F18D
-99E7 F18E
-99E8 F18F
-99E9 F190
-99EA F191
-99EB F192
-99EC F193
-99ED F194
-99EE F195
-99EF F196
-99F0 F197
-99F1 F198
-99F2 F199
-99F3 F19A
-99F4 F19B
-99F5 F19C
-99F6 F19D
-99F7 F19E
-99F8 F19F
-99F9 F1A0
-99FA F240
-99FB F241
-99FC F242
-99FD F243
-99FE F244
-99FF F245
-9A00 F246
-9A01 F247
-9A02 F248
-9A03 F249
-9A04 F24A
-9A05 F24B
-9A06 F24C
-9A07 F24D
-9A08 F24E
-9A09 F24F
-9A0A F250
-9A0B F251
-9A0C F252
-9A0D F253
-9A0E F254
-9A0F F255
-9A10 F256
-9A11 F257
-9A12 F258
-9A13 F259
-9A14 F25A
-9A15 F25B
-9A16 F25C
-9A17 F25D
-9A18 F25E
-9A19 F25F
-9A1A F260
-9A1B F261
-9A1C F262
-9A1D F263
-9A1E F264
-9A1F F265
-9A20 F266
-9A21 F267
-9A22 F268
-9A23 F269
-9A24 F26A
-9A25 F26B
-9A26 F26C
-9A27 F26D
-9A28 F26E
-9A29 F26F
-9A2A F270
-9A2B F271
-9A2C F272
-9A2D F273
-9A2E F274
-9A2F F275
-9A30 F276
-9A31 F277
-9A32 F278
-9A33 F279
-9A34 F27A
-9A35 F27B
-9A36 F27C
-9A37 F27D
-9A38 F27E
-9A39 F280
-9A3A F281
-9A3B F282
-9A3C F283
-9A3D F284
-9A3E F285
-9A3F F286
-9A40 F287
-9A41 F288
-9A42 F289
-9A43 F28A
-9A44 F28B
-9A45 F28C
-9A46 F28D
-9A47 F28E
-9A48 F28F
-9A49 F290
-9A4A F291
-9A4B F292
-9A4C F293
-9A4D F294
-9A4E F295
-9A4F F296
-9A50 F297
-9A51 F298
-9A52 F299
-9A53 F29A
-9A54 F29B
-9A55 F29C
-9A56 F29D
-9A57 F29E
-9A58 F29F
-9A59 F2A0
-9A5A F340
-9A5B F341
-9A5C F342
-9A5D F343
-9A5E F344
-9A5F F345
-9A60 F346
-9A61 F347
-9A62 F348
-9A63 F349
-9A64 F34A
-9A65 F34B
-9A66 F34C
-9A67 F34D
-9A68 F34E
-9A69 F34F
-9A6A F350
-9A6B F351
-9A6C C2ED
-9A6D D4A6
-9A6E CDD4
-9A6F D1B1
-9A70 B3DB
-9A71 C7FD
-9A72 F352
-9A73 B2B5
-9A74 C2BF
-9A75 E6E0
-9A76 CABB
-9A77 E6E1
-9A78 E6E2
-9A79 BED4
-9A7A E6E3
-9A7B D7A4
-9A7C CDD5
-9A7D E6E5
-9A7E BCDD
-9A7F E6E4
-9A80 E6E6
-9A81 E6E7
-9A82 C2EE
-9A83 F353
-9A84 BDBE
-9A85 E6E8
-9A86 C2E6
-9A87 BAA7
-9A88 E6E9
-9A89 F354
-9A8A E6EA
-9A8B B3D2
-9A8C D1E9
-9A8D F355
-9A8E F356
-9A8F BFA5
-9A90 E6EB
-9A91 C6EF
-9A92 E6EC
-9A93 E6ED
-9A94 F357
-9A95 F358
-9A96 E6EE
-9A97 C6AD
-9A98 E6EF
-9A99 F359
-9A9A C9A7
-9A9B E6F0
-9A9C E6F1
-9A9D E6F2
-9A9E E5B9
-9A9F E6F3
-9AA0 E6F4
-9AA1 C2E2
-9AA2 E6F5
-9AA3 E6F6
-9AA4 D6E8
-9AA5 E6F7
-9AA6 F35A
-9AA7 E6F8
-9AA8 B9C7
-9AA9 F35B
-9AAA F35C
-9AAB F35D
-9AAC F35E
-9AAD F35F
-9AAE F360
-9AAF F361
-9AB0 F7BB
-9AB1 F7BA
-9AB2 F362
-9AB3 F363
-9AB4 F364
-9AB5 F365
-9AB6 F7BE
-9AB7 F7BC
-9AB8 BAA1
-9AB9 F366
-9ABA F7BF
-9ABB F367
-9ABC F7C0
-9ABD F368
-9ABE F369
-9ABF F36A
-9AC0 F7C2
-9AC1 F7C1
-9AC2 F7C4
-9AC3 F36B
-9AC4 F36C
-9AC5 F7C3
-9AC6 F36D
-9AC7 F36E
-9AC8 F36F
-9AC9 F370
-9ACA F371
-9ACB F7C5
-9ACC F7C6
-9ACD F372
-9ACE F373
-9ACF F374
-9AD0 F375
-9AD1 F7C7
-9AD2 F376
-9AD3 CBE8
-9AD4 F377
-9AD5 F378
-9AD6 F379
-9AD7 F37A
-9AD8 B8DF
-9AD9 F37B
-9ADA F37C
-9ADB F37D
-9ADC F37E
-9ADD F380
-9ADE F381
-9ADF F7D4
-9AE0 F382
-9AE1 F7D5
-9AE2 F383
-9AE3 F384
-9AE4 F385
-9AE5 F386
-9AE6 F7D6
-9AE7 F387
-9AE8 F388
-9AE9 F389
-9AEA F38A
-9AEB F7D8
-9AEC F38B
-9AED F7DA
-9AEE F38C
-9AEF F7D7
-9AF0 F38D
-9AF1 F38E
-9AF2 F38F
-9AF3 F390
-9AF4 F391
-9AF5 F392
-9AF6 F393
-9AF7 F394
-9AF8 F395
-9AF9 F7DB
-9AFA F396
-9AFB F7D9
-9AFC F397
-9AFD F398
-9AFE F399
-9AFF F39A
-9B00 F39B
-9B01 F39C
-9B02 F39D
-9B03 D7D7
-9B04 F39E
-9B05 F39F
-9B06 F3A0
-9B07 F440
-9B08 F7DC
-9B09 F441
-9B0A F442
-9B0B F443
-9B0C F444
-9B0D F445
-9B0E F446
-9B0F F7DD
-9B10 F447
-9B11 F448
-9B12 F449
-9B13 F7DE
-9B14 F44A
-9B15 F44B
-9B16 F44C
-9B17 F44D
-9B18 F44E
-9B19 F44F
-9B1A F450
-9B1B F451
-9B1C F452
-9B1D F453
-9B1E F454
-9B1F F7DF
-9B20 F455
-9B21 F456
-9B22 F457
-9B23 F7E0
-9B24 F458
-9B25 F459
-9B26 F45A
-9B27 F45B
-9B28 F45C
-9B29 F45D
-9B2A F45E
-9B2B F45F
-9B2C F460
-9B2D F461
-9B2E F462
-9B2F DBCB
-9B30 F463
-9B31 F464
-9B32 D8AA
-9B33 F465
-9B34 F466
-9B35 F467
-9B36 F468
-9B37 F469
-9B38 F46A
-9B39 F46B
-9B3A F46C
-9B3B E5F7
-9B3C B9ED
-9B3D F46D
-9B3E F46E
-9B3F F46F
-9B40 F470
-9B41 BFFD
-9B42 BBEA
-9B43 F7C9
-9B44 C6C7
-9B45 F7C8
-9B46 F471
-9B47 F7CA
-9B48 F7CC
-9B49 F7CB
-9B4A F472
-9B4B F473
-9B4C F474
-9B4D F7CD
-9B4E F475
-9B4F CEBA
-9B50 F476
-9B51 F7CE
-9B52 F477
-9B53 F478
-9B54 C4A7
-9B55 F479
-9B56 F47A
-9B57 F47B
-9B58 F47C
-9B59 F47D
-9B5A F47E
-9B5B F480
-9B5C F481
-9B5D F482
-9B5E F483
-9B5F F484
-9B60 F485
-9B61 F486
-9B62 F487
-9B63 F488
-9B64 F489
-9B65 F48A
-9B66 F48B
-9B67 F48C
-9B68 F48D
-9B69 F48E
-9B6A F48F
-9B6B F490
-9B6C F491
-9B6D F492
-9B6E F493
-9B6F F494
-9B70 F495
-9B71 F496
-9B72 F497
-9B73 F498
-9B74 F499
-9B75 F49A
-9B76 F49B
-9B77 F49C
-9B78 F49D
-9B79 F49E
-9B7A F49F
-9B7B F4A0
-9B7C F540
-9B7D F541
-9B7E F542
-9B7F F543
-9B80 F544
-9B81 F545
-9B82 F546
-9B83 F547
-9B84 F548
-9B85 F549
-9B86 F54A
-9B87 F54B
-9B88 F54C
-9B89 F54D
-9B8A F54E
-9B8B F54F
-9B8C F550
-9B8D F551
-9B8E F552
-9B8F F553
-9B90 F554
-9B91 F555
-9B92 F556
-9B93 F557
-9B94 F558
-9B95 F559
-9B96 F55A
-9B97 F55B
-9B98 F55C
-9B99 F55D
-9B9A F55E
-9B9B F55F
-9B9C F560
-9B9D F561
-9B9E F562
-9B9F F563
-9BA0 F564
-9BA1 F565
-9BA2 F566
-9BA3 F567
-9BA4 F568
-9BA5 F569
-9BA6 F56A
-9BA7 F56B
-9BA8 F56C
-9BA9 F56D
-9BAA F56E
-9BAB F56F
-9BAC F570
-9BAD F571
-9BAE F572
-9BAF F573
-9BB0 F574
-9BB1 F575
-9BB2 F576
-9BB3 F577
-9BB4 F578
-9BB5 F579
-9BB6 F57A
-9BB7 F57B
-9BB8 F57C
-9BB9 F57D
-9BBA F57E
-9BBB F580
-9BBC F581
-9BBD F582
-9BBE F583
-9BBF F584
-9BC0 F585
-9BC1 F586
-9BC2 F587
-9BC3 F588
-9BC4 F589
-9BC5 F58A
-9BC6 F58B
-9BC7 F58C
-9BC8 F58D
-9BC9 F58E
-9BCA F58F
-9BCB F590
-9BCC F591
-9BCD F592
-9BCE F593
-9BCF F594
-9BD0 F595
-9BD1 F596
-9BD2 F597
-9BD3 F598
-9BD4 F599
-9BD5 F59A
-9BD6 F59B
-9BD7 F59C
-9BD8 F59D
-9BD9 F59E
-9BDA F59F
-9BDB F5A0
-9BDC F640
-9BDD F641
-9BDE F642
-9BDF F643
-9BE0 F644
-9BE1 F645
-9BE2 F646
-9BE3 F647
-9BE4 F648
-9BE5 F649
-9BE6 F64A
-9BE7 F64B
-9BE8 F64C
-9BE9 F64D
-9BEA F64E
-9BEB F64F
-9BEC F650
-9BED F651
-9BEE F652
-9BEF F653
-9BF0 F654
-9BF1 F655
-9BF2 F656
-9BF3 F657
-9BF4 F658
-9BF5 F659
-9BF6 F65A
-9BF7 F65B
-9BF8 F65C
-9BF9 F65D
-9BFA F65E
-9BFB F65F
-9BFC F660
-9BFD F661
-9BFE F662
-9BFF F663
-9C00 F664
-9C01 F665
-9C02 F666
-9C03 F667
-9C04 F668
-9C05 F669
-9C06 F66A
-9C07 F66B
-9C08 F66C
-9C09 F66D
-9C0A F66E
-9C0B F66F
-9C0C F670
-9C0D F671
-9C0E F672
-9C0F F673
-9C10 F674
-9C11 F675
-9C12 F676
-9C13 F677
-9C14 F678
-9C15 F679
-9C16 F67A
-9C17 F67B
-9C18 F67C
-9C19 F67D
-9C1A F67E
-9C1B F680
-9C1C F681
-9C1D F682
-9C1E F683
-9C1F F684
-9C20 F685
-9C21 F686
-9C22 F687
-9C23 F688
-9C24 F689
-9C25 F68A
-9C26 F68B
-9C27 F68C
-9C28 F68D
-9C29 F68E
-9C2A F68F
-9C2B F690
-9C2C F691
-9C2D F692
-9C2E F693
-9C2F F694
-9C30 F695
-9C31 F696
-9C32 F697
-9C33 F698
-9C34 F699
-9C35 F69A
-9C36 F69B
-9C37 F69C
-9C38 F69D
-9C39 F69E
-9C3A F69F
-9C3B F6A0
-9C3C F740
-9C3D F741
-9C3E F742
-9C3F F743
-9C40 F744
-9C41 F745
-9C42 F746
-9C43 F747
-9C44 F748
-9C45 F749
-9C46 F74A
-9C47 F74B
-9C48 F74C
-9C49 F74D
-9C4A F74E
-9C4B F74F
-9C4C F750
-9C4D F751
-9C4E F752
-9C4F F753
-9C50 F754
-9C51 F755
-9C52 F756
-9C53 F757
-9C54 F758
-9C55 F759
-9C56 F75A
-9C57 F75B
-9C58 F75C
-9C59 F75D
-9C5A F75E
-9C5B F75F
-9C5C F760
-9C5D F761
-9C5E F762
-9C5F F763
-9C60 F764
-9C61 F765
-9C62 F766
-9C63 F767
-9C64 F768
-9C65 F769
-9C66 F76A
-9C67 F76B
-9C68 F76C
-9C69 F76D
-9C6A F76E
-9C6B F76F
-9C6C F770
-9C6D F771
-9C6E F772
-9C6F F773
-9C70 F774
-9C71 F775
-9C72 F776
-9C73 F777
-9C74 F778
-9C75 F779
-9C76 F77A
-9C77 F77B
-9C78 F77C
-9C79 F77D
-9C7A F77E
-9C7B F780
-9C7C D3E3
-9C7D F781
-9C7E F782
-9C7F F6CF
-9C80 F783
-9C81 C2B3
-9C82 F6D0
-9C83 F784
-9C84 F785
-9C85 F6D1
-9C86 F6D2
-9C87 F6D3
-9C88 F6D4
-9C89 F786
-9C8A F787
-9C8B F6D6
-9C8C F788
-9C8D B1AB
-9C8E F6D7
-9C8F F789
-9C90 F6D8
-9C91 F6D9
-9C92 F6DA
-9C93 F78A
-9C94 F6DB
-9C95 F6DC
-9C96 F78B
-9C97 F78C
-9C98 F78D
-9C99 F78E
-9C9A F6DD
-9C9B F6DE
-9C9C CFCA
-9C9D F78F
-9C9E F6DF
-9C9F F6E0
-9CA0 F6E1
-9CA1 F6E2
-9CA2 F6E3
-9CA3 F6E4
-9CA4 C0F0
-9CA5 F6E5
-9CA6 F6E6
-9CA7 F6E7
-9CA8 F6E8
-9CA9 F6E9
-9CAA F790
-9CAB F6EA
-9CAC F791
-9CAD F6EB
-9CAE F6EC
-9CAF F792
-9CB0 F6ED
-9CB1 F6EE
-9CB2 F6EF
-9CB3 F6F0
-9CB4 F6F1
-9CB5 F6F2
-9CB6 F6F3
-9CB7 F6F4
-9CB8 BEA8
-9CB9 F793
-9CBA F6F5
-9CBB F6F6
-9CBC F6F7
-9CBD F6F8
-9CBE F794
-9CBF F795
-9CC0 F796
-9CC1 F797
-9CC2 F798
-9CC3 C8FA
-9CC4 F6F9
-9CC5 F6FA
-9CC6 F6FB
-9CC7 F6FC
-9CC8 F799
-9CC9 F79A
-9CCA F6FD
-9CCB F6FE
-9CCC F7A1
-9CCD F7A2
-9CCE F7A3
-9CCF F7A4
-9CD0 F7A5
-9CD1 F79B
-9CD2 F79C
-9CD3 F7A6
-9CD4 F7A7
-9CD5 F7A8
-9CD6 B1EE
-9CD7 F7A9
-9CD8 F7AA
-9CD9 F7AB
-9CDA F79D
-9CDB F79E
-9CDC F7AC
-9CDD F7AD
-9CDE C1DB
-9CDF F7AE
-9CE0 F79F
-9CE1 F7A0
-9CE2 F7AF
-9CE3 F840
-9CE4 F841
-9CE5 F842
-9CE6 F843
-9CE7 F844
-9CE8 F845
-9CE9 F846
-9CEA F847
-9CEB F848
-9CEC F849
-9CED F84A
-9CEE F84B
-9CEF F84C
-9CF0 F84D
-9CF1 F84E
-9CF2 F84F
-9CF3 F850
-9CF4 F851
-9CF5 F852
-9CF6 F853
-9CF7 F854
-9CF8 F855
-9CF9 F856
-9CFA F857
-9CFB F858
-9CFC F859
-9CFD F85A
-9CFE F85B
-9CFF F85C
-9D00 F85D
-9D01 F85E
-9D02 F85F
-9D03 F860
-9D04 F861
-9D05 F862
-9D06 F863
-9D07 F864
-9D08 F865
-9D09 F866
-9D0A F867
-9D0B F868
-9D0C F869
-9D0D F86A
-9D0E F86B
-9D0F F86C
-9D10 F86D
-9D11 F86E
-9D12 F86F
-9D13 F870
-9D14 F871
-9D15 F872
-9D16 F873
-9D17 F874
-9D18 F875
-9D19 F876
-9D1A F877
-9D1B F878
-9D1C F879
-9D1D F87A
-9D1E F87B
-9D1F F87C
-9D20 F87D
-9D21 F87E
-9D22 F880
-9D23 F881
-9D24 F882
-9D25 F883
-9D26 F884
-9D27 F885
-9D28 F886
-9D29 F887
-9D2A F888
-9D2B F889
-9D2C F88A
-9D2D F88B
-9D2E F88C
-9D2F F88D
-9D30 F88E
-9D31 F88F
-9D32 F890
-9D33 F891
-9D34 F892
-9D35 F893
-9D36 F894
-9D37 F895
-9D38 F896
-9D39 F897
-9D3A F898
-9D3B F899
-9D3C F89A
-9D3D F89B
-9D3E F89C
-9D3F F89D
-9D40 F89E
-9D41 F89F
-9D42 F8A0
-9D43 F940
-9D44 F941
-9D45 F942
-9D46 F943
-9D47 F944
-9D48 F945
-9D49 F946
-9D4A F947
-9D4B F948
-9D4C F949
-9D4D F94A
-9D4E F94B
-9D4F F94C
-9D50 F94D
-9D51 F94E
-9D52 F94F
-9D53 F950
-9D54 F951
-9D55 F952
-9D56 F953
-9D57 F954
-9D58 F955
-9D59 F956
-9D5A F957
-9D5B F958
-9D5C F959
-9D5D F95A
-9D5E F95B
-9D5F F95C
-9D60 F95D
-9D61 F95E
-9D62 F95F
-9D63 F960
-9D64 F961
-9D65 F962
-9D66 F963
-9D67 F964
-9D68 F965
-9D69 F966
-9D6A F967
-9D6B F968
-9D6C F969
-9D6D F96A
-9D6E F96B
-9D6F F96C
-9D70 F96D
-9D71 F96E
-9D72 F96F
-9D73 F970
-9D74 F971
-9D75 F972
-9D76 F973
-9D77 F974
-9D78 F975
-9D79 F976
-9D7A F977
-9D7B F978
-9D7C F979
-9D7D F97A
-9D7E F97B
-9D7F F97C
-9D80 F97D
-9D81 F97E
-9D82 F980
-9D83 F981
-9D84 F982
-9D85 F983
-9D86 F984
-9D87 F985
-9D88 F986
-9D89 F987
-9D8A F988
-9D8B F989
-9D8C F98A
-9D8D F98B
-9D8E F98C
-9D8F F98D
-9D90 F98E
-9D91 F98F
-9D92 F990
-9D93 F991
-9D94 F992
-9D95 F993
-9D96 F994
-9D97 F995
-9D98 F996
-9D99 F997
-9D9A F998
-9D9B F999
-9D9C F99A
-9D9D F99B
-9D9E F99C
-9D9F F99D
-9DA0 F99E
-9DA1 F99F
-9DA2 F9A0
-9DA3 FA40
-9DA4 FA41
-9DA5 FA42
-9DA6 FA43
-9DA7 FA44
-9DA8 FA45
-9DA9 FA46
-9DAA FA47
-9DAB FA48
-9DAC FA49
-9DAD FA4A
-9DAE FA4B
-9DAF FA4C
-9DB0 FA4D
-9DB1 FA4E
-9DB2 FA4F
-9DB3 FA50
-9DB4 FA51
-9DB5 FA52
-9DB6 FA53
-9DB7 FA54
-9DB8 FA55
-9DB9 FA56
-9DBA FA57
-9DBB FA58
-9DBC FA59
-9DBD FA5A
-9DBE FA5B
-9DBF FA5C
-9DC0 FA5D
-9DC1 FA5E
-9DC2 FA5F
-9DC3 FA60
-9DC4 FA61
-9DC5 FA62
-9DC6 FA63
-9DC7 FA64
-9DC8 FA65
-9DC9 FA66
-9DCA FA67
-9DCB FA68
-9DCC FA69
-9DCD FA6A
-9DCE FA6B
-9DCF FA6C
-9DD0 FA6D
-9DD1 FA6E
-9DD2 FA6F
-9DD3 FA70
-9DD4 FA71
-9DD5 FA72
-9DD6 FA73
-9DD7 FA74
-9DD8 FA75
-9DD9 FA76
-9DDA FA77
-9DDB FA78
-9DDC FA79
-9DDD FA7A
-9DDE FA7B
-9DDF FA7C
-9DE0 FA7D
-9DE1 FA7E
-9DE2 FA80
-9DE3 FA81
-9DE4 FA82
-9DE5 FA83
-9DE6 FA84
-9DE7 FA85
-9DE8 FA86
-9DE9 FA87
-9DEA FA88
-9DEB FA89
-9DEC FA8A
-9DED FA8B
-9DEE FA8C
-9DEF FA8D
-9DF0 FA8E
-9DF1 FA8F
-9DF2 FA90
-9DF3 FA91
-9DF4 FA92
-9DF5 FA93
-9DF6 FA94
-9DF7 FA95
-9DF8 FA96
-9DF9 FA97
-9DFA FA98
-9DFB FA99
-9DFC FA9A
-9DFD FA9B
-9DFE FA9C
-9DFF FA9D
-9E00 FA9E
-9E01 FA9F
-9E02 FAA0
-9E03 FB40
-9E04 FB41
-9E05 FB42
-9E06 FB43
-9E07 FB44
-9E08 FB45
-9E09 FB46
-9E0A FB47
-9E0B FB48
-9E0C FB49
-9E0D FB4A
-9E0E FB4B
-9E0F FB4C
-9E10 FB4D
-9E11 FB4E
-9E12 FB4F
-9E13 FB50
-9E14 FB51
-9E15 FB52
-9E16 FB53
-9E17 FB54
-9E18 FB55
-9E19 FB56
-9E1A FB57
-9E1B FB58
-9E1C FB59
-9E1D FB5A
-9E1E FB5B
-9E1F C4F1
-9E20 F0AF
-9E21 BCA6
-9E22 F0B0
-9E23 C3F9
-9E24 FB5C
-9E25 C5B8
-9E26 D1BB
-9E27 FB5D
-9E28 F0B1
-9E29 F0B2
-9E2A F0B3
-9E2B F0B4
-9E2C F0B5
-9E2D D1BC
-9E2E FB5E
-9E2F D1EC
-9E30 FB5F
-9E31 F0B7
-9E32 F0B6
-9E33 D4A7
-9E34 FB60
-9E35 CDD2
-9E36 F0B8
-9E37 F0BA
-9E38 F0B9
-9E39 F0BB
-9E3A F0BC
-9E3B FB61
-9E3C FB62
-9E3D B8EB
-9E3E F0BD
-9E3F BAE8
-9E40 FB63
-9E41 F0BE
-9E42 F0BF
-9E43 BEE9
-9E44 F0C0
-9E45 B6EC
-9E46 F0C1
-9E47 F0C2
-9E48 F0C3
-9E49 F0C4
-9E4A C8B5
-9E4B F0C5
-9E4C F0C6
-9E4D FB64
-9E4E F0C7
-9E4F C5F4
-9E50 FB65
-9E51 F0C8
-9E52 FB66
-9E53 FB67
-9E54 FB68
-9E55 F0C9
-9E56 FB69
-9E57 F0CA
-9E58 F7BD
-9E59 FB6A
-9E5A F0CB
-9E5B F0CC
-9E5C F0CD
-9E5D FB6B
-9E5E F0CE
-9E5F FB6C
-9E60 FB6D
-9E61 FB6E
-9E62 FB6F
-9E63 F0CF
-9E64 BAD7
-9E65 FB70
-9E66 F0D0
-9E67 F0D1
-9E68 F0D2
-9E69 F0D3
-9E6A F0D4
-9E6B F0D5
-9E6C F0D6
-9E6D F0D8
-9E6E FB71
-9E6F FB72
-9E70 D3A5
-9E71 F0D7
-9E72 FB73
-9E73 F0D9
-9E74 FB74
-9E75 FB75
-9E76 FB76
-9E77 FB77
-9E78 FB78
-9E79 FB79
-9E7A FB7A
-9E7B FB7B
-9E7C FB7C
-9E7D FB7D
-9E7E F5BA
-9E7F C2B9
-9E80 FB7E
-9E81 FB80
-9E82 F7E4
-9E83 FB81
-9E84 FB82
-9E85 FB83
-9E86 FB84
-9E87 F7E5
-9E88 F7E6
-9E89 FB85
-9E8A FB86
-9E8B F7E7
-9E8C FB87
-9E8D FB88
-9E8E FB89
-9E8F FB8A
-9E90 FB8B
-9E91 FB8C
-9E92 F7E8
-9E93 C2B4
-9E94 FB8D
-9E95 FB8E
-9E96 FB8F
-9E97 FB90
-9E98 FB91
-9E99 FB92
-9E9A FB93
-9E9B FB94
-9E9C FB95
-9E9D F7EA
-9E9E FB96
-9E9F F7EB
-9EA0 FB97
-9EA1 FB98
-9EA2 FB99
-9EA3 FB9A
-9EA4 FB9B
-9EA5 FB9C
-9EA6 C2F3
-9EA7 FB9D
-9EA8 FB9E
-9EA9 FB9F
-9EAA FBA0
-9EAB FC40
-9EAC FC41
-9EAD FC42
-9EAE FC43
-9EAF FC44
-9EB0 FC45
-9EB1 FC46
-9EB2 FC47
-9EB3 FC48
-9EB4 F4F0
-9EB5 FC49
-9EB6 FC4A
-9EB7 FC4B
-9EB8 F4EF
-9EB9 FC4C
-9EBA FC4D
-9EBB C2E9
-9EBC FC4E
-9EBD F7E1
-9EBE F7E2
-9EBF FC4F
-9EC0 FC50
-9EC1 FC51
-9EC2 FC52
-9EC3 FC53
-9EC4 BBC6
-9EC5 FC54
-9EC6 FC55
-9EC7 FC56
-9EC8 FC57
-9EC9 D9E4
-9ECA FC58
-9ECB FC59
-9ECC FC5A
-9ECD CAF2
-9ECE C0E8
-9ECF F0A4
-9ED0 FC5B
-9ED1 BADA
-9ED2 FC5C
-9ED3 FC5D
-9ED4 C7AD
-9ED5 FC5E
-9ED6 FC5F
-9ED7 FC60
-9ED8 C4AC
-9ED9 FC61
-9EDA FC62
-9EDB F7EC
-9EDC F7ED
-9EDD F7EE
-9EDE FC63
-9EDF F7F0
-9EE0 F7EF
-9EE1 FC64
-9EE2 F7F1
-9EE3 FC65
-9EE4 FC66
-9EE5 F7F4
-9EE6 FC67
-9EE7 F7F3
-9EE8 FC68
-9EE9 F7F2
-9EEA F7F5
-9EEB FC69
-9EEC FC6A
-9EED FC6B
-9EEE FC6C
-9EEF F7F6
-9EF0 FC6D
-9EF1 FC6E
-9EF2 FC6F
-9EF3 FC70
-9EF4 FC71
-9EF5 FC72
-9EF6 FC73
-9EF7 FC74
-9EF8 FC75
-9EF9 EDE9
-9EFA FC76
-9EFB EDEA
-9EFC EDEB
-9EFD FC77
-9EFE F6BC
-9EFF FC78
-9F00 FC79
-9F01 FC7A
-9F02 FC7B
-9F03 FC7C
-9F04 FC7D
-9F05 FC7E
-9F06 FC80
-9F07 FC81
-9F08 FC82
-9F09 FC83
-9F0A FC84
-9F0B F6BD
-9F0C FC85
-9F0D F6BE
-9F0E B6A6
-9F0F FC86
-9F10 D8BE
-9F11 FC87
-9F12 FC88
-9F13 B9C4
-9F14 FC89
-9F15 FC8A
-9F16 FC8B
-9F17 D8BB
-9F18 FC8C
-9F19 DCB1
-9F1A FC8D
-9F1B FC8E
-9F1C FC8F
-9F1D FC90
-9F1E FC91
-9F1F FC92
-9F20 CAF3
-9F21 FC93
-9F22 F7F7
-9F23 FC94
-9F24 FC95
-9F25 FC96
-9F26 FC97
-9F27 FC98
-9F28 FC99
-9F29 FC9A
-9F2A FC9B
-9F2B FC9C
-9F2C F7F8
-9F2D FC9D
-9F2E FC9E
-9F2F F7F9
-9F30 FC9F
-9F31 FCA0
-9F32 FD40
-9F33 FD41
-9F34 FD42
-9F35 FD43
-9F36 FD44
-9F37 F7FB
-9F38 FD45
-9F39 F7FA
-9F3A FD46
-9F3B B1C7
-9F3C FD47
-9F3D F7FC
-9F3E F7FD
-9F3F FD48
-9F40 FD49
-9F41 FD4A
-9F42 FD4B
-9F43 FD4C
-9F44 F7FE
-9F45 FD4D
-9F46 FD4E
-9F47 FD4F
-9F48 FD50
-9F49 FD51
-9F4A FD52
-9F4B FD53
-9F4C FD54
-9F4D FD55
-9F4E FD56
-9F4F FD57
-9F50 C6EB
-9F51 ECB4
-9F52 FD58
-9F53 FD59
-9F54 FD5A
-9F55 FD5B
-9F56 FD5C
-9F57 FD5D
-9F58 FD5E
-9F59 FD5F
-9F5A FD60
-9F5B FD61
-9F5C FD62
-9F5D FD63
-9F5E FD64
-9F5F FD65
-9F60 FD66
-9F61 FD67
-9F62 FD68
-9F63 FD69
-9F64 FD6A
-9F65 FD6B
-9F66 FD6C
-9F67 FD6D
-9F68 FD6E
-9F69 FD6F
-9F6A FD70
-9F6B FD71
-9F6C FD72
-9F6D FD73
-9F6E FD74
-9F6F FD75
-9F70 FD76
-9F71 FD77
-9F72 FD78
-9F73 FD79
-9F74 FD7A
-9F75 FD7B
-9F76 FD7C
-9F77 FD7D
-9F78 FD7E
-9F79 FD80
-9F7A FD81
-9F7B FD82
-9F7C FD83
-9F7D FD84
-9F7E FD85
-9F7F B3DD
-9F80 F6B3
-9F81 FD86
-9F82 FD87
-9F83 F6B4
-9F84 C1E4
-9F85 F6B5
-9F86 F6B6
-9F87 F6B7
-9F88 F6B8
-9F89 F6B9
-9F8A F6BA
-9F8B C8A3
-9F8C F6BB
-9F8D FD88
-9F8E FD89
-9F8F FD8A
-9F90 FD8B
-9F91 FD8C
-9F92 FD8D
-9F93 FD8E
-9F94 FD8F
-9F95 FD90
-9F96 FD91
-9F97 FD92
-9F98 FD93
-9F99 C1FA
-9F9A B9A8
-9F9B EDE8
-9F9C FD94
-9F9D FD95
-9F9E FD96
-9F9F B9EA
-9FA0 D9DF
-9FA1 FD97
-9FA2 FD98
-9FA3 FD99
-9FA4 FD9A
-9FA5 FD9B
-9FA6 82358F33
-9FA7 82358F34
-9FA8 82358F35
-9FA9 82358F36
-9FAA 82358F37
-9FAB 82358F38
-9FAC 82358F39
-9FAD 82359030
-9FAE 82359031
-9FAF 82359032
-9FB0 82359033
-9FB1 82359034
-9FB2 82359035
-9FB3 82359036
-9FB4 82359037
-9FB5 82359038
-9FB6 82359039
-9FB7 82359130
-9FB8 82359131
-9FB9 82359132
-9FBA 82359133
-9FBB 82359134
-9FBC 82359135
-9FBD 82359136
-9FBE 82359137
-9FBF 82359138
-9FC0 82359139
-9FC1 82359230
-9FC2 82359231
-9FC3 82359232
-9FC4 82359233
-9FC5 82359234
-9FC6 82359235
-9FC7 82359236
-9FC8 82359237
-9FC9 82359238
-9FCA 82359239
-9FCB 82359330
-9FCC 82359331
-9FCD 82359332
-9FCE 82359333
-9FCF 82359334
-9FD0 82359335
-9FD1 82359336
-9FD2 82359337
-9FD3 82359338
-9FD4 82359339
-9FD5 82359430
-9FD6 82359431
-9FD7 82359432
-9FD8 82359433
-9FD9 82359434
-9FDA 82359435
-9FDB 82359436
-9FDC 82359437
-9FDD 82359438
-9FDE 82359439
-9FDF 82359530
-9FE0 82359531
-9FE1 82359532
-9FE2 82359533
-9FE3 82359534
-9FE4 82359535
-9FE5 82359536
-9FE6 82359537
-9FE7 82359538
-9FE8 82359539
-9FE9 82359630
-9FEA 82359631
-9FEB 82359632
-9FEC 82359633
-9FED 82359634
-9FEE 82359635
-9FEF 82359636
-9FF0 82359637
-9FF1 82359638
-9FF2 82359639
-9FF3 82359730
-9FF4 82359731
-9FF5 82359732
-9FF6 82359733
-9FF7 82359734
-9FF8 82359735
-9FF9 82359736
-9FFA 82359737
-9FFB 82359738
-9FFC 82359739
-9FFD 82359830
-9FFE 82359831
-9FFF 82359832
-A000 82359833
-A001 82359834
-A002 82359835
-A003 82359836
-A004 82359837
-A005 82359838
-A006 82359839
-A007 82359930
-A008 82359931
-A009 82359932
-A00A 82359933
-A00B 82359934
-A00C 82359935
-A00D 82359936
-A00E 82359937
-A00F 82359938
-A010 82359939
-A011 82359A30
-A012 82359A31
-A013 82359A32
-A014 82359A33
-A015 82359A34
-A016 82359A35
-A017 82359A36
-A018 82359A37
-A019 82359A38
-A01A 82359A39
-A01B 82359B30
-A01C 82359B31
-A01D 82359B32
-A01E 82359B33
-A01F 82359B34
-A020 82359B35
-A021 82359B36
-A022 82359B37
-A023 82359B38
-A024 82359B39
-A025 82359C30
-A026 82359C31
-A027 82359C32
-A028 82359C33
-A029 82359C34
-A02A 82359C35
-A02B 82359C36
-A02C 82359C37
-A02D 82359C38
-A02E 82359C39
-A02F 82359D30
-A030 82359D31
-A031 82359D32
-A032 82359D33
-A033 82359D34
-A034 82359D35
-A035 82359D36
-A036 82359D37
-A037 82359D38
-A038 82359D39
-A039 82359E30
-A03A 82359E31
-A03B 82359E32
-A03C 82359E33
-A03D 82359E34
-A03E 82359E35
-A03F 82359E36
-A040 82359E37
-A041 82359E38
-A042 82359E39
-A043 82359F30
-A044 82359F31
-A045 82359F32
-A046 82359F33
-A047 82359F34
-A048 82359F35
-A049 82359F36
-A04A 82359F37
-A04B 82359F38
-A04C 82359F39
-A04D 8235A030
-A04E 8235A031
-A04F 8235A032
-A050 8235A033
-A051 8235A034
-A052 8235A035
-A053 8235A036
-A054 8235A037
-A055 8235A038
-A056 8235A039
-A057 8235A130
-A058 8235A131
-A059 8235A132
-A05A 8235A133
-A05B 8235A134
-A05C 8235A135
-A05D 8235A136
-A05E 8235A137
-A05F 8235A138
-A060 8235A139
-A061 8235A230
-A062 8235A231
-A063 8235A232
-A064 8235A233
-A065 8235A234
-A066 8235A235
-A067 8235A236
-A068 8235A237
-A069 8235A238
-A06A 8235A239
-A06B 8235A330
-A06C 8235A331
-A06D 8235A332
-A06E 8235A333
-A06F 8235A334
-A070 8235A335
-A071 8235A336
-A072 8235A337
-A073 8235A338
-A074 8235A339
-A075 8235A430
-A076 8235A431
-A077 8235A432
-A078 8235A433
-A079 8235A434
-A07A 8235A435
-A07B 8235A436
-A07C 8235A437
-A07D 8235A438
-A07E 8235A439
-A07F 8235A530
-A080 8235A531
-A081 8235A532
-A082 8235A533
-A083 8235A534
-A084 8235A535
-A085 8235A536
-A086 8235A537
-A087 8235A538
-A088 8235A539
-A089 8235A630
-A08A 8235A631
-A08B 8235A632
-A08C 8235A633
-A08D 8235A634
-A08E 8235A635
-A08F 8235A636
-A090 8235A637
-A091 8235A638
-A092 8235A639
-A093 8235A730
-A094 8235A731
-A095 8235A732
-A096 8235A733
-A097 8235A734
-A098 8235A735
-A099 8235A736
-A09A 8235A737
-A09B 8235A738
-A09C 8235A739
-A09D 8235A830
-A09E 8235A831
-A09F 8235A832
-A0A0 8235A833
-A0A1 8235A834
-A0A2 8235A835
-A0A3 8235A836
-A0A4 8235A837
-A0A5 8235A838
-A0A6 8235A839
-A0A7 8235A930
-A0A8 8235A931
-A0A9 8235A932
-A0AA 8235A933
-A0AB 8235A934
-A0AC 8235A935
-A0AD 8235A936
-A0AE 8235A937
-A0AF 8235A938
-A0B0 8235A939
-A0B1 8235AA30
-A0B2 8235AA31
-A0B3 8235AA32
-A0B4 8235AA33
-A0B5 8235AA34
-A0B6 8235AA35
-A0B7 8235AA36
-A0B8 8235AA37
-A0B9 8235AA38
-A0BA 8235AA39
-A0BB 8235AB30
-A0BC 8235AB31
-A0BD 8235AB32
-A0BE 8235AB33
-A0BF 8235AB34
-A0C0 8235AB35
-A0C1 8235AB36
-A0C2 8235AB37
-A0C3 8235AB38
-A0C4 8235AB39
-A0C5 8235AC30
-A0C6 8235AC31
-A0C7 8235AC32
-A0C8 8235AC33
-A0C9 8235AC34
-A0CA 8235AC35
-A0CB 8235AC36
-A0CC 8235AC37
-A0CD 8235AC38
-A0CE 8235AC39
-A0CF 8235AD30
-A0D0 8235AD31
-A0D1 8235AD32
-A0D2 8235AD33
-A0D3 8235AD34
-A0D4 8235AD35
-A0D5 8235AD36
-A0D6 8235AD37
-A0D7 8235AD38
-A0D8 8235AD39
-A0D9 8235AE30
-A0DA 8235AE31
-A0DB 8235AE32
-A0DC 8235AE33
-A0DD 8235AE34
-A0DE 8235AE35
-A0DF 8235AE36
-A0E0 8235AE37
-A0E1 8235AE38
-A0E2 8235AE39
-A0E3 8235AF30
-A0E4 8235AF31
-A0E5 8235AF32
-A0E6 8235AF33
-A0E7 8235AF34
-A0E8 8235AF35
-A0E9 8235AF36
-A0EA 8235AF37
-A0EB 8235AF38
-A0EC 8235AF39
-A0ED 8235B030
-A0EE 8235B031
-A0EF 8235B032
-A0F0 8235B033
-A0F1 8235B034
-A0F2 8235B035
-A0F3 8235B036
-A0F4 8235B037
-A0F5 8235B038
-A0F6 8235B039
-A0F7 8235B130
-A0F8 8235B131
-A0F9 8235B132
-A0FA 8235B133
-A0FB 8235B134
-A0FC 8235B135
-A0FD 8235B136
-A0FE 8235B137
-A0FF 8235B138
-A100 8235B139
-A101 8235B230
-A102 8235B231
-A103 8235B232
-A104 8235B233
-A105 8235B234
-A106 8235B235
-A107 8235B236
-A108 8235B237
-A109 8235B238
-A10A 8235B239
-A10B 8235B330
-A10C 8235B331
-A10D 8235B332
-A10E 8235B333
-A10F 8235B334
-A110 8235B335
-A111 8235B336
-A112 8235B337
-A113 8235B338
-A114 8235B339
-A115 8235B430
-A116 8235B431
-A117 8235B432
-A118 8235B433
-A119 8235B434
-A11A 8235B435
-A11B 8235B436
-A11C 8235B437
-A11D 8235B438
-A11E 8235B439
-A11F 8235B530
-A120 8235B531
-A121 8235B532
-A122 8235B533
-A123 8235B534
-A124 8235B535
-A125 8235B536
-A126 8235B537
-A127 8235B538
-A128 8235B539
-A129 8235B630
-A12A 8235B631
-A12B 8235B632
-A12C 8235B633
-A12D 8235B634
-A12E 8235B635
-A12F 8235B636
-A130 8235B637
-A131 8235B638
-A132 8235B639
-A133 8235B730
-A134 8235B731
-A135 8235B732
-A136 8235B733
-A137 8235B734
-A138 8235B735
-A139 8235B736
-A13A 8235B737
-A13B 8235B738
-A13C 8235B739
-A13D 8235B830
-A13E 8235B831
-A13F 8235B832
-A140 8235B833
-A141 8235B834
-A142 8235B835
-A143 8235B836
-A144 8235B837
-A145 8235B838
-A146 8235B839
-A147 8235B930
-A148 8235B931
-A149 8235B932
-A14A 8235B933
-A14B 8235B934
-A14C 8235B935
-A14D 8235B936
-A14E 8235B937
-A14F 8235B938
-A150 8235B939
-A151 8235BA30
-A152 8235BA31
-A153 8235BA32
-A154 8235BA33
-A155 8235BA34
-A156 8235BA35
-A157 8235BA36
-A158 8235BA37
-A159 8235BA38
-A15A 8235BA39
-A15B 8235BB30
-A15C 8235BB31
-A15D 8235BB32
-A15E 8235BB33
-A15F 8235BB34
-A160 8235BB35
-A161 8235BB36
-A162 8235BB37
-A163 8235BB38
-A164 8235BB39
-A165 8235BC30
-A166 8235BC31
-A167 8235BC32
-A168 8235BC33
-A169 8235BC34
-A16A 8235BC35
-A16B 8235BC36
-A16C 8235BC37
-A16D 8235BC38
-A16E 8235BC39
-A16F 8235BD30
-A170 8235BD31
-A171 8235BD32
-A172 8235BD33
-A173 8235BD34
-A174 8235BD35
-A175 8235BD36
-A176 8235BD37
-A177 8235BD38
-A178 8235BD39
-A179 8235BE30
-A17A 8235BE31
-A17B 8235BE32
-A17C 8235BE33
-A17D 8235BE34
-A17E 8235BE35
-A17F 8235BE36
-A180 8235BE37
-A181 8235BE38
-A182 8235BE39
-A183 8235BF30
-A184 8235BF31
-A185 8235BF32
-A186 8235BF33
-A187 8235BF34
-A188 8235BF35
-A189 8235BF36
-A18A 8235BF37
-A18B 8235BF38
-A18C 8235BF39
-A18D 8235C030
-A18E 8235C031
-A18F 8235C032
-A190 8235C033
-A191 8235C034
-A192 8235C035
-A193 8235C036
-A194 8235C037
-A195 8235C038
-A196 8235C039
-A197 8235C130
-A198 8235C131
-A199 8235C132
-A19A 8235C133
-A19B 8235C134
-A19C 8235C135
-A19D 8235C136
-A19E 8235C137
-A19F 8235C138
-A1A0 8235C139
-A1A1 8235C230
-A1A2 8235C231
-A1A3 8235C232
-A1A4 8235C233
-A1A5 8235C234
-A1A6 8235C235
-A1A7 8235C236
-A1A8 8235C237
-A1A9 8235C238
-A1AA 8235C239
-A1AB 8235C330
-A1AC 8235C331
-A1AD 8235C332
-A1AE 8235C333
-A1AF 8235C334
-A1B0 8235C335
-A1B1 8235C336
-A1B2 8235C337
-A1B3 8235C338
-A1B4 8235C339
-A1B5 8235C430
-A1B6 8235C431
-A1B7 8235C432
-A1B8 8235C433
-A1B9 8235C434
-A1BA 8235C435
-A1BB 8235C436
-A1BC 8235C437
-A1BD 8235C438
-A1BE 8235C439
-A1BF 8235C530
-A1C0 8235C531
-A1C1 8235C532
-A1C2 8235C533
-A1C3 8235C534
-A1C4 8235C535
-A1C5 8235C536
-A1C6 8235C537
-A1C7 8235C538
-A1C8 8235C539
-A1C9 8235C630
-A1CA 8235C631
-A1CB 8235C632
-A1CC 8235C633
-A1CD 8235C634
-A1CE 8235C635
-A1CF 8235C636
-A1D0 8235C637
-A1D1 8235C638
-A1D2 8235C639
-A1D3 8235C730
-A1D4 8235C731
-A1D5 8235C732
-A1D6 8235C733
-A1D7 8235C734
-A1D8 8235C735
-A1D9 8235C736
-A1DA 8235C737
-A1DB 8235C738
-A1DC 8235C739
-A1DD 8235C830
-A1DE 8235C831
-A1DF 8235C832
-A1E0 8235C833
-A1E1 8235C834
-A1E2 8235C835
-A1E3 8235C836
-A1E4 8235C837
-A1E5 8235C838
-A1E6 8235C839
-A1E7 8235C930
-A1E8 8235C931
-A1E9 8235C932
-A1EA 8235C933
-A1EB 8235C934
-A1EC 8235C935
-A1ED 8235C936
-A1EE 8235C937
-A1EF 8235C938
-A1F0 8235C939
-A1F1 8235CA30
-A1F2 8235CA31
-A1F3 8235CA32
-A1F4 8235CA33
-A1F5 8235CA34
-A1F6 8235CA35
-A1F7 8235CA36
-A1F8 8235CA37
-A1F9 8235CA38
-A1FA 8235CA39
-A1FB 8235CB30
-A1FC 8235CB31
-A1FD 8235CB32
-A1FE 8235CB33
-A1FF 8235CB34
-A200 8235CB35
-A201 8235CB36
-A202 8235CB37
-A203 8235CB38
-A204 8235CB39
-A205 8235CC30
-A206 8235CC31
-A207 8235CC32
-A208 8235CC33
-A209 8235CC34
-A20A 8235CC35
-A20B 8235CC36
-A20C 8235CC37
-A20D 8235CC38
-A20E 8235CC39
-A20F 8235CD30
-A210 8235CD31
-A211 8235CD32
-A212 8235CD33
-A213 8235CD34
-A214 8235CD35
-A215 8235CD36
-A216 8235CD37
-A217 8235CD38
-A218 8235CD39
-A219 8235CE30
-A21A 8235CE31
-A21B 8235CE32
-A21C 8235CE33
-A21D 8235CE34
-A21E 8235CE35
-A21F 8235CE36
-A220 8235CE37
-A221 8235CE38
-A222 8235CE39
-A223 8235CF30
-A224 8235CF31
-A225 8235CF32
-A226 8235CF33
-A227 8235CF34
-A228 8235CF35
-A229 8235CF36
-A22A 8235CF37
-A22B 8235CF38
-A22C 8235CF39
-A22D 8235D030
-A22E 8235D031
-A22F 8235D032
-A230 8235D033
-A231 8235D034
-A232 8235D035
-A233 8235D036
-A234 8235D037
-A235 8235D038
-A236 8235D039
-A237 8235D130
-A238 8235D131
-A239 8235D132
-A23A 8235D133
-A23B 8235D134
-A23C 8235D135
-A23D 8235D136
-A23E 8235D137
-A23F 8235D138
-A240 8235D139
-A241 8235D230
-A242 8235D231
-A243 8235D232
-A244 8235D233
-A245 8235D234
-A246 8235D235
-A247 8235D236
-A248 8235D237
-A249 8235D238
-A24A 8235D239
-A24B 8235D330
-A24C 8235D331
-A24D 8235D332
-A24E 8235D333
-A24F 8235D334
-A250 8235D335
-A251 8235D336
-A252 8235D337
-A253 8235D338
-A254 8235D339
-A255 8235D430
-A256 8235D431
-A257 8235D432
-A258 8235D433
-A259 8235D434
-A25A 8235D435
-A25B 8235D436
-A25C 8235D437
-A25D 8235D438
-A25E 8235D439
-A25F 8235D530
-A260 8235D531
-A261 8235D532
-A262 8235D533
-A263 8235D534
-A264 8235D535
-A265 8235D536
-A266 8235D537
-A267 8235D538
-A268 8235D539
-A269 8235D630
-A26A 8235D631
-A26B 8235D632
-A26C 8235D633
-A26D 8235D634
-A26E 8235D635
-A26F 8235D636
-A270 8235D637
-A271 8235D638
-A272 8235D639
-A273 8235D730
-A274 8235D731
-A275 8235D732
-A276 8235D733
-A277 8235D734
-A278 8235D735
-A279 8235D736
-A27A 8235D737
-A27B 8235D738
-A27C 8235D739
-A27D 8235D830
-A27E 8235D831
-A27F 8235D832
-A280 8235D833
-A281 8235D834
-A282 8235D835
-A283 8235D836
-A284 8235D837
-A285 8235D838
-A286 8235D839
-A287 8235D930
-A288 8235D931
-A289 8235D932
-A28A 8235D933
-A28B 8235D934
-A28C 8235D935
-A28D 8235D936
-A28E 8235D937
-A28F 8235D938
-A290 8235D939
-A291 8235DA30
-A292 8235DA31
-A293 8235DA32
-A294 8235DA33
-A295 8235DA34
-A296 8235DA35
-A297 8235DA36
-A298 8235DA37
-A299 8235DA38
-A29A 8235DA39
-A29B 8235DB30
-A29C 8235DB31
-A29D 8235DB32
-A29E 8235DB33
-A29F 8235DB34
-A2A0 8235DB35
-A2A1 8235DB36
-A2A2 8235DB37
-A2A3 8235DB38
-A2A4 8235DB39
-A2A5 8235DC30
-A2A6 8235DC31
-A2A7 8235DC32
-A2A8 8235DC33
-A2A9 8235DC34
-A2AA 8235DC35
-A2AB 8235DC36
-A2AC 8235DC37
-A2AD 8235DC38
-A2AE 8235DC39
-A2AF 8235DD30
-A2B0 8235DD31
-A2B1 8235DD32
-A2B2 8235DD33
-A2B3 8235DD34
-A2B4 8235DD35
-A2B5 8235DD36
-A2B6 8235DD37
-A2B7 8235DD38
-A2B8 8235DD39
-A2B9 8235DE30
-A2BA 8235DE31
-A2BB 8235DE32
-A2BC 8235DE33
-A2BD 8235DE34
-A2BE 8235DE35
-A2BF 8235DE36
-A2C0 8235DE37
-A2C1 8235DE38
-A2C2 8235DE39
-A2C3 8235DF30
-A2C4 8235DF31
-A2C5 8235DF32
-A2C6 8235DF33
-A2C7 8235DF34
-A2C8 8235DF35
-A2C9 8235DF36
-A2CA 8235DF37
-A2CB 8235DF38
-A2CC 8235DF39
-A2CD 8235E030
-A2CE 8235E031
-A2CF 8235E032
-A2D0 8235E033
-A2D1 8235E034
-A2D2 8235E035
-A2D3 8235E036
-A2D4 8235E037
-A2D5 8235E038
-A2D6 8235E039
-A2D7 8235E130
-A2D8 8235E131
-A2D9 8235E132
-A2DA 8235E133
-A2DB 8235E134
-A2DC 8235E135
-A2DD 8235E136
-A2DE 8235E137
-A2DF 8235E138
-A2E0 8235E139
-A2E1 8235E230
-A2E2 8235E231
-A2E3 8235E232
-A2E4 8235E233
-A2E5 8235E234
-A2E6 8235E235
-A2E7 8235E236
-A2E8 8235E237
-A2E9 8235E238
-A2EA 8235E239
-A2EB 8235E330
-A2EC 8235E331
-A2ED 8235E332
-A2EE 8235E333
-A2EF 8235E334
-A2F0 8235E335
-A2F1 8235E336
-A2F2 8235E337
-A2F3 8235E338
-A2F4 8235E339
-A2F5 8235E430
-A2F6 8235E431
-A2F7 8235E432
-A2F8 8235E433
-A2F9 8235E434
-A2FA 8235E435
-A2FB 8235E436
-A2FC 8235E437
-A2FD 8235E438
-A2FE 8235E439
-A2FF 8235E530
-A300 8235E531
-A301 8235E532
-A302 8235E533
-A303 8235E534
-A304 8235E535
-A305 8235E536
-A306 8235E537
-A307 8235E538
-A308 8235E539
-A309 8235E630
-A30A 8235E631
-A30B 8235E632
-A30C 8235E633
-A30D 8235E634
-A30E 8235E635
-A30F 8235E636
-A310 8235E637
-A311 8235E638
-A312 8235E639
-A313 8235E730
-A314 8235E731
-A315 8235E732
-A316 8235E733
-A317 8235E734
-A318 8235E735
-A319 8235E736
-A31A 8235E737
-A31B 8235E738
-A31C 8235E739
-A31D 8235E830
-A31E 8235E831
-A31F 8235E832
-A320 8235E833
-A321 8235E834
-A322 8235E835
-A323 8235E836
-A324 8235E837
-A325 8235E838
-A326 8235E839
-A327 8235E930
-A328 8235E931
-A329 8235E932
-A32A 8235E933
-A32B 8235E934
-A32C 8235E935
-A32D 8235E936
-A32E 8235E937
-A32F 8235E938
-A330 8235E939
-A331 8235EA30
-A332 8235EA31
-A333 8235EA32
-A334 8235EA33
-A335 8235EA34
-A336 8235EA35
-A337 8235EA36
-A338 8235EA37
-A339 8235EA38
-A33A 8235EA39
-A33B 8235EB30
-A33C 8235EB31
-A33D 8235EB32
-A33E 8235EB33
-A33F 8235EB34
-A340 8235EB35
-A341 8235EB36
-A342 8235EB37
-A343 8235EB38
-A344 8235EB39
-A345 8235EC30
-A346 8235EC31
-A347 8235EC32
-A348 8235EC33
-A349 8235EC34
-A34A 8235EC35
-A34B 8235EC36
-A34C 8235EC37
-A34D 8235EC38
-A34E 8235EC39
-A34F 8235ED30
-A350 8235ED31
-A351 8235ED32
-A352 8235ED33
-A353 8235ED34
-A354 8235ED35
-A355 8235ED36
-A356 8235ED37
-A357 8235ED38
-A358 8235ED39
-A359 8235EE30
-A35A 8235EE31
-A35B 8235EE32
-A35C 8235EE33
-A35D 8235EE34
-A35E 8235EE35
-A35F 8235EE36
-A360 8235EE37
-A361 8235EE38
-A362 8235EE39
-A363 8235EF30
-A364 8235EF31
-A365 8235EF32
-A366 8235EF33
-A367 8235EF34
-A368 8235EF35
-A369 8235EF36
-A36A 8235EF37
-A36B 8235EF38
-A36C 8235EF39
-A36D 8235F030
-A36E 8235F031
-A36F 8235F032
-A370 8235F033
-A371 8235F034
-A372 8235F035
-A373 8235F036
-A374 8235F037
-A375 8235F038
-A376 8235F039
-A377 8235F130
-A378 8235F131
-A379 8235F132
-A37A 8235F133
-A37B 8235F134
-A37C 8235F135
-A37D 8235F136
-A37E 8235F137
-A37F 8235F138
-A380 8235F139
-A381 8235F230
-A382 8235F231
-A383 8235F232
-A384 8235F233
-A385 8235F234
-A386 8235F235
-A387 8235F236
-A388 8235F237
-A389 8235F238
-A38A 8235F239
-A38B 8235F330
-A38C 8235F331
-A38D 8235F332
-A38E 8235F333
-A38F 8235F334
-A390 8235F335
-A391 8235F336
-A392 8235F337
-A393 8235F338
-A394 8235F339
-A395 8235F430
-A396 8235F431
-A397 8235F432
-A398 8235F433
-A399 8235F434
-A39A 8235F435
-A39B 8235F436
-A39C 8235F437
-A39D 8235F438
-A39E 8235F439
-A39F 8235F530
-A3A0 8235F531
-A3A1 8235F532
-A3A2 8235F533
-A3A3 8235F534
-A3A4 8235F535
-A3A5 8235F536
-A3A6 8235F537
-A3A7 8235F538
-A3A8 8235F539
-A3A9 8235F630
-A3AA 8235F631
-A3AB 8235F632
-A3AC 8235F633
-A3AD 8235F634
-A3AE 8235F635
-A3AF 8235F636
-A3B0 8235F637
-A3B1 8235F638
-A3B2 8235F639
-A3B3 8235F730
-A3B4 8235F731
-A3B5 8235F732
-A3B6 8235F733
-A3B7 8235F734
-A3B8 8235F735
-A3B9 8235F736
-A3BA 8235F737
-A3BB 8235F738
-A3BC 8235F739
-A3BD 8235F830
-A3BE 8235F831
-A3BF 8235F832
-A3C0 8235F833
-A3C1 8235F834
-A3C2 8235F835
-A3C3 8235F836
-A3C4 8235F837
-A3C5 8235F838
-A3C6 8235F839
-A3C7 8235F930
-A3C8 8235F931
-A3C9 8235F932
-A3CA 8235F933
-A3CB 8235F934
-A3CC 8235F935
-A3CD 8235F936
-A3CE 8235F937
-A3CF 8235F938
-A3D0 8235F939
-A3D1 8235FA30
-A3D2 8235FA31
-A3D3 8235FA32
-A3D4 8235FA33
-A3D5 8235FA34
-A3D6 8235FA35
-A3D7 8235FA36
-A3D8 8235FA37
-A3D9 8235FA38
-A3DA 8235FA39
-A3DB 8235FB30
-A3DC 8235FB31
-A3DD 8235FB32
-A3DE 8235FB33
-A3DF 8235FB34
-A3E0 8235FB35
-A3E1 8235FB36
-A3E2 8235FB37
-A3E3 8235FB38
-A3E4 8235FB39
-A3E5 8235FC30
-A3E6 8235FC31
-A3E7 8235FC32
-A3E8 8235FC33
-A3E9 8235FC34
-A3EA 8235FC35
-A3EB 8235FC36
-A3EC 8235FC37
-A3ED 8235FC38
-A3EE 8235FC39
-A3EF 8235FD30
-A3F0 8235FD31
-A3F1 8235FD32
-A3F2 8235FD33
-A3F3 8235FD34
-A3F4 8235FD35
-A3F5 8235FD36
-A3F6 8235FD37
-A3F7 8235FD38
-A3F8 8235FD39
-A3F9 8235FE30
-A3FA 8235FE31
-A3FB 8235FE32
-A3FC 8235FE33
-A3FD 8235FE34
-A3FE 8235FE35
-A3FF 8235FE36
-A400 8235FE37
-A401 8235FE38
-A402 8235FE39
-A403 82368130
-A404 82368131
-A405 82368132
-A406 82368133
-A407 82368134
-A408 82368135
-A409 82368136
-A40A 82368137
-A40B 82368138
-A40C 82368139
-A40D 82368230
-A40E 82368231
-A40F 82368232
-A410 82368233
-A411 82368234
-A412 82368235
-A413 82368236
-A414 82368237
-A415 82368238
-A416 82368239
-A417 82368330
-A418 82368331
-A419 82368332
-A41A 82368333
-A41B 82368334
-A41C 82368335
-A41D 82368336
-A41E 82368337
-A41F 82368338
-A420 82368339
-A421 82368430
-A422 82368431
-A423 82368432
-A424 82368433
-A425 82368434
-A426 82368435
-A427 82368436
-A428 82368437
-A429 82368438
-A42A 82368439
-A42B 82368530
-A42C 82368531
-A42D 82368532
-A42E 82368533
-A42F 82368534
-A430 82368535
-A431 82368536
-A432 82368537
-A433 82368538
-A434 82368539
-A435 82368630
-A436 82368631
-A437 82368632
-A438 82368633
-A439 82368634
-A43A 82368635
-A43B 82368636
-A43C 82368637
-A43D 82368638
-A43E 82368639
-A43F 82368730
-A440 82368731
-A441 82368732
-A442 82368733
-A443 82368734
-A444 82368735
-A445 82368736
-A446 82368737
-A447 82368738
-A448 82368739
-A449 82368830
-A44A 82368831
-A44B 82368832
-A44C 82368833
-A44D 82368834
-A44E 82368835
-A44F 82368836
-A450 82368837
-A451 82368838
-A452 82368839
-A453 82368930
-A454 82368931
-A455 82368932
-A456 82368933
-A457 82368934
-A458 82368935
-A459 82368936
-A45A 82368937
-A45B 82368938
-A45C 82368939
-A45D 82368A30
-A45E 82368A31
-A45F 82368A32
-A460 82368A33
-A461 82368A34
-A462 82368A35
-A463 82368A36
-A464 82368A37
-A465 82368A38
-A466 82368A39
-A467 82368B30
-A468 82368B31
-A469 82368B32
-A46A 82368B33
-A46B 82368B34
-A46C 82368B35
-A46D 82368B36
-A46E 82368B37
-A46F 82368B38
-A470 82368B39
-A471 82368C30
-A472 82368C31
-A473 82368C32
-A474 82368C33
-A475 82368C34
-A476 82368C35
-A477 82368C36
-A478 82368C37
-A479 82368C38
-A47A 82368C39
-A47B 82368D30
-A47C 82368D31
-A47D 82368D32
-A47E 82368D33
-A47F 82368D34
-A480 82368D35
-A481 82368D36
-A482 82368D37
-A483 82368D38
-A484 82368D39
-A485 82368E30
-A486 82368E31
-A487 82368E32
-A488 82368E33
-A489 82368E34
-A48A 82368E35
-A48B 82368E36
-A48C 82368E37
-A48D 82368E38
-A48E 82368E39
-A48F 82368F30
-A490 82368F31
-A491 82368F32
-A492 82368F33
-A493 82368F34
-A494 82368F35
-A495 82368F36
-A496 82368F37
-A497 82368F38
-A498 82368F39
-A499 82369030
-A49A 82369031
-A49B 82369032
-A49C 82369033
-A49D 82369034
-A49E 82369035
-A49F 82369036
-A4A0 82369037
-A4A1 82369038
-A4A2 82369039
-A4A3 82369130
-A4A4 82369131
-A4A5 82369132
-A4A6 82369133
-A4A7 82369134
-A4A8 82369135
-A4A9 82369136
-A4AA 82369137
-A4AB 82369138
-A4AC 82369139
-A4AD 82369230
-A4AE 82369231
-A4AF 82369232
-A4B0 82369233
-A4B1 82369234
-A4B2 82369235
-A4B3 82369236
-A4B4 82369237
-A4B5 82369238
-A4B6 82369239
-A4B7 82369330
-A4B8 82369331
-A4B9 82369332
-A4BA 82369333
-A4BB 82369334
-A4BC 82369335
-A4BD 82369336
-A4BE 82369337
-A4BF 82369338
-A4C0 82369339
-A4C1 82369430
-A4C2 82369431
-A4C3 82369432
-A4C4 82369433
-A4C5 82369434
-A4C6 82369435
-A4C7 82369436
-A4C8 82369437
-A4C9 82369438
-A4CA 82369439
-A4CB 82369530
-A4CC 82369531
-A4CD 82369532
-A4CE 82369533
-A4CF 82369534
-A4D0 82369535
-A4D1 82369536
-A4D2 82369537
-A4D3 82369538
-A4D4 82369539
-A4D5 82369630
-A4D6 82369631
-A4D7 82369632
-A4D8 82369633
-A4D9 82369634
-A4DA 82369635
-A4DB 82369636
-A4DC 82369637
-A4DD 82369638
-A4DE 82369639
-A4DF 82369730
-A4E0 82369731
-A4E1 82369732
-A4E2 82369733
-A4E3 82369734
-A4E4 82369735
-A4E5 82369736
-A4E6 82369737
-A4E7 82369738
-A4E8 82369739
-A4E9 82369830
-A4EA 82369831
-A4EB 82369832
-A4EC 82369833
-A4ED 82369834
-A4EE 82369835
-A4EF 82369836
-A4F0 82369837
-A4F1 82369838
-A4F2 82369839
-A4F3 82369930
-A4F4 82369931
-A4F5 82369932
-A4F6 82369933
-A4F7 82369934
-A4F8 82369935
-A4F9 82369936
-A4FA 82369937
-A4FB 82369938
-A4FC 82369939
-A4FD 82369A30
-A4FE 82369A31
-A4FF 82369A32
-A500 82369A33
-A501 82369A34
-A502 82369A35
-A503 82369A36
-A504 82369A37
-A505 82369A38
-A506 82369A39
-A507 82369B30
-A508 82369B31
-A509 82369B32
-A50A 82369B33
-A50B 82369B34
-A50C 82369B35
-A50D 82369B36
-A50E 82369B37
-A50F 82369B38
-A510 82369B39
-A511 82369C30
-A512 82369C31
-A513 82369C32
-A514 82369C33
-A515 82369C34
-A516 82369C35
-A517 82369C36
-A518 82369C37
-A519 82369C38
-A51A 82369C39
-A51B 82369D30
-A51C 82369D31
-A51D 82369D32
-A51E 82369D33
-A51F 82369D34
-A520 82369D35
-A521 82369D36
-A522 82369D37
-A523 82369D38
-A524 82369D39
-A525 82369E30
-A526 82369E31
-A527 82369E32
-A528 82369E33
-A529 82369E34
-A52A 82369E35
-A52B 82369E36
-A52C 82369E37
-A52D 82369E38
-A52E 82369E39
-A52F 82369F30
-A530 82369F31
-A531 82369F32
-A532 82369F33
-A533 82369F34
-A534 82369F35
-A535 82369F36
-A536 82369F37
-A537 82369F38
-A538 82369F39
-A539 8236A030
-A53A 8236A031
-A53B 8236A032
-A53C 8236A033
-A53D 8236A034
-A53E 8236A035
-A53F 8236A036
-A540 8236A037
-A541 8236A038
-A542 8236A039
-A543 8236A130
-A544 8236A131
-A545 8236A132
-A546 8236A133
-A547 8236A134
-A548 8236A135
-A549 8236A136
-A54A 8236A137
-A54B 8236A138
-A54C 8236A139
-A54D 8236A230
-A54E 8236A231
-A54F 8236A232
-A550 8236A233
-A551 8236A234
-A552 8236A235
-A553 8236A236
-A554 8236A237
-A555 8236A238
-A556 8236A239
-A557 8236A330
-A558 8236A331
-A559 8236A332
-A55A 8236A333
-A55B 8236A334
-A55C 8236A335
-A55D 8236A336
-A55E 8236A337
-A55F 8236A338
-A560 8236A339
-A561 8236A430
-A562 8236A431
-A563 8236A432
-A564 8236A433
-A565 8236A434
-A566 8236A435
-A567 8236A436
-A568 8236A437
-A569 8236A438
-A56A 8236A439
-A56B 8236A530
-A56C 8236A531
-A56D 8236A532
-A56E 8236A533
-A56F 8236A534
-A570 8236A535
-A571 8236A536
-A572 8236A537
-A573 8236A538
-A574 8236A539
-A575 8236A630
-A576 8236A631
-A577 8236A632
-A578 8236A633
-A579 8236A634
-A57A 8236A635
-A57B 8236A636
-A57C 8236A637
-A57D 8236A638
-A57E 8236A639
-A57F 8236A730
-A580 8236A731
-A581 8236A732
-A582 8236A733
-A583 8236A734
-A584 8236A735
-A585 8236A736
-A586 8236A737
-A587 8236A738
-A588 8236A739
-A589 8236A830
-A58A 8236A831
-A58B 8236A832
-A58C 8236A833
-A58D 8236A834
-A58E 8236A835
-A58F 8236A836
-A590 8236A837
-A591 8236A838
-A592 8236A839
-A593 8236A930
-A594 8236A931
-A595 8236A932
-A596 8236A933
-A597 8236A934
-A598 8236A935
-A599 8236A936
-A59A 8236A937
-A59B 8236A938
-A59C 8236A939
-A59D 8236AA30
-A59E 8236AA31
-A59F 8236AA32
-A5A0 8236AA33
-A5A1 8236AA34
-A5A2 8236AA35
-A5A3 8236AA36
-A5A4 8236AA37
-A5A5 8236AA38
-A5A6 8236AA39
-A5A7 8236AB30
-A5A8 8236AB31
-A5A9 8236AB32
-A5AA 8236AB33
-A5AB 8236AB34
-A5AC 8236AB35
-A5AD 8236AB36
-A5AE 8236AB37
-A5AF 8236AB38
-A5B0 8236AB39
-A5B1 8236AC30
-A5B2 8236AC31
-A5B3 8236AC32
-A5B4 8236AC33
-A5B5 8236AC34
-A5B6 8236AC35
-A5B7 8236AC36
-A5B8 8236AC37
-A5B9 8236AC38
-A5BA 8236AC39
-A5BB 8236AD30
-A5BC 8236AD31
-A5BD 8236AD32
-A5BE 8236AD33
-A5BF 8236AD34
-A5C0 8236AD35
-A5C1 8236AD36
-A5C2 8236AD37
-A5C3 8236AD38
-A5C4 8236AD39
-A5C5 8236AE30
-A5C6 8236AE31
-A5C7 8236AE32
-A5C8 8236AE33
-A5C9 8236AE34
-A5CA 8236AE35
-A5CB 8236AE36
-A5CC 8236AE37
-A5CD 8236AE38
-A5CE 8236AE39
-A5CF 8236AF30
-A5D0 8236AF31
-A5D1 8236AF32
-A5D2 8236AF33
-A5D3 8236AF34
-A5D4 8236AF35
-A5D5 8236AF36
-A5D6 8236AF37
-A5D7 8236AF38
-A5D8 8236AF39
-A5D9 8236B030
-A5DA 8236B031
-A5DB 8236B032
-A5DC 8236B033
-A5DD 8236B034
-A5DE 8236B035
-A5DF 8236B036
-A5E0 8236B037
-A5E1 8236B038
-A5E2 8236B039
-A5E3 8236B130
-A5E4 8236B131
-A5E5 8236B132
-A5E6 8236B133
-A5E7 8236B134
-A5E8 8236B135
-A5E9 8236B136
-A5EA 8236B137
-A5EB 8236B138
-A5EC 8236B139
-A5ED 8236B230
-A5EE 8236B231
-A5EF 8236B232
-A5F0 8236B233
-A5F1 8236B234
-A5F2 8236B235
-A5F3 8236B236
-A5F4 8236B237
-A5F5 8236B238
-A5F6 8236B239
-A5F7 8236B330
-A5F8 8236B331
-A5F9 8236B332
-A5FA 8236B333
-A5FB 8236B334
-A5FC 8236B335
-A5FD 8236B336
-A5FE 8236B337
-A5FF 8236B338
-A600 8236B339
-A601 8236B430
-A602 8236B431
-A603 8236B432
-A604 8236B433
-A605 8236B434
-A606 8236B435
-A607 8236B436
-A608 8236B437
-A609 8236B438
-A60A 8236B439
-A60B 8236B530
-A60C 8236B531
-A60D 8236B532
-A60E 8236B533
-A60F 8236B534
-A610 8236B535
-A611 8236B536
-A612 8236B537
-A613 8236B538
-A614 8236B539
-A615 8236B630
-A616 8236B631
-A617 8236B632
-A618 8236B633
-A619 8236B634
-A61A 8236B635
-A61B 8236B636
-A61C 8236B637
-A61D 8236B638
-A61E 8236B639
-A61F 8236B730
-A620 8236B731
-A621 8236B732
-A622 8236B733
-A623 8236B734
-A624 8236B735
-A625 8236B736
-A626 8236B737
-A627 8236B738
-A628 8236B739
-A629 8236B830
-A62A 8236B831
-A62B 8236B832
-A62C 8236B833
-A62D 8236B834
-A62E 8236B835
-A62F 8236B836
-A630 8236B837
-A631 8236B838
-A632 8236B839
-A633 8236B930
-A634 8236B931
-A635 8236B932
-A636 8236B933
-A637 8236B934
-A638 8236B935
-A639 8236B936
-A63A 8236B937
-A63B 8236B938
-A63C 8236B939
-A63D 8236BA30
-A63E 8236BA31
-A63F 8236BA32
-A640 8236BA33
-A641 8236BA34
-A642 8236BA35
-A643 8236BA36
-A644 8236BA37
-A645 8236BA38
-A646 8236BA39
-A647 8236BB30
-A648 8236BB31
-A649 8236BB32
-A64A 8236BB33
-A64B 8236BB34
-A64C 8236BB35
-A64D 8236BB36
-A64E 8236BB37
-A64F 8236BB38
-A650 8236BB39
-A651 8236BC30
-A652 8236BC31
-A653 8236BC32
-A654 8236BC33
-A655 8236BC34
-A656 8236BC35
-A657 8236BC36
-A658 8236BC37
-A659 8236BC38
-A65A 8236BC39
-A65B 8236BD30
-A65C 8236BD31
-A65D 8236BD32
-A65E 8236BD33
-A65F 8236BD34
-A660 8236BD35
-A661 8236BD36
-A662 8236BD37
-A663 8236BD38
-A664 8236BD39
-A665 8236BE30
-A666 8236BE31
-A667 8236BE32
-A668 8236BE33
-A669 8236BE34
-A66A 8236BE35
-A66B 8236BE36
-A66C 8236BE37
-A66D 8236BE38
-A66E 8236BE39
-A66F 8236BF30
-A670 8236BF31
-A671 8236BF32
-A672 8236BF33
-A673 8236BF34
-A674 8236BF35
-A675 8236BF36
-A676 8236BF37
-A677 8236BF38
-A678 8236BF39
-A679 8236C030
-A67A 8236C031
-A67B 8236C032
-A67C 8236C033
-A67D 8236C034
-A67E 8236C035
-A67F 8236C036
-A680 8236C037
-A681 8236C038
-A682 8236C039
-A683 8236C130
-A684 8236C131
-A685 8236C132
-A686 8236C133
-A687 8236C134
-A688 8236C135
-A689 8236C136
-A68A 8236C137
-A68B 8236C138
-A68C 8236C139
-A68D 8236C230
-A68E 8236C231
-A68F 8236C232
-A690 8236C233
-A691 8236C234
-A692 8236C235
-A693 8236C236
-A694 8236C237
-A695 8236C238
-A696 8236C239
-A697 8236C330
-A698 8236C331
-A699 8236C332
-A69A 8236C333
-A69B 8236C334
-A69C 8236C335
-A69D 8236C336
-A69E 8236C337
-A69F 8236C338
-A6A0 8236C339
-A6A1 8236C430
-A6A2 8236C431
-A6A3 8236C432
-A6A4 8236C433
-A6A5 8236C434
-A6A6 8236C435
-A6A7 8236C436
-A6A8 8236C437
-A6A9 8236C438
-A6AA 8236C439
-A6AB 8236C530
-A6AC 8236C531
-A6AD 8236C532
-A6AE 8236C533
-A6AF 8236C534
-A6B0 8236C535
-A6B1 8236C536
-A6B2 8236C537
-A6B3 8236C538
-A6B4 8236C539
-A6B5 8236C630
-A6B6 8236C631
-A6B7 8236C632
-A6B8 8236C633
-A6B9 8236C634
-A6BA 8236C635
-A6BB 8236C636
-A6BC 8236C637
-A6BD 8236C638
-A6BE 8236C639
-A6BF 8236C730
-A6C0 8236C731
-A6C1 8236C732
-A6C2 8236C733
-A6C3 8236C734
-A6C4 8236C735
-A6C5 8236C736
-A6C6 8236C737
-A6C7 8236C738
-A6C8 8236C739
-A6C9 8236C830
-A6CA 8236C831
-A6CB 8236C832
-A6CC 8236C833
-A6CD 8236C834
-A6CE 8236C835
-A6CF 8236C836
-A6D0 8236C837
-A6D1 8236C838
-A6D2 8236C839
-A6D3 8236C930
-A6D4 8236C931
-A6D5 8236C932
-A6D6 8236C933
-A6D7 8236C934
-A6D8 8236C935
-A6D9 8236C936
-A6DA 8236C937
-A6DB 8236C938
-A6DC 8236C939
-A6DD 8236CA30
-A6DE 8236CA31
-A6DF 8236CA32
-A6E0 8236CA33
-A6E1 8236CA34
-A6E2 8236CA35
-A6E3 8236CA36
-A6E4 8236CA37
-A6E5 8236CA38
-A6E6 8236CA39
-A6E7 8236CB30
-A6E8 8236CB31
-A6E9 8236CB32
-A6EA 8236CB33
-A6EB 8236CB34
-A6EC 8236CB35
-A6ED 8236CB36
-A6EE 8236CB37
-A6EF 8236CB38
-A6F0 8236CB39
-A6F1 8236CC30
-A6F2 8236CC31
-A6F3 8236CC32
-A6F4 8236CC33
-A6F5 8236CC34
-A6F6 8236CC35
-A6F7 8236CC36
-A6F8 8236CC37
-A6F9 8236CC38
-A6FA 8236CC39
-A6FB 8236CD30
-A6FC 8236CD31
-A6FD 8236CD32
-A6FE 8236CD33
-A6FF 8236CD34
-A700 8236CD35
-A701 8236CD36
-A702 8236CD37
-A703 8236CD38
-A704 8236CD39
-A705 8236CE30
-A706 8236CE31
-A707 8236CE32
-A708 8236CE33
-A709 8236CE34
-A70A 8236CE35
-A70B 8236CE36
-A70C 8236CE37
-A70D 8236CE38
-A70E 8236CE39
-A70F 8236CF30
-A710 8236CF31
-A711 8236CF32
-A712 8236CF33
-A713 8236CF34
-A714 8236CF35
-A715 8236CF36
-A716 8236CF37
-A717 8236CF38
-A718 8236CF39
-A719 8236D030
-A71A 8236D031
-A71B 8236D032
-A71C 8236D033
-A71D 8236D034
-A71E 8236D035
-A71F 8236D036
-A720 8236D037
-A721 8236D038
-A722 8236D039
-A723 8236D130
-A724 8236D131
-A725 8236D132
-A726 8236D133
-A727 8236D134
-A728 8236D135
-A729 8236D136
-A72A 8236D137
-A72B 8236D138
-A72C 8236D139
-A72D 8236D230
-A72E 8236D231
-A72F 8236D232
-A730 8236D233
-A731 8236D234
-A732 8236D235
-A733 8236D236
-A734 8236D237
-A735 8236D238
-A736 8236D239
-A737 8236D330
-A738 8236D331
-A739 8236D332
-A73A 8236D333
-A73B 8236D334
-A73C 8236D335
-A73D 8236D336
-A73E 8236D337
-A73F 8236D338
-A740 8236D339
-A741 8236D430
-A742 8236D431
-A743 8236D432
-A744 8236D433
-A745 8236D434
-A746 8236D435
-A747 8236D436
-A748 8236D437
-A749 8236D438
-A74A 8236D439
-A74B 8236D530
-A74C 8236D531
-A74D 8236D532
-A74E 8236D533
-A74F 8236D534
-A750 8236D535
-A751 8236D536
-A752 8236D537
-A753 8236D538
-A754 8236D539
-A755 8236D630
-A756 8236D631
-A757 8236D632
-A758 8236D633
-A759 8236D634
-A75A 8236D635
-A75B 8236D636
-A75C 8236D637
-A75D 8236D638
-A75E 8236D639
-A75F 8236D730
-A760 8236D731
-A761 8236D732
-A762 8236D733
-A763 8236D734
-A764 8236D735
-A765 8236D736
-A766 8236D737
-A767 8236D738
-A768 8236D739
-A769 8236D830
-A76A 8236D831
-A76B 8236D832
-A76C 8236D833
-A76D 8236D834
-A76E 8236D835
-A76F 8236D836
-A770 8236D837
-A771 8236D838
-A772 8236D839
-A773 8236D930
-A774 8236D931
-A775 8236D932
-A776 8236D933
-A777 8236D934
-A778 8236D935
-A779 8236D936
-A77A 8236D937
-A77B 8236D938
-A77C 8236D939
-A77D 8236DA30
-A77E 8236DA31
-A77F 8236DA32
-A780 8236DA33
-A781 8236DA34
-A782 8236DA35
-A783 8236DA36
-A784 8236DA37
-A785 8236DA38
-A786 8236DA39
-A787 8236DB30
-A788 8236DB31
-A789 8236DB32
-A78A 8236DB33
-A78B 8236DB34
-A78C 8236DB35
-A78D 8236DB36
-A78E 8236DB37
-A78F 8236DB38
-A790 8236DB39
-A791 8236DC30
-A792 8236DC31
-A793 8236DC32
-A794 8236DC33
-A795 8236DC34
-A796 8236DC35
-A797 8236DC36
-A798 8236DC37
-A799 8236DC38
-A79A 8236DC39
-A79B 8236DD30
-A79C 8236DD31
-A79D 8236DD32
-A79E 8236DD33
-A79F 8236DD34
-A7A0 8236DD35
-A7A1 8236DD36
-A7A2 8236DD37
-A7A3 8236DD38
-A7A4 8236DD39
-A7A5 8236DE30
-A7A6 8236DE31
-A7A7 8236DE32
-A7A8 8236DE33
-A7A9 8236DE34
-A7AA 8236DE35
-A7AB 8236DE36
-A7AC 8236DE37
-A7AD 8236DE38
-A7AE 8236DE39
-A7AF 8236DF30
-A7B0 8236DF31
-A7B1 8236DF32
-A7B2 8236DF33
-A7B3 8236DF34
-A7B4 8236DF35
-A7B5 8236DF36
-A7B6 8236DF37
-A7B7 8236DF38
-A7B8 8236DF39
-A7B9 8236E030
-A7BA 8236E031
-A7BB 8236E032
-A7BC 8236E033
-A7BD 8236E034
-A7BE 8236E035
-A7BF 8236E036
-A7C0 8236E037
-A7C1 8236E038
-A7C2 8236E039
-A7C3 8236E130
-A7C4 8236E131
-A7C5 8236E132
-A7C6 8236E133
-A7C7 8236E134
-A7C8 8236E135
-A7C9 8236E136
-A7CA 8236E137
-A7CB 8236E138
-A7CC 8236E139
-A7CD 8236E230
-A7CE 8236E231
-A7CF 8236E232
-A7D0 8236E233
-A7D1 8236E234
-A7D2 8236E235
-A7D3 8236E236
-A7D4 8236E237
-A7D5 8236E238
-A7D6 8236E239
-A7D7 8236E330
-A7D8 8236E331
-A7D9 8236E332
-A7DA 8236E333
-A7DB 8236E334
-A7DC 8236E335
-A7DD 8236E336
-A7DE 8236E337
-A7DF 8236E338
-A7E0 8236E339
-A7E1 8236E430
-A7E2 8236E431
-A7E3 8236E432
-A7E4 8236E433
-A7E5 8236E434
-A7E6 8236E435
-A7E7 8236E436
-A7E8 8236E437
-A7E9 8236E438
-A7EA 8236E439
-A7EB 8236E530
-A7EC 8236E531
-A7ED 8236E532
-A7EE 8236E533
-A7EF 8236E534
-A7F0 8236E535
-A7F1 8236E536
-A7F2 8236E537
-A7F3 8236E538
-A7F4 8236E539
-A7F5 8236E630
-A7F6 8236E631
-A7F7 8236E632
-A7F8 8236E633
-A7F9 8236E634
-A7FA 8236E635
-A7FB 8236E636
-A7FC 8236E637
-A7FD 8236E638
-A7FE 8236E639
-A7FF 8236E730
-A800 8236E731
-A801 8236E732
-A802 8236E733
-A803 8236E734
-A804 8236E735
-A805 8236E736
-A806 8236E737
-A807 8236E738
-A808 8236E739
-A809 8236E830
-A80A 8236E831
-A80B 8236E832
-A80C 8236E833
-A80D 8236E834
-A80E 8236E835
-A80F 8236E836
-A810 8236E837
-A811 8236E838
-A812 8236E839
-A813 8236E930
-A814 8236E931
-A815 8236E932
-A816 8236E933
-A817 8236E934
-A818 8236E935
-A819 8236E936
-A81A 8236E937
-A81B 8236E938
-A81C 8236E939
-A81D 8236EA30
-A81E 8236EA31
-A81F 8236EA32
-A820 8236EA33
-A821 8236EA34
-A822 8236EA35
-A823 8236EA36
-A824 8236EA37
-A825 8236EA38
-A826 8236EA39
-A827 8236EB30
-A828 8236EB31
-A829 8236EB32
-A82A 8236EB33
-A82B 8236EB34
-A82C 8236EB35
-A82D 8236EB36
-A82E 8236EB37
-A82F 8236EB38
-A830 8236EB39
-A831 8236EC30
-A832 8236EC31
-A833 8236EC32
-A834 8236EC33
-A835 8236EC34
-A836 8236EC35
-A837 8236EC36
-A838 8236EC37
-A839 8236EC38
-A83A 8236EC39
-A83B 8236ED30
-A83C 8236ED31
-A83D 8236ED32
-A83E 8236ED33
-A83F 8236ED34
-A840 8236ED35
-A841 8236ED36
-A842 8236ED37
-A843 8236ED38
-A844 8236ED39
-A845 8236EE30
-A846 8236EE31
-A847 8236EE32
-A848 8236EE33
-A849 8236EE34
-A84A 8236EE35
-A84B 8236EE36
-A84C 8236EE37
-A84D 8236EE38
-A84E 8236EE39
-A84F 8236EF30
-A850 8236EF31
-A851 8236EF32
-A852 8236EF33
-A853 8236EF34
-A854 8236EF35
-A855 8236EF36
-A856 8236EF37
-A857 8236EF38
-A858 8236EF39
-A859 8236F030
-A85A 8236F031
-A85B 8236F032
-A85C 8236F033
-A85D 8236F034
-A85E 8236F035
-A85F 8236F036
-A860 8236F037
-A861 8236F038
-A862 8236F039
-A863 8236F130
-A864 8236F131
-A865 8236F132
-A866 8236F133
-A867 8236F134
-A868 8236F135
-A869 8236F136
-A86A 8236F137
-A86B 8236F138
-A86C 8236F139
-A86D 8236F230
-A86E 8236F231
-A86F 8236F232
-A870 8236F233
-A871 8236F234
-A872 8236F235
-A873 8236F236
-A874 8236F237
-A875 8236F238
-A876 8236F239
-A877 8236F330
-A878 8236F331
-A879 8236F332
-A87A 8236F333
-A87B 8236F334
-A87C 8236F335
-A87D 8236F336
-A87E 8236F337
-A87F 8236F338
-A880 8236F339
-A881 8236F430
-A882 8236F431
-A883 8236F432
-A884 8236F433
-A885 8236F434
-A886 8236F435
-A887 8236F436
-A888 8236F437
-A889 8236F438
-A88A 8236F439
-A88B 8236F530
-A88C 8236F531
-A88D 8236F532
-A88E 8236F533
-A88F 8236F534
-A890 8236F535
-A891 8236F536
-A892 8236F537
-A893 8236F538
-A894 8236F539
-A895 8236F630
-A896 8236F631
-A897 8236F632
-A898 8236F633
-A899 8236F634
-A89A 8236F635
-A89B 8236F636
-A89C 8236F637
-A89D 8236F638
-A89E 8236F639
-A89F 8236F730
-A8A0 8236F731
-A8A1 8236F732
-A8A2 8236F733
-A8A3 8236F734
-A8A4 8236F735
-A8A5 8236F736
-A8A6 8236F737
-A8A7 8236F738
-A8A8 8236F739
-A8A9 8236F830
-A8AA 8236F831
-A8AB 8236F832
-A8AC 8236F833
-A8AD 8236F834
-A8AE 8236F835
-A8AF 8236F836
-A8B0 8236F837
-A8B1 8236F838
-A8B2 8236F839
-A8B3 8236F930
-A8B4 8236F931
-A8B5 8236F932
-A8B6 8236F933
-A8B7 8236F934
-A8B8 8236F935
-A8B9 8236F936
-A8BA 8236F937
-A8BB 8236F938
-A8BC 8236F939
-A8BD 8236FA30
-A8BE 8236FA31
-A8BF 8236FA32
-A8C0 8236FA33
-A8C1 8236FA34
-A8C2 8236FA35
-A8C3 8236FA36
-A8C4 8236FA37
-A8C5 8236FA38
-A8C6 8236FA39
-A8C7 8236FB30
-A8C8 8236FB31
-A8C9 8236FB32
-A8CA 8236FB33
-A8CB 8236FB34
-A8CC 8236FB35
-A8CD 8236FB36
-A8CE 8236FB37
-A8CF 8236FB38
-A8D0 8236FB39
-A8D1 8236FC30
-A8D2 8236FC31
-A8D3 8236FC32
-A8D4 8236FC33
-A8D5 8236FC34
-A8D6 8236FC35
-A8D7 8236FC36
-A8D8 8236FC37
-A8D9 8236FC38
-A8DA 8236FC39
-A8DB 8236FD30
-A8DC 8236FD31
-A8DD 8236FD32
-A8DE 8236FD33
-A8DF 8236FD34
-A8E0 8236FD35
-A8E1 8236FD36
-A8E2 8236FD37
-A8E3 8236FD38
-A8E4 8236FD39
-A8E5 8236FE30
-A8E6 8236FE31
-A8E7 8236FE32
-A8E8 8236FE33
-A8E9 8236FE34
-A8EA 8236FE35
-A8EB 8236FE36
-A8EC 8236FE37
-A8ED 8236FE38
-A8EE 8236FE39
-A8EF 82378130
-A8F0 82378131
-A8F1 82378132
-A8F2 82378133
-A8F3 82378134
-A8F4 82378135
-A8F5 82378136
-A8F6 82378137
-A8F7 82378138
-A8F8 82378139
-A8F9 82378230
-A8FA 82378231
-A8FB 82378232
-A8FC 82378233
-A8FD 82378234
-A8FE 82378235
-A8FF 82378236
-A900 82378237
-A901 82378238
-A902 82378239
-A903 82378330
-A904 82378331
-A905 82378332
-A906 82378333
-A907 82378334
-A908 82378335
-A909 82378336
-A90A 82378337
-A90B 82378338
-A90C 82378339
-A90D 82378430
-A90E 82378431
-A90F 82378432
-A910 82378433
-A911 82378434
-A912 82378435
-A913 82378436
-A914 82378437
-A915 82378438
-A916 82378439
-A917 82378530
-A918 82378531
-A919 82378532
-A91A 82378533
-A91B 82378534
-A91C 82378535
-A91D 82378536
-A91E 82378537
-A91F 82378538
-A920 82378539
-A921 82378630
-A922 82378631
-A923 82378632
-A924 82378633
-A925 82378634
-A926 82378635
-A927 82378636
-A928 82378637
-A929 82378638
-A92A 82378639
-A92B 82378730
-A92C 82378731
-A92D 82378732
-A92E 82378733
-A92F 82378734
-A930 82378735
-A931 82378736
-A932 82378737
-A933 82378738
-A934 82378739
-A935 82378830
-A936 82378831
-A937 82378832
-A938 82378833
-A939 82378834
-A93A 82378835
-A93B 82378836
-A93C 82378837
-A93D 82378838
-A93E 82378839
-A93F 82378930
-A940 82378931
-A941 82378932
-A942 82378933
-A943 82378934
-A944 82378935
-A945 82378936
-A946 82378937
-A947 82378938
-A948 82378939
-A949 82378A30
-A94A 82378A31
-A94B 82378A32
-A94C 82378A33
-A94D 82378A34
-A94E 82378A35
-A94F 82378A36
-A950 82378A37
-A951 82378A38
-A952 82378A39
-A953 82378B30
-A954 82378B31
-A955 82378B32
-A956 82378B33
-A957 82378B34
-A958 82378B35
-A959 82378B36
-A95A 82378B37
-A95B 82378B38
-A95C 82378B39
-A95D 82378C30
-A95E 82378C31
-A95F 82378C32
-A960 82378C33
-A961 82378C34
-A962 82378C35
-A963 82378C36
-A964 82378C37
-A965 82378C38
-A966 82378C39
-A967 82378D30
-A968 82378D31
-A969 82378D32
-A96A 82378D33
-A96B 82378D34
-A96C 82378D35
-A96D 82378D36
-A96E 82378D37
-A96F 82378D38
-A970 82378D39
-A971 82378E30
-A972 82378E31
-A973 82378E32
-A974 82378E33
-A975 82378E34
-A976 82378E35
-A977 82378E36
-A978 82378E37
-A979 82378E38
-A97A 82378E39
-A97B 82378F30
-A97C 82378F31
-A97D 82378F32
-A97E 82378F33
-A97F 82378F34
-A980 82378F35
-A981 82378F36
-A982 82378F37
-A983 82378F38
-A984 82378F39
-A985 82379030
-A986 82379031
-A987 82379032
-A988 82379033
-A989 82379034
-A98A 82379035
-A98B 82379036
-A98C 82379037
-A98D 82379038
-A98E 82379039
-A98F 82379130
-A990 82379131
-A991 82379132
-A992 82379133
-A993 82379134
-A994 82379135
-A995 82379136
-A996 82379137
-A997 82379138
-A998 82379139
-A999 82379230
-A99A 82379231
-A99B 82379232
-A99C 82379233
-A99D 82379234
-A99E 82379235
-A99F 82379236
-A9A0 82379237
-A9A1 82379238
-A9A2 82379239
-A9A3 82379330
-A9A4 82379331
-A9A5 82379332
-A9A6 82379333
-A9A7 82379334
-A9A8 82379335
-A9A9 82379336
-A9AA 82379337
-A9AB 82379338
-A9AC 82379339
-A9AD 82379430
-A9AE 82379431
-A9AF 82379432
-A9B0 82379433
-A9B1 82379434
-A9B2 82379435
-A9B3 82379436
-A9B4 82379437
-A9B5 82379438
-A9B6 82379439
-A9B7 82379530
-A9B8 82379531
-A9B9 82379532
-A9BA 82379533
-A9BB 82379534
-A9BC 82379535
-A9BD 82379536
-A9BE 82379537
-A9BF 82379538
-A9C0 82379539
-A9C1 82379630
-A9C2 82379631
-A9C3 82379632
-A9C4 82379633
-A9C5 82379634
-A9C6 82379635
-A9C7 82379636
-A9C8 82379637
-A9C9 82379638
-A9CA 82379639
-A9CB 82379730
-A9CC 82379731
-A9CD 82379732
-A9CE 82379733
-A9CF 82379734
-A9D0 82379735
-A9D1 82379736
-A9D2 82379737
-A9D3 82379738
-A9D4 82379739
-A9D5 82379830
-A9D6 82379831
-A9D7 82379832
-A9D8 82379833
-A9D9 82379834
-A9DA 82379835
-A9DB 82379836
-A9DC 82379837
-A9DD 82379838
-A9DE 82379839
-A9DF 82379930
-A9E0 82379931
-A9E1 82379932
-A9E2 82379933
-A9E3 82379934
-A9E4 82379935
-A9E5 82379936
-A9E6 82379937
-A9E7 82379938
-A9E8 82379939
-A9E9 82379A30
-A9EA 82379A31
-A9EB 82379A32
-A9EC 82379A33
-A9ED 82379A34
-A9EE 82379A35
-A9EF 82379A36
-A9F0 82379A37
-A9F1 82379A38
-A9F2 82379A39
-A9F3 82379B30
-A9F4 82379B31
-A9F5 82379B32
-A9F6 82379B33
-A9F7 82379B34
-A9F8 82379B35
-A9F9 82379B36
-A9FA 82379B37
-A9FB 82379B38
-A9FC 82379B39
-A9FD 82379C30
-A9FE 82379C31
-A9FF 82379C32
-AA00 82379C33
-AA01 82379C34
-AA02 82379C35
-AA03 82379C36
-AA04 82379C37
-AA05 82379C38
-AA06 82379C39
-AA07 82379D30
-AA08 82379D31
-AA09 82379D32
-AA0A 82379D33
-AA0B 82379D34
-AA0C 82379D35
-AA0D 82379D36
-AA0E 82379D37
-AA0F 82379D38
-AA10 82379D39
-AA11 82379E30
-AA12 82379E31
-AA13 82379E32
-AA14 82379E33
-AA15 82379E34
-AA16 82379E35
-AA17 82379E36
-AA18 82379E37
-AA19 82379E38
-AA1A 82379E39
-AA1B 82379F30
-AA1C 82379F31
-AA1D 82379F32
-AA1E 82379F33
-AA1F 82379F34
-AA20 82379F35
-AA21 82379F36
-AA22 82379F37
-AA23 82379F38
-AA24 82379F39
-AA25 8237A030
-AA26 8237A031
-AA27 8237A032
-AA28 8237A033
-AA29 8237A034
-AA2A 8237A035
-AA2B 8237A036
-AA2C 8237A037
-AA2D 8237A038
-AA2E 8237A039
-AA2F 8237A130
-AA30 8237A131
-AA31 8237A132
-AA32 8237A133
-AA33 8237A134
-AA34 8237A135
-AA35 8237A136
-AA36 8237A137
-AA37 8237A138
-AA38 8237A139
-AA39 8237A230
-AA3A 8237A231
-AA3B 8237A232
-AA3C 8237A233
-AA3D 8237A234
-AA3E 8237A235
-AA3F 8237A236
-AA40 8237A237
-AA41 8237A238
-AA42 8237A239
-AA43 8237A330
-AA44 8237A331
-AA45 8237A332
-AA46 8237A333
-AA47 8237A334
-AA48 8237A335
-AA49 8237A336
-AA4A 8237A337
-AA4B 8237A338
-AA4C 8237A339
-AA4D 8237A430
-AA4E 8237A431
-AA4F 8237A432
-AA50 8237A433
-AA51 8237A434
-AA52 8237A435
-AA53 8237A436
-AA54 8237A437
-AA55 8237A438
-AA56 8237A439
-AA57 8237A530
-AA58 8237A531
-AA59 8237A532
-AA5A 8237A533
-AA5B 8237A534
-AA5C 8237A535
-AA5D 8237A536
-AA5E 8237A537
-AA5F 8237A538
-AA60 8237A539
-AA61 8237A630
-AA62 8237A631
-AA63 8237A632
-AA64 8237A633
-AA65 8237A634
-AA66 8237A635
-AA67 8237A636
-AA68 8237A637
-AA69 8237A638
-AA6A 8237A639
-AA6B 8237A730
-AA6C 8237A731
-AA6D 8237A732
-AA6E 8237A733
-AA6F 8237A734
-AA70 8237A735
-AA71 8237A736
-AA72 8237A737
-AA73 8237A738
-AA74 8237A739
-AA75 8237A830
-AA76 8237A831
-AA77 8237A832
-AA78 8237A833
-AA79 8237A834
-AA7A 8237A835
-AA7B 8237A836
-AA7C 8237A837
-AA7D 8237A838
-AA7E 8237A839
-AA7F 8237A930
-AA80 8237A931
-AA81 8237A932
-AA82 8237A933
-AA83 8237A934
-AA84 8237A935
-AA85 8237A936
-AA86 8237A937
-AA87 8237A938
-AA88 8237A939
-AA89 8237AA30
-AA8A 8237AA31
-AA8B 8237AA32
-AA8C 8237AA33
-AA8D 8237AA34
-AA8E 8237AA35
-AA8F 8237AA36
-AA90 8237AA37
-AA91 8237AA38
-AA92 8237AA39
-AA93 8237AB30
-AA94 8237AB31
-AA95 8237AB32
-AA96 8237AB33
-AA97 8237AB34
-AA98 8237AB35
-AA99 8237AB36
-AA9A 8237AB37
-AA9B 8237AB38
-AA9C 8237AB39
-AA9D 8237AC30
-AA9E 8237AC31
-AA9F 8237AC32
-AAA0 8237AC33
-AAA1 8237AC34
-AAA2 8237AC35
-AAA3 8237AC36
-AAA4 8237AC37
-AAA5 8237AC38
-AAA6 8237AC39
-AAA7 8237AD30
-AAA8 8237AD31
-AAA9 8237AD32
-AAAA 8237AD33
-AAAB 8237AD34
-AAAC 8237AD35
-AAAD 8237AD36
-AAAE 8237AD37
-AAAF 8237AD38
-AAB0 8237AD39
-AAB1 8237AE30
-AAB2 8237AE31
-AAB3 8237AE32
-AAB4 8237AE33
-AAB5 8237AE34
-AAB6 8237AE35
-AAB7 8237AE36
-AAB8 8237AE37
-AAB9 8237AE38
-AABA 8237AE39
-AABB 8237AF30
-AABC 8237AF31
-AABD 8237AF32
-AABE 8237AF33
-AABF 8237AF34
-AAC0 8237AF35
-AAC1 8237AF36
-AAC2 8237AF37
-AAC3 8237AF38
-AAC4 8237AF39
-AAC5 8237B030
-AAC6 8237B031
-AAC7 8237B032
-AAC8 8237B033
-AAC9 8237B034
-AACA 8237B035
-AACB 8237B036
-AACC 8237B037
-AACD 8237B038
-AACE 8237B039
-AACF 8237B130
-AAD0 8237B131
-AAD1 8237B132
-AAD2 8237B133
-AAD3 8237B134
-AAD4 8237B135
-AAD5 8237B136
-AAD6 8237B137
-AAD7 8237B138
-AAD8 8237B139
-AAD9 8237B230
-AADA 8237B231
-AADB 8237B232
-AADC 8237B233
-AADD 8237B234
-AADE 8237B235
-AADF 8237B236
-AAE0 8237B237
-AAE1 8237B238
-AAE2 8237B239
-AAE3 8237B330
-AAE4 8237B331
-AAE5 8237B332
-AAE6 8237B333
-AAE7 8237B334
-AAE8 8237B335
-AAE9 8237B336
-AAEA 8237B337
-AAEB 8237B338
-AAEC 8237B339
-AAED 8237B430
-AAEE 8237B431
-AAEF 8237B432
-AAF0 8237B433
-AAF1 8237B434
-AAF2 8237B435
-AAF3 8237B436
-AAF4 8237B437
-AAF5 8237B438
-AAF6 8237B439
-AAF7 8237B530
-AAF8 8237B531
-AAF9 8237B532
-AAFA 8237B533
-AAFB 8237B534
-AAFC 8237B535
-AAFD 8237B536
-AAFE 8237B537
-AAFF 8237B538
-AB00 8237B539
-AB01 8237B630
-AB02 8237B631
-AB03 8237B632
-AB04 8237B633
-AB05 8237B634
-AB06 8237B635
-AB07 8237B636
-AB08 8237B637
-AB09 8237B638
-AB0A 8237B639
-AB0B 8237B730
-AB0C 8237B731
-AB0D 8237B732
-AB0E 8237B733
-AB0F 8237B734
-AB10 8237B735
-AB11 8237B736
-AB12 8237B737
-AB13 8237B738
-AB14 8237B739
-AB15 8237B830
-AB16 8237B831
-AB17 8237B832
-AB18 8237B833
-AB19 8237B834
-AB1A 8237B835
-AB1B 8237B836
-AB1C 8237B837
-AB1D 8237B838
-AB1E 8237B839
-AB1F 8237B930
-AB20 8237B931
-AB21 8237B932
-AB22 8237B933
-AB23 8237B934
-AB24 8237B935
-AB25 8237B936
-AB26 8237B937
-AB27 8237B938
-AB28 8237B939
-AB29 8237BA30
-AB2A 8237BA31
-AB2B 8237BA32
-AB2C 8237BA33
-AB2D 8237BA34
-AB2E 8237BA35
-AB2F 8237BA36
-AB30 8237BA37
-AB31 8237BA38
-AB32 8237BA39
-AB33 8237BB30
-AB34 8237BB31
-AB35 8237BB32
-AB36 8237BB33
-AB37 8237BB34
-AB38 8237BB35
-AB39 8237BB36
-AB3A 8237BB37
-AB3B 8237BB38
-AB3C 8237BB39
-AB3D 8237BC30
-AB3E 8237BC31
-AB3F 8237BC32
-AB40 8237BC33
-AB41 8237BC34
-AB42 8237BC35
-AB43 8237BC36
-AB44 8237BC37
-AB45 8237BC38
-AB46 8237BC39
-AB47 8237BD30
-AB48 8237BD31
-AB49 8237BD32
-AB4A 8237BD33
-AB4B 8237BD34
-AB4C 8237BD35
-AB4D 8237BD36
-AB4E 8237BD37
-AB4F 8237BD38
-AB50 8237BD39
-AB51 8237BE30
-AB52 8237BE31
-AB53 8237BE32
-AB54 8237BE33
-AB55 8237BE34
-AB56 8237BE35
-AB57 8237BE36
-AB58 8237BE37
-AB59 8237BE38
-AB5A 8237BE39
-AB5B 8237BF30
-AB5C 8237BF31
-AB5D 8237BF32
-AB5E 8237BF33
-AB5F 8237BF34
-AB60 8237BF35
-AB61 8237BF36
-AB62 8237BF37
-AB63 8237BF38
-AB64 8237BF39
-AB65 8237C030
-AB66 8237C031
-AB67 8237C032
-AB68 8237C033
-AB69 8237C034
-AB6A 8237C035
-AB6B 8237C036
-AB6C 8237C037
-AB6D 8237C038
-AB6E 8237C039
-AB6F 8237C130
-AB70 8237C131
-AB71 8237C132
-AB72 8237C133
-AB73 8237C134
-AB74 8237C135
-AB75 8237C136
-AB76 8237C137
-AB77 8237C138
-AB78 8237C139
-AB79 8237C230
-AB7A 8237C231
-AB7B 8237C232
-AB7C 8237C233
-AB7D 8237C234
-AB7E 8237C235
-AB7F 8237C236
-AB80 8237C237
-AB81 8237C238
-AB82 8237C239
-AB83 8237C330
-AB84 8237C331
-AB85 8237C332
-AB86 8237C333
-AB87 8237C334
-AB88 8237C335
-AB89 8237C336
-AB8A 8237C337
-AB8B 8237C338
-AB8C 8237C339
-AB8D 8237C430
-AB8E 8237C431
-AB8F 8237C432
-AB90 8237C433
-AB91 8237C434
-AB92 8237C435
-AB93 8237C436
-AB94 8237C437
-AB95 8237C438
-AB96 8237C439
-AB97 8237C530
-AB98 8237C531
-AB99 8237C532
-AB9A 8237C533
-AB9B 8237C534
-AB9C 8237C535
-AB9D 8237C536
-AB9E 8237C537
-AB9F 8237C538
-ABA0 8237C539
-ABA1 8237C630
-ABA2 8237C631
-ABA3 8237C632
-ABA4 8237C633
-ABA5 8237C634
-ABA6 8237C635
-ABA7 8237C636
-ABA8 8237C637
-ABA9 8237C638
-ABAA 8237C639
-ABAB 8237C730
-ABAC 8237C731
-ABAD 8237C732
-ABAE 8237C733
-ABAF 8237C734
-ABB0 8237C735
-ABB1 8237C736
-ABB2 8237C737
-ABB3 8237C738
-ABB4 8237C739
-ABB5 8237C830
-ABB6 8237C831
-ABB7 8237C832
-ABB8 8237C833
-ABB9 8237C834
-ABBA 8237C835
-ABBB 8237C836
-ABBC 8237C837
-ABBD 8237C838
-ABBE 8237C839
-ABBF 8237C930
-ABC0 8237C931
-ABC1 8237C932
-ABC2 8237C933
-ABC3 8237C934
-ABC4 8237C935
-ABC5 8237C936
-ABC6 8237C937
-ABC7 8237C938
-ABC8 8237C939
-ABC9 8237CA30
-ABCA 8237CA31
-ABCB 8237CA32
-ABCC 8237CA33
-ABCD 8237CA34
-ABCE 8237CA35
-ABCF 8237CA36
-ABD0 8237CA37
-ABD1 8237CA38
-ABD2 8237CA39
-ABD3 8237CB30
-ABD4 8237CB31
-ABD5 8237CB32
-ABD6 8237CB33
-ABD7 8237CB34
-ABD8 8237CB35
-ABD9 8237CB36
-ABDA 8237CB37
-ABDB 8237CB38
-ABDC 8237CB39
-ABDD 8237CC30
-ABDE 8237CC31
-ABDF 8237CC32
-ABE0 8237CC33
-ABE1 8237CC34
-ABE2 8237CC35
-ABE3 8237CC36
-ABE4 8237CC37
-ABE5 8237CC38
-ABE6 8237CC39
-ABE7 8237CD30
-ABE8 8237CD31
-ABE9 8237CD32
-ABEA 8237CD33
-ABEB 8237CD34
-ABEC 8237CD35
-ABED 8237CD36
-ABEE 8237CD37
-ABEF 8237CD38
-ABF0 8237CD39
-ABF1 8237CE30
-ABF2 8237CE31
-ABF3 8237CE32
-ABF4 8237CE33
-ABF5 8237CE34
-ABF6 8237CE35
-ABF7 8237CE36
-ABF8 8237CE37
-ABF9 8237CE38
-ABFA 8237CE39
-ABFB 8237CF30
-ABFC 8237CF31
-ABFD 8237CF32
-ABFE 8237CF33
-ABFF 8237CF34
-AC00 8237CF35
-AC01 8237CF36
-AC02 8237CF37
-AC03 8237CF38
-AC04 8237CF39
-AC05 8237D030
-AC06 8237D031
-AC07 8237D032
-AC08 8237D033
-AC09 8237D034
-AC0A 8237D035
-AC0B 8237D036
-AC0C 8237D037
-AC0D 8237D038
-AC0E 8237D039
-AC0F 8237D130
-AC10 8237D131
-AC11 8237D132
-AC12 8237D133
-AC13 8237D134
-AC14 8237D135
-AC15 8237D136
-AC16 8237D137
-AC17 8237D138
-AC18 8237D139
-AC19 8237D230
-AC1A 8237D231
-AC1B 8237D232
-AC1C 8237D233
-AC1D 8237D234
-AC1E 8237D235
-AC1F 8237D236
-AC20 8237D237
-AC21 8237D238
-AC22 8237D239
-AC23 8237D330
-AC24 8237D331
-AC25 8237D332
-AC26 8237D333
-AC27 8237D334
-AC28 8237D335
-AC29 8237D336
-AC2A 8237D337
-AC2B 8237D338
-AC2C 8237D339
-AC2D 8237D430
-AC2E 8237D431
-AC2F 8237D432
-AC30 8237D433
-AC31 8237D434
-AC32 8237D435
-AC33 8237D436
-AC34 8237D437
-AC35 8237D438
-AC36 8237D439
-AC37 8237D530
-AC38 8237D531
-AC39 8237D532
-AC3A 8237D533
-AC3B 8237D534
-AC3C 8237D535
-AC3D 8237D536
-AC3E 8237D537
-AC3F 8237D538
-AC40 8237D539
-AC41 8237D630
-AC42 8237D631
-AC43 8237D632
-AC44 8237D633
-AC45 8237D634
-AC46 8237D635
-AC47 8237D636
-AC48 8237D637
-AC49 8237D638
-AC4A 8237D639
-AC4B 8237D730
-AC4C 8237D731
-AC4D 8237D732
-AC4E 8237D733
-AC4F 8237D734
-AC50 8237D735
-AC51 8237D736
-AC52 8237D737
-AC53 8237D738
-AC54 8237D739
-AC55 8237D830
-AC56 8237D831
-AC57 8237D832
-AC58 8237D833
-AC59 8237D834
-AC5A 8237D835
-AC5B 8237D836
-AC5C 8237D837
-AC5D 8237D838
-AC5E 8237D839
-AC5F 8237D930
-AC60 8237D931
-AC61 8237D932
-AC62 8237D933
-AC63 8237D934
-AC64 8237D935
-AC65 8237D936
-AC66 8237D937
-AC67 8237D938
-AC68 8237D939
-AC69 8237DA30
-AC6A 8237DA31
-AC6B 8237DA32
-AC6C 8237DA33
-AC6D 8237DA34
-AC6E 8237DA35
-AC6F 8237DA36
-AC70 8237DA37
-AC71 8237DA38
-AC72 8237DA39
-AC73 8237DB30
-AC74 8237DB31
-AC75 8237DB32
-AC76 8237DB33
-AC77 8237DB34
-AC78 8237DB35
-AC79 8237DB36
-AC7A 8237DB37
-AC7B 8237DB38
-AC7C 8237DB39
-AC7D 8237DC30
-AC7E 8237DC31
-AC7F 8237DC32
-AC80 8237DC33
-AC81 8237DC34
-AC82 8237DC35
-AC83 8237DC36
-AC84 8237DC37
-AC85 8237DC38
-AC86 8237DC39
-AC87 8237DD30
-AC88 8237DD31
-AC89 8237DD32
-AC8A 8237DD33
-AC8B 8237DD34
-AC8C 8237DD35
-AC8D 8237DD36
-AC8E 8237DD37
-AC8F 8237DD38
-AC90 8237DD39
-AC91 8237DE30
-AC92 8237DE31
-AC93 8237DE32
-AC94 8237DE33
-AC95 8237DE34
-AC96 8237DE35
-AC97 8237DE36
-AC98 8237DE37
-AC99 8237DE38
-AC9A 8237DE39
-AC9B 8237DF30
-AC9C 8237DF31
-AC9D 8237DF32
-AC9E 8237DF33
-AC9F 8237DF34
-ACA0 8237DF35
-ACA1 8237DF36
-ACA2 8237DF37
-ACA3 8237DF38
-ACA4 8237DF39
-ACA5 8237E030
-ACA6 8237E031
-ACA7 8237E032
-ACA8 8237E033
-ACA9 8237E034
-ACAA 8237E035
-ACAB 8237E036
-ACAC 8237E037
-ACAD 8237E038
-ACAE 8237E039
-ACAF 8237E130
-ACB0 8237E131
-ACB1 8237E132
-ACB2 8237E133
-ACB3 8237E134
-ACB4 8237E135
-ACB5 8237E136
-ACB6 8237E137
-ACB7 8237E138
-ACB8 8237E139
-ACB9 8237E230
-ACBA 8237E231
-ACBB 8237E232
-ACBC 8237E233
-ACBD 8237E234
-ACBE 8237E235
-ACBF 8237E236
-ACC0 8237E237
-ACC1 8237E238
-ACC2 8237E239
-ACC3 8237E330
-ACC4 8237E331
-ACC5 8237E332
-ACC6 8237E333
-ACC7 8237E334
-ACC8 8237E335
-ACC9 8237E336
-ACCA 8237E337
-ACCB 8237E338
-ACCC 8237E339
-ACCD 8237E430
-ACCE 8237E431
-ACCF 8237E432
-ACD0 8237E433
-ACD1 8237E434
-ACD2 8237E435
-ACD3 8237E436
-ACD4 8237E437
-ACD5 8237E438
-ACD6 8237E439
-ACD7 8237E530
-ACD8 8237E531
-ACD9 8237E532
-ACDA 8237E533
-ACDB 8237E534
-ACDC 8237E535
-ACDD 8237E536
-ACDE 8237E537
-ACDF 8237E538
-ACE0 8237E539
-ACE1 8237E630
-ACE2 8237E631
-ACE3 8237E632
-ACE4 8237E633
-ACE5 8237E634
-ACE6 8237E635
-ACE7 8237E636
-ACE8 8237E637
-ACE9 8237E638
-ACEA 8237E639
-ACEB 8237E730
-ACEC 8237E731
-ACED 8237E732
-ACEE 8237E733
-ACEF 8237E734
-ACF0 8237E735
-ACF1 8237E736
-ACF2 8237E737
-ACF3 8237E738
-ACF4 8237E739
-ACF5 8237E830
-ACF6 8237E831
-ACF7 8237E832
-ACF8 8237E833
-ACF9 8237E834
-ACFA 8237E835
-ACFB 8237E836
-ACFC 8237E837
-ACFD 8237E838
-ACFE 8237E839
-ACFF 8237E930
-AD00 8237E931
-AD01 8237E932
-AD02 8237E933
-AD03 8237E934
-AD04 8237E935
-AD05 8237E936
-AD06 8237E937
-AD07 8237E938
-AD08 8237E939
-AD09 8237EA30
-AD0A 8237EA31
-AD0B 8237EA32
-AD0C 8237EA33
-AD0D 8237EA34
-AD0E 8237EA35
-AD0F 8237EA36
-AD10 8237EA37
-AD11 8237EA38
-AD12 8237EA39
-AD13 8237EB30
-AD14 8237EB31
-AD15 8237EB32
-AD16 8237EB33
-AD17 8237EB34
-AD18 8237EB35
-AD19 8237EB36
-AD1A 8237EB37
-AD1B 8237EB38
-AD1C 8237EB39
-AD1D 8237EC30
-AD1E 8237EC31
-AD1F 8237EC32
-AD20 8237EC33
-AD21 8237EC34
-AD22 8237EC35
-AD23 8237EC36
-AD24 8237EC37
-AD25 8237EC38
-AD26 8237EC39
-AD27 8237ED30
-AD28 8237ED31
-AD29 8237ED32
-AD2A 8237ED33
-AD2B 8237ED34
-AD2C 8237ED35
-AD2D 8237ED36
-AD2E 8237ED37
-AD2F 8237ED38
-AD30 8237ED39
-AD31 8237EE30
-AD32 8237EE31
-AD33 8237EE32
-AD34 8237EE33
-AD35 8237EE34
-AD36 8237EE35
-AD37 8237EE36
-AD38 8237EE37
-AD39 8237EE38
-AD3A 8237EE39
-AD3B 8237EF30
-AD3C 8237EF31
-AD3D 8237EF32
-AD3E 8237EF33
-AD3F 8237EF34
-AD40 8237EF35
-AD41 8237EF36
-AD42 8237EF37
-AD43 8237EF38
-AD44 8237EF39
-AD45 8237F030
-AD46 8237F031
-AD47 8237F032
-AD48 8237F033
-AD49 8237F034
-AD4A 8237F035
-AD4B 8237F036
-AD4C 8237F037
-AD4D 8237F038
-AD4E 8237F039
-AD4F 8237F130
-AD50 8237F131
-AD51 8237F132
-AD52 8237F133
-AD53 8237F134
-AD54 8237F135
-AD55 8237F136
-AD56 8237F137
-AD57 8237F138
-AD58 8237F139
-AD59 8237F230
-AD5A 8237F231
-AD5B 8237F232
-AD5C 8237F233
-AD5D 8237F234
-AD5E 8237F235
-AD5F 8237F236
-AD60 8237F237
-AD61 8237F238
-AD62 8237F239
-AD63 8237F330
-AD64 8237F331
-AD65 8237F332
-AD66 8237F333
-AD67 8237F334
-AD68 8237F335
-AD69 8237F336
-AD6A 8237F337
-AD6B 8237F338
-AD6C 8237F339
-AD6D 8237F430
-AD6E 8237F431
-AD6F 8237F432
-AD70 8237F433
-AD71 8237F434
-AD72 8237F435
-AD73 8237F436
-AD74 8237F437
-AD75 8237F438
-AD76 8237F439
-AD77 8237F530
-AD78 8237F531
-AD79 8237F532
-AD7A 8237F533
-AD7B 8237F534
-AD7C 8237F535
-AD7D 8237F536
-AD7E 8237F537
-AD7F 8237F538
-AD80 8237F539
-AD81 8237F630
-AD82 8237F631
-AD83 8237F632
-AD84 8237F633
-AD85 8237F634
-AD86 8237F635
-AD87 8237F636
-AD88 8237F637
-AD89 8237F638
-AD8A 8237F639
-AD8B 8237F730
-AD8C 8237F731
-AD8D 8237F732
-AD8E 8237F733
-AD8F 8237F734
-AD90 8237F735
-AD91 8237F736
-AD92 8237F737
-AD93 8237F738
-AD94 8237F739
-AD95 8237F830
-AD96 8237F831
-AD97 8237F832
-AD98 8237F833
-AD99 8237F834
-AD9A 8237F835
-AD9B 8237F836
-AD9C 8237F837
-AD9D 8237F838
-AD9E 8237F839
-AD9F 8237F930
-ADA0 8237F931
-ADA1 8237F932
-ADA2 8237F933
-ADA3 8237F934
-ADA4 8237F935
-ADA5 8237F936
-ADA6 8237F937
-ADA7 8237F938
-ADA8 8237F939
-ADA9 8237FA30
-ADAA 8237FA31
-ADAB 8237FA32
-ADAC 8237FA33
-ADAD 8237FA34
-ADAE 8237FA35
-ADAF 8237FA36
-ADB0 8237FA37
-ADB1 8237FA38
-ADB2 8237FA39
-ADB3 8237FB30
-ADB4 8237FB31
-ADB5 8237FB32
-ADB6 8237FB33
-ADB7 8237FB34
-ADB8 8237FB35
-ADB9 8237FB36
-ADBA 8237FB37
-ADBB 8237FB38
-ADBC 8237FB39
-ADBD 8237FC30
-ADBE 8237FC31
-ADBF 8237FC32
-ADC0 8237FC33
-ADC1 8237FC34
-ADC2 8237FC35
-ADC3 8237FC36
-ADC4 8237FC37
-ADC5 8237FC38
-ADC6 8237FC39
-ADC7 8237FD30
-ADC8 8237FD31
-ADC9 8237FD32
-ADCA 8237FD33
-ADCB 8237FD34
-ADCC 8237FD35
-ADCD 8237FD36
-ADCE 8237FD37
-ADCF 8237FD38
-ADD0 8237FD39
-ADD1 8237FE30
-ADD2 8237FE31
-ADD3 8237FE32
-ADD4 8237FE33
-ADD5 8237FE34
-ADD6 8237FE35
-ADD7 8237FE36
-ADD8 8237FE37
-ADD9 8237FE38
-ADDA 8237FE39
-ADDB 82388130
-ADDC 82388131
-ADDD 82388132
-ADDE 82388133
-ADDF 82388134
-ADE0 82388135
-ADE1 82388136
-ADE2 82388137
-ADE3 82388138
-ADE4 82388139
-ADE5 82388230
-ADE6 82388231
-ADE7 82388232
-ADE8 82388233
-ADE9 82388234
-ADEA 82388235
-ADEB 82388236
-ADEC 82388237
-ADED 82388238
-ADEE 82388239
-ADEF 82388330
-ADF0 82388331
-ADF1 82388332
-ADF2 82388333
-ADF3 82388334
-ADF4 82388335
-ADF5 82388336
-ADF6 82388337
-ADF7 82388338
-ADF8 82388339
-ADF9 82388430
-ADFA 82388431
-ADFB 82388432
-ADFC 82388433
-ADFD 82388434
-ADFE 82388435
-ADFF 82388436
-AE00 82388437
-AE01 82388438
-AE02 82388439
-AE03 82388530
-AE04 82388531
-AE05 82388532
-AE06 82388533
-AE07 82388534
-AE08 82388535
-AE09 82388536
-AE0A 82388537
-AE0B 82388538
-AE0C 82388539
-AE0D 82388630
-AE0E 82388631
-AE0F 82388632
-AE10 82388633
-AE11 82388634
-AE12 82388635
-AE13 82388636
-AE14 82388637
-AE15 82388638
-AE16 82388639
-AE17 82388730
-AE18 82388731
-AE19 82388732
-AE1A 82388733
-AE1B 82388734
-AE1C 82388735
-AE1D 82388736
-AE1E 82388737
-AE1F 82388738
-AE20 82388739
-AE21 82388830
-AE22 82388831
-AE23 82388832
-AE24 82388833
-AE25 82388834
-AE26 82388835
-AE27 82388836
-AE28 82388837
-AE29 82388838
-AE2A 82388839
-AE2B 82388930
-AE2C 82388931
-AE2D 82388932
-AE2E 82388933
-AE2F 82388934
-AE30 82388935
-AE31 82388936
-AE32 82388937
-AE33 82388938
-AE34 82388939
-AE35 82388A30
-AE36 82388A31
-AE37 82388A32
-AE38 82388A33
-AE39 82388A34
-AE3A 82388A35
-AE3B 82388A36
-AE3C 82388A37
-AE3D 82388A38
-AE3E 82388A39
-AE3F 82388B30
-AE40 82388B31
-AE41 82388B32
-AE42 82388B33
-AE43 82388B34
-AE44 82388B35
-AE45 82388B36
-AE46 82388B37
-AE47 82388B38
-AE48 82388B39
-AE49 82388C30
-AE4A 82388C31
-AE4B 82388C32
-AE4C 82388C33
-AE4D 82388C34
-AE4E 82388C35
-AE4F 82388C36
-AE50 82388C37
-AE51 82388C38
-AE52 82388C39
-AE53 82388D30
-AE54 82388D31
-AE55 82388D32
-AE56 82388D33
-AE57 82388D34
-AE58 82388D35
-AE59 82388D36
-AE5A 82388D37
-AE5B 82388D38
-AE5C 82388D39
-AE5D 82388E30
-AE5E 82388E31
-AE5F 82388E32
-AE60 82388E33
-AE61 82388E34
-AE62 82388E35
-AE63 82388E36
-AE64 82388E37
-AE65 82388E38
-AE66 82388E39
-AE67 82388F30
-AE68 82388F31
-AE69 82388F32
-AE6A 82388F33
-AE6B 82388F34
-AE6C 82388F35
-AE6D 82388F36
-AE6E 82388F37
-AE6F 82388F38
-AE70 82388F39
-AE71 82389030
-AE72 82389031
-AE73 82389032
-AE74 82389033
-AE75 82389034
-AE76 82389035
-AE77 82389036
-AE78 82389037
-AE79 82389038
-AE7A 82389039
-AE7B 82389130
-AE7C 82389131
-AE7D 82389132
-AE7E 82389133
-AE7F 82389134
-AE80 82389135
-AE81 82389136
-AE82 82389137
-AE83 82389138
-AE84 82389139
-AE85 82389230
-AE86 82389231
-AE87 82389232
-AE88 82389233
-AE89 82389234
-AE8A 82389235
-AE8B 82389236
-AE8C 82389237
-AE8D 82389238
-AE8E 82389239
-AE8F 82389330
-AE90 82389331
-AE91 82389332
-AE92 82389333
-AE93 82389334
-AE94 82389335
-AE95 82389336
-AE96 82389337
-AE97 82389338
-AE98 82389339
-AE99 82389430
-AE9A 82389431
-AE9B 82389432
-AE9C 82389433
-AE9D 82389434
-AE9E 82389435
-AE9F 82389436
-AEA0 82389437
-AEA1 82389438
-AEA2 82389439
-AEA3 82389530
-AEA4 82389531
-AEA5 82389532
-AEA6 82389533
-AEA7 82389534
-AEA8 82389535
-AEA9 82389536
-AEAA 82389537
-AEAB 82389538
-AEAC 82389539
-AEAD 82389630
-AEAE 82389631
-AEAF 82389632
-AEB0 82389633
-AEB1 82389634
-AEB2 82389635
-AEB3 82389636
-AEB4 82389637
-AEB5 82389638
-AEB6 82389639
-AEB7 82389730
-AEB8 82389731
-AEB9 82389732
-AEBA 82389733
-AEBB 82389734
-AEBC 82389735
-AEBD 82389736
-AEBE 82389737
-AEBF 82389738
-AEC0 82389739
-AEC1 82389830
-AEC2 82389831
-AEC3 82389832
-AEC4 82389833
-AEC5 82389834
-AEC6 82389835
-AEC7 82389836
-AEC8 82389837
-AEC9 82389838
-AECA 82389839
-AECB 82389930
-AECC 82389931
-AECD 82389932
-AECE 82389933
-AECF 82389934
-AED0 82389935
-AED1 82389936
-AED2 82389937
-AED3 82389938
-AED4 82389939
-AED5 82389A30
-AED6 82389A31
-AED7 82389A32
-AED8 82389A33
-AED9 82389A34
-AEDA 82389A35
-AEDB 82389A36
-AEDC 82389A37
-AEDD 82389A38
-AEDE 82389A39
-AEDF 82389B30
-AEE0 82389B31
-AEE1 82389B32
-AEE2 82389B33
-AEE3 82389B34
-AEE4 82389B35
-AEE5 82389B36
-AEE6 82389B37
-AEE7 82389B38
-AEE8 82389B39
-AEE9 82389C30
-AEEA 82389C31
-AEEB 82389C32
-AEEC 82389C33
-AEED 82389C34
-AEEE 82389C35
-AEEF 82389C36
-AEF0 82389C37
-AEF1 82389C38
-AEF2 82389C39
-AEF3 82389D30
-AEF4 82389D31
-AEF5 82389D32
-AEF6 82389D33
-AEF7 82389D34
-AEF8 82389D35
-AEF9 82389D36
-AEFA 82389D37
-AEFB 82389D38
-AEFC 82389D39
-AEFD 82389E30
-AEFE 82389E31
-AEFF 82389E32
-AF00 82389E33
-AF01 82389E34
-AF02 82389E35
-AF03 82389E36
-AF04 82389E37
-AF05 82389E38
-AF06 82389E39
-AF07 82389F30
-AF08 82389F31
-AF09 82389F32
-AF0A 82389F33
-AF0B 82389F34
-AF0C 82389F35
-AF0D 82389F36
-AF0E 82389F37
-AF0F 82389F38
-AF10 82389F39
-AF11 8238A030
-AF12 8238A031
-AF13 8238A032
-AF14 8238A033
-AF15 8238A034
-AF16 8238A035
-AF17 8238A036
-AF18 8238A037
-AF19 8238A038
-AF1A 8238A039
-AF1B 8238A130
-AF1C 8238A131
-AF1D 8238A132
-AF1E 8238A133
-AF1F 8238A134
-AF20 8238A135
-AF21 8238A136
-AF22 8238A137
-AF23 8238A138
-AF24 8238A139
-AF25 8238A230
-AF26 8238A231
-AF27 8238A232
-AF28 8238A233
-AF29 8238A234
-AF2A 8238A235
-AF2B 8238A236
-AF2C 8238A237
-AF2D 8238A238
-AF2E 8238A239
-AF2F 8238A330
-AF30 8238A331
-AF31 8238A332
-AF32 8238A333
-AF33 8238A334
-AF34 8238A335
-AF35 8238A336
-AF36 8238A337
-AF37 8238A338
-AF38 8238A339
-AF39 8238A430
-AF3A 8238A431
-AF3B 8238A432
-AF3C 8238A433
-AF3D 8238A434
-AF3E 8238A435
-AF3F 8238A436
-AF40 8238A437
-AF41 8238A438
-AF42 8238A439
-AF43 8238A530
-AF44 8238A531
-AF45 8238A532
-AF46 8238A533
-AF47 8238A534
-AF48 8238A535
-AF49 8238A536
-AF4A 8238A537
-AF4B 8238A538
-AF4C 8238A539
-AF4D 8238A630
-AF4E 8238A631
-AF4F 8238A632
-AF50 8238A633
-AF51 8238A634
-AF52 8238A635
-AF53 8238A636
-AF54 8238A637
-AF55 8238A638
-AF56 8238A639
-AF57 8238A730
-AF58 8238A731
-AF59 8238A732
-AF5A 8238A733
-AF5B 8238A734
-AF5C 8238A735
-AF5D 8238A736
-AF5E 8238A737
-AF5F 8238A738
-AF60 8238A739
-AF61 8238A830
-AF62 8238A831
-AF63 8238A832
-AF64 8238A833
-AF65 8238A834
-AF66 8238A835
-AF67 8238A836
-AF68 8238A837
-AF69 8238A838
-AF6A 8238A839
-AF6B 8238A930
-AF6C 8238A931
-AF6D 8238A932
-AF6E 8238A933
-AF6F 8238A934
-AF70 8238A935
-AF71 8238A936
-AF72 8238A937
-AF73 8238A938
-AF74 8238A939
-AF75 8238AA30
-AF76 8238AA31
-AF77 8238AA32
-AF78 8238AA33
-AF79 8238AA34
-AF7A 8238AA35
-AF7B 8238AA36
-AF7C 8238AA37
-AF7D 8238AA38
-AF7E 8238AA39
-AF7F 8238AB30
-AF80 8238AB31
-AF81 8238AB32
-AF82 8238AB33
-AF83 8238AB34
-AF84 8238AB35
-AF85 8238AB36
-AF86 8238AB37
-AF87 8238AB38
-AF88 8238AB39
-AF89 8238AC30
-AF8A 8238AC31
-AF8B 8238AC32
-AF8C 8238AC33
-AF8D 8238AC34
-AF8E 8238AC35
-AF8F 8238AC36
-AF90 8238AC37
-AF91 8238AC38
-AF92 8238AC39
-AF93 8238AD30
-AF94 8238AD31
-AF95 8238AD32
-AF96 8238AD33
-AF97 8238AD34
-AF98 8238AD35
-AF99 8238AD36
-AF9A 8238AD37
-AF9B 8238AD38
-AF9C 8238AD39
-AF9D 8238AE30
-AF9E 8238AE31
-AF9F 8238AE32
-AFA0 8238AE33
-AFA1 8238AE34
-AFA2 8238AE35
-AFA3 8238AE36
-AFA4 8238AE37
-AFA5 8238AE38
-AFA6 8238AE39
-AFA7 8238AF30
-AFA8 8238AF31
-AFA9 8238AF32
-AFAA 8238AF33
-AFAB 8238AF34
-AFAC 8238AF35
-AFAD 8238AF36
-AFAE 8238AF37
-AFAF 8238AF38
-AFB0 8238AF39
-AFB1 8238B030
-AFB2 8238B031
-AFB3 8238B032
-AFB4 8238B033
-AFB5 8238B034
-AFB6 8238B035
-AFB7 8238B036
-AFB8 8238B037
-AFB9 8238B038
-AFBA 8238B039
-AFBB 8238B130
-AFBC 8238B131
-AFBD 8238B132
-AFBE 8238B133
-AFBF 8238B134
-AFC0 8238B135
-AFC1 8238B136
-AFC2 8238B137
-AFC3 8238B138
-AFC4 8238B139
-AFC5 8238B230
-AFC6 8238B231
-AFC7 8238B232
-AFC8 8238B233
-AFC9 8238B234
-AFCA 8238B235
-AFCB 8238B236
-AFCC 8238B237
-AFCD 8238B238
-AFCE 8238B239
-AFCF 8238B330
-AFD0 8238B331
-AFD1 8238B332
-AFD2 8238B333
-AFD3 8238B334
-AFD4 8238B335
-AFD5 8238B336
-AFD6 8238B337
-AFD7 8238B338
-AFD8 8238B339
-AFD9 8238B430
-AFDA 8238B431
-AFDB 8238B432
-AFDC 8238B433
-AFDD 8238B434
-AFDE 8238B435
-AFDF 8238B436
-AFE0 8238B437
-AFE1 8238B438
-AFE2 8238B439
-AFE3 8238B530
-AFE4 8238B531
-AFE5 8238B532
-AFE6 8238B533
-AFE7 8238B534
-AFE8 8238B535
-AFE9 8238B536
-AFEA 8238B537
-AFEB 8238B538
-AFEC 8238B539
-AFED 8238B630
-AFEE 8238B631
-AFEF 8238B632
-AFF0 8238B633
-AFF1 8238B634
-AFF2 8238B635
-AFF3 8238B636
-AFF4 8238B637
-AFF5 8238B638
-AFF6 8238B639
-AFF7 8238B730
-AFF8 8238B731
-AFF9 8238B732
-AFFA 8238B733
-AFFB 8238B734
-AFFC 8238B735
-AFFD 8238B736
-AFFE 8238B737
-AFFF 8238B738
-B000 8238B739
-B001 8238B830
-B002 8238B831
-B003 8238B832
-B004 8238B833
-B005 8238B834
-B006 8238B835
-B007 8238B836
-B008 8238B837
-B009 8238B838
-B00A 8238B839
-B00B 8238B930
-B00C 8238B931
-B00D 8238B932
-B00E 8238B933
-B00F 8238B934
-B010 8238B935
-B011 8238B936
-B012 8238B937
-B013 8238B938
-B014 8238B939
-B015 8238BA30
-B016 8238BA31
-B017 8238BA32
-B018 8238BA33
-B019 8238BA34
-B01A 8238BA35
-B01B 8238BA36
-B01C 8238BA37
-B01D 8238BA38
-B01E 8238BA39
-B01F 8238BB30
-B020 8238BB31
-B021 8238BB32
-B022 8238BB33
-B023 8238BB34
-B024 8238BB35
-B025 8238BB36
-B026 8238BB37
-B027 8238BB38
-B028 8238BB39
-B029 8238BC30
-B02A 8238BC31
-B02B 8238BC32
-B02C 8238BC33
-B02D 8238BC34
-B02E 8238BC35
-B02F 8238BC36
-B030 8238BC37
-B031 8238BC38
-B032 8238BC39
-B033 8238BD30
-B034 8238BD31
-B035 8238BD32
-B036 8238BD33
-B037 8238BD34
-B038 8238BD35
-B039 8238BD36
-B03A 8238BD37
-B03B 8238BD38
-B03C 8238BD39
-B03D 8238BE30
-B03E 8238BE31
-B03F 8238BE32
-B040 8238BE33
-B041 8238BE34
-B042 8238BE35
-B043 8238BE36
-B044 8238BE37
-B045 8238BE38
-B046 8238BE39
-B047 8238BF30
-B048 8238BF31
-B049 8238BF32
-B04A 8238BF33
-B04B 8238BF34
-B04C 8238BF35
-B04D 8238BF36
-B04E 8238BF37
-B04F 8238BF38
-B050 8238BF39
-B051 8238C030
-B052 8238C031
-B053 8238C032
-B054 8238C033
-B055 8238C034
-B056 8238C035
-B057 8238C036
-B058 8238C037
-B059 8238C038
-B05A 8238C039
-B05B 8238C130
-B05C 8238C131
-B05D 8238C132
-B05E 8238C133
-B05F 8238C134
-B060 8238C135
-B061 8238C136
-B062 8238C137
-B063 8238C138
-B064 8238C139
-B065 8238C230
-B066 8238C231
-B067 8238C232
-B068 8238C233
-B069 8238C234
-B06A 8238C235
-B06B 8238C236
-B06C 8238C237
-B06D 8238C238
-B06E 8238C239
-B06F 8238C330
-B070 8238C331
-B071 8238C332
-B072 8238C333
-B073 8238C334
-B074 8238C335
-B075 8238C336
-B076 8238C337
-B077 8238C338
-B078 8238C339
-B079 8238C430
-B07A 8238C431
-B07B 8238C432
-B07C 8238C433
-B07D 8238C434
-B07E 8238C435
-B07F 8238C436
-B080 8238C437
-B081 8238C438
-B082 8238C439
-B083 8238C530
-B084 8238C531
-B085 8238C532
-B086 8238C533
-B087 8238C534
-B088 8238C535
-B089 8238C536
-B08A 8238C537
-B08B 8238C538
-B08C 8238C539
-B08D 8238C630
-B08E 8238C631
-B08F 8238C632
-B090 8238C633
-B091 8238C634
-B092 8238C635
-B093 8238C636
-B094 8238C637
-B095 8238C638
-B096 8238C639
-B097 8238C730
-B098 8238C731
-B099 8238C732
-B09A 8238C733
-B09B 8238C734
-B09C 8238C735
-B09D 8238C736
-B09E 8238C737
-B09F 8238C738
-B0A0 8238C739
-B0A1 8238C830
-B0A2 8238C831
-B0A3 8238C832
-B0A4 8238C833
-B0A5 8238C834
-B0A6 8238C835
-B0A7 8238C836
-B0A8 8238C837
-B0A9 8238C838
-B0AA 8238C839
-B0AB 8238C930
-B0AC 8238C931
-B0AD 8238C932
-B0AE 8238C933
-B0AF 8238C934
-B0B0 8238C935
-B0B1 8238C936
-B0B2 8238C937
-B0B3 8238C938
-B0B4 8238C939
-B0B5 8238CA30
-B0B6 8238CA31
-B0B7 8238CA32
-B0B8 8238CA33
-B0B9 8238CA34
-B0BA 8238CA35
-B0BB 8238CA36
-B0BC 8238CA37
-B0BD 8238CA38
-B0BE 8238CA39
-B0BF 8238CB30
-B0C0 8238CB31
-B0C1 8238CB32
-B0C2 8238CB33
-B0C3 8238CB34
-B0C4 8238CB35
-B0C5 8238CB36
-B0C6 8238CB37
-B0C7 8238CB38
-B0C8 8238CB39
-B0C9 8238CC30
-B0CA 8238CC31
-B0CB 8238CC32
-B0CC 8238CC33
-B0CD 8238CC34
-B0CE 8238CC35
-B0CF 8238CC36
-B0D0 8238CC37
-B0D1 8238CC38
-B0D2 8238CC39
-B0D3 8238CD30
-B0D4 8238CD31
-B0D5 8238CD32
-B0D6 8238CD33
-B0D7 8238CD34
-B0D8 8238CD35
-B0D9 8238CD36
-B0DA 8238CD37
-B0DB 8238CD38
-B0DC 8238CD39
-B0DD 8238CE30
-B0DE 8238CE31
-B0DF 8238CE32
-B0E0 8238CE33
-B0E1 8238CE34
-B0E2 8238CE35
-B0E3 8238CE36
-B0E4 8238CE37
-B0E5 8238CE38
-B0E6 8238CE39
-B0E7 8238CF30
-B0E8 8238CF31
-B0E9 8238CF32
-B0EA 8238CF33
-B0EB 8238CF34
-B0EC 8238CF35
-B0ED 8238CF36
-B0EE 8238CF37
-B0EF 8238CF38
-B0F0 8238CF39
-B0F1 8238D030
-B0F2 8238D031
-B0F3 8238D032
-B0F4 8238D033
-B0F5 8238D034
-B0F6 8238D035
-B0F7 8238D036
-B0F8 8238D037
-B0F9 8238D038
-B0FA 8238D039
-B0FB 8238D130
-B0FC 8238D131
-B0FD 8238D132
-B0FE 8238D133
-B0FF 8238D134
-B100 8238D135
-B101 8238D136
-B102 8238D137
-B103 8238D138
-B104 8238D139
-B105 8238D230
-B106 8238D231
-B107 8238D232
-B108 8238D233
-B109 8238D234
-B10A 8238D235
-B10B 8238D236
-B10C 8238D237
-B10D 8238D238
-B10E 8238D239
-B10F 8238D330
-B110 8238D331
-B111 8238D332
-B112 8238D333
-B113 8238D334
-B114 8238D335
-B115 8238D336
-B116 8238D337
-B117 8238D338
-B118 8238D339
-B119 8238D430
-B11A 8238D431
-B11B 8238D432
-B11C 8238D433
-B11D 8238D434
-B11E 8238D435
-B11F 8238D436
-B120 8238D437
-B121 8238D438
-B122 8238D439
-B123 8238D530
-B124 8238D531
-B125 8238D532
-B126 8238D533
-B127 8238D534
-B128 8238D535
-B129 8238D536
-B12A 8238D537
-B12B 8238D538
-B12C 8238D539
-B12D 8238D630
-B12E 8238D631
-B12F 8238D632
-B130 8238D633
-B131 8238D634
-B132 8238D635
-B133 8238D636
-B134 8238D637
-B135 8238D638
-B136 8238D639
-B137 8238D730
-B138 8238D731
-B139 8238D732
-B13A 8238D733
-B13B 8238D734
-B13C 8238D735
-B13D 8238D736
-B13E 8238D737
-B13F 8238D738
-B140 8238D739
-B141 8238D830
-B142 8238D831
-B143 8238D832
-B144 8238D833
-B145 8238D834
-B146 8238D835
-B147 8238D836
-B148 8238D837
-B149 8238D838
-B14A 8238D839
-B14B 8238D930
-B14C 8238D931
-B14D 8238D932
-B14E 8238D933
-B14F 8238D934
-B150 8238D935
-B151 8238D936
-B152 8238D937
-B153 8238D938
-B154 8238D939
-B155 8238DA30
-B156 8238DA31
-B157 8238DA32
-B158 8238DA33
-B159 8238DA34
-B15A 8238DA35
-B15B 8238DA36
-B15C 8238DA37
-B15D 8238DA38
-B15E 8238DA39
-B15F 8238DB30
-B160 8238DB31
-B161 8238DB32
-B162 8238DB33
-B163 8238DB34
-B164 8238DB35
-B165 8238DB36
-B166 8238DB37
-B167 8238DB38
-B168 8238DB39
-B169 8238DC30
-B16A 8238DC31
-B16B 8238DC32
-B16C 8238DC33
-B16D 8238DC34
-B16E 8238DC35
-B16F 8238DC36
-B170 8238DC37
-B171 8238DC38
-B172 8238DC39
-B173 8238DD30
-B174 8238DD31
-B175 8238DD32
-B176 8238DD33
-B177 8238DD34
-B178 8238DD35
-B179 8238DD36
-B17A 8238DD37
-B17B 8238DD38
-B17C 8238DD39
-B17D 8238DE30
-B17E 8238DE31
-B17F 8238DE32
-B180 8238DE33
-B181 8238DE34
-B182 8238DE35
-B183 8238DE36
-B184 8238DE37
-B185 8238DE38
-B186 8238DE39
-B187 8238DF30
-B188 8238DF31
-B189 8238DF32
-B18A 8238DF33
-B18B 8238DF34
-B18C 8238DF35
-B18D 8238DF36
-B18E 8238DF37
-B18F 8238DF38
-B190 8238DF39
-B191 8238E030
-B192 8238E031
-B193 8238E032
-B194 8238E033
-B195 8238E034
-B196 8238E035
-B197 8238E036
-B198 8238E037
-B199 8238E038
-B19A 8238E039
-B19B 8238E130
-B19C 8238E131
-B19D 8238E132
-B19E 8238E133
-B19F 8238E134
-B1A0 8238E135
-B1A1 8238E136
-B1A2 8238E137
-B1A3 8238E138
-B1A4 8238E139
-B1A5 8238E230
-B1A6 8238E231
-B1A7 8238E232
-B1A8 8238E233
-B1A9 8238E234
-B1AA 8238E235
-B1AB 8238E236
-B1AC 8238E237
-B1AD 8238E238
-B1AE 8238E239
-B1AF 8238E330
-B1B0 8238E331
-B1B1 8238E332
-B1B2 8238E333
-B1B3 8238E334
-B1B4 8238E335
-B1B5 8238E336
-B1B6 8238E337
-B1B7 8238E338
-B1B8 8238E339
-B1B9 8238E430
-B1BA 8238E431
-B1BB 8238E432
-B1BC 8238E433
-B1BD 8238E434
-B1BE 8238E435
-B1BF 8238E436
-B1C0 8238E437
-B1C1 8238E438
-B1C2 8238E439
-B1C3 8238E530
-B1C4 8238E531
-B1C5 8238E532
-B1C6 8238E533
-B1C7 8238E534
-B1C8 8238E535
-B1C9 8238E536
-B1CA 8238E537
-B1CB 8238E538
-B1CC 8238E539
-B1CD 8238E630
-B1CE 8238E631
-B1CF 8238E632
-B1D0 8238E633
-B1D1 8238E634
-B1D2 8238E635
-B1D3 8238E636
-B1D4 8238E637
-B1D5 8238E638
-B1D6 8238E639
-B1D7 8238E730
-B1D8 8238E731
-B1D9 8238E732
-B1DA 8238E733
-B1DB 8238E734
-B1DC 8238E735
-B1DD 8238E736
-B1DE 8238E737
-B1DF 8238E738
-B1E0 8238E739
-B1E1 8238E830
-B1E2 8238E831
-B1E3 8238E832
-B1E4 8238E833
-B1E5 8238E834
-B1E6 8238E835
-B1E7 8238E836
-B1E8 8238E837
-B1E9 8238E838
-B1EA 8238E839
-B1EB 8238E930
-B1EC 8238E931
-B1ED 8238E932
-B1EE 8238E933
-B1EF 8238E934
-B1F0 8238E935
-B1F1 8238E936
-B1F2 8238E937
-B1F3 8238E938
-B1F4 8238E939
-B1F5 8238EA30
-B1F6 8238EA31
-B1F7 8238EA32
-B1F8 8238EA33
-B1F9 8238EA34
-B1FA 8238EA35
-B1FB 8238EA36
-B1FC 8238EA37
-B1FD 8238EA38
-B1FE 8238EA39
-B1FF 8238EB30
-B200 8238EB31
-B201 8238EB32
-B202 8238EB33
-B203 8238EB34
-B204 8238EB35
-B205 8238EB36
-B206 8238EB37
-B207 8238EB38
-B208 8238EB39
-B209 8238EC30
-B20A 8238EC31
-B20B 8238EC32
-B20C 8238EC33
-B20D 8238EC34
-B20E 8238EC35
-B20F 8238EC36
-B210 8238EC37
-B211 8238EC38
-B212 8238EC39
-B213 8238ED30
-B214 8238ED31
-B215 8238ED32
-B216 8238ED33
-B217 8238ED34
-B218 8238ED35
-B219 8238ED36
-B21A 8238ED37
-B21B 8238ED38
-B21C 8238ED39
-B21D 8238EE30
-B21E 8238EE31
-B21F 8238EE32
-B220 8238EE33
-B221 8238EE34
-B222 8238EE35
-B223 8238EE36
-B224 8238EE37
-B225 8238EE38
-B226 8238EE39
-B227 8238EF30
-B228 8238EF31
-B229 8238EF32
-B22A 8238EF33
-B22B 8238EF34
-B22C 8238EF35
-B22D 8238EF36
-B22E 8238EF37
-B22F 8238EF38
-B230 8238EF39
-B231 8238F030
-B232 8238F031
-B233 8238F032
-B234 8238F033
-B235 8238F034
-B236 8238F035
-B237 8238F036
-B238 8238F037
-B239 8238F038
-B23A 8238F039
-B23B 8238F130
-B23C 8238F131
-B23D 8238F132
-B23E 8238F133
-B23F 8238F134
-B240 8238F135
-B241 8238F136
-B242 8238F137
-B243 8238F138
-B244 8238F139
-B245 8238F230
-B246 8238F231
-B247 8238F232
-B248 8238F233
-B249 8238F234
-B24A 8238F235
-B24B 8238F236
-B24C 8238F237
-B24D 8238F238
-B24E 8238F239
-B24F 8238F330
-B250 8238F331
-B251 8238F332
-B252 8238F333
-B253 8238F334
-B254 8238F335
-B255 8238F336
-B256 8238F337
-B257 8238F338
-B258 8238F339
-B259 8238F430
-B25A 8238F431
-B25B 8238F432
-B25C 8238F433
-B25D 8238F434
-B25E 8238F435
-B25F 8238F436
-B260 8238F437
-B261 8238F438
-B262 8238F439
-B263 8238F530
-B264 8238F531
-B265 8238F532
-B266 8238F533
-B267 8238F534
-B268 8238F535
-B269 8238F536
-B26A 8238F537
-B26B 8238F538
-B26C 8238F539
-B26D 8238F630
-B26E 8238F631
-B26F 8238F632
-B270 8238F633
-B271 8238F634
-B272 8238F635
-B273 8238F636
-B274 8238F637
-B275 8238F638
-B276 8238F639
-B277 8238F730
-B278 8238F731
-B279 8238F732
-B27A 8238F733
-B27B 8238F734
-B27C 8238F735
-B27D 8238F736
-B27E 8238F737
-B27F 8238F738
-B280 8238F739
-B281 8238F830
-B282 8238F831
-B283 8238F832
-B284 8238F833
-B285 8238F834
-B286 8238F835
-B287 8238F836
-B288 8238F837
-B289 8238F838
-B28A 8238F839
-B28B 8238F930
-B28C 8238F931
-B28D 8238F932
-B28E 8238F933
-B28F 8238F934
-B290 8238F935
-B291 8238F936
-B292 8238F937
-B293 8238F938
-B294 8238F939
-B295 8238FA30
-B296 8238FA31
-B297 8238FA32
-B298 8238FA33
-B299 8238FA34
-B29A 8238FA35
-B29B 8238FA36
-B29C 8238FA37
-B29D 8238FA38
-B29E 8238FA39
-B29F 8238FB30
-B2A0 8238FB31
-B2A1 8238FB32
-B2A2 8238FB33
-B2A3 8238FB34
-B2A4 8238FB35
-B2A5 8238FB36
-B2A6 8238FB37
-B2A7 8238FB38
-B2A8 8238FB39
-B2A9 8238FC30
-B2AA 8238FC31
-B2AB 8238FC32
-B2AC 8238FC33
-B2AD 8238FC34
-B2AE 8238FC35
-B2AF 8238FC36
-B2B0 8238FC37
-B2B1 8238FC38
-B2B2 8238FC39
-B2B3 8238FD30
-B2B4 8238FD31
-B2B5 8238FD32
-B2B6 8238FD33
-B2B7 8238FD34
-B2B8 8238FD35
-B2B9 8238FD36
-B2BA 8238FD37
-B2BB 8238FD38
-B2BC 8238FD39
-B2BD 8238FE30
-B2BE 8238FE31
-B2BF 8238FE32
-B2C0 8238FE33
-B2C1 8238FE34
-B2C2 8238FE35
-B2C3 8238FE36
-B2C4 8238FE37
-B2C5 8238FE38
-B2C6 8238FE39
-B2C7 82398130
-B2C8 82398131
-B2C9 82398132
-B2CA 82398133
-B2CB 82398134
-B2CC 82398135
-B2CD 82398136
-B2CE 82398137
-B2CF 82398138
-B2D0 82398139
-B2D1 82398230
-B2D2 82398231
-B2D3 82398232
-B2D4 82398233
-B2D5 82398234
-B2D6 82398235
-B2D7 82398236
-B2D8 82398237
-B2D9 82398238
-B2DA 82398239
-B2DB 82398330
-B2DC 82398331
-B2DD 82398332
-B2DE 82398333
-B2DF 82398334
-B2E0 82398335
-B2E1 82398336
-B2E2 82398337
-B2E3 82398338
-B2E4 82398339
-B2E5 82398430
-B2E6 82398431
-B2E7 82398432
-B2E8 82398433
-B2E9 82398434
-B2EA 82398435
-B2EB 82398436
-B2EC 82398437
-B2ED 82398438
-B2EE 82398439
-B2EF 82398530
-B2F0 82398531
-B2F1 82398532
-B2F2 82398533
-B2F3 82398534
-B2F4 82398535
-B2F5 82398536
-B2F6 82398537
-B2F7 82398538
-B2F8 82398539
-B2F9 82398630
-B2FA 82398631
-B2FB 82398632
-B2FC 82398633
-B2FD 82398634
-B2FE 82398635
-B2FF 82398636
-B300 82398637
-B301 82398638
-B302 82398639
-B303 82398730
-B304 82398731
-B305 82398732
-B306 82398733
-B307 82398734
-B308 82398735
-B309 82398736
-B30A 82398737
-B30B 82398738
-B30C 82398739
-B30D 82398830
-B30E 82398831
-B30F 82398832
-B310 82398833
-B311 82398834
-B312 82398835
-B313 82398836
-B314 82398837
-B315 82398838
-B316 82398839
-B317 82398930
-B318 82398931
-B319 82398932
-B31A 82398933
-B31B 82398934
-B31C 82398935
-B31D 82398936
-B31E 82398937
-B31F 82398938
-B320 82398939
-B321 82398A30
-B322 82398A31
-B323 82398A32
-B324 82398A33
-B325 82398A34
-B326 82398A35
-B327 82398A36
-B328 82398A37
-B329 82398A38
-B32A 82398A39
-B32B 82398B30
-B32C 82398B31
-B32D 82398B32
-B32E 82398B33
-B32F 82398B34
-B330 82398B35
-B331 82398B36
-B332 82398B37
-B333 82398B38
-B334 82398B39
-B335 82398C30
-B336 82398C31
-B337 82398C32
-B338 82398C33
-B339 82398C34
-B33A 82398C35
-B33B 82398C36
-B33C 82398C37
-B33D 82398C38
-B33E 82398C39
-B33F 82398D30
-B340 82398D31
-B341 82398D32
-B342 82398D33
-B343 82398D34
-B344 82398D35
-B345 82398D36
-B346 82398D37
-B347 82398D38
-B348 82398D39
-B349 82398E30
-B34A 82398E31
-B34B 82398E32
-B34C 82398E33
-B34D 82398E34
-B34E 82398E35
-B34F 82398E36
-B350 82398E37
-B351 82398E38
-B352 82398E39
-B353 82398F30
-B354 82398F31
-B355 82398F32
-B356 82398F33
-B357 82398F34
-B358 82398F35
-B359 82398F36
-B35A 82398F37
-B35B 82398F38
-B35C 82398F39
-B35D 82399030
-B35E 82399031
-B35F 82399032
-B360 82399033
-B361 82399034
-B362 82399035
-B363 82399036
-B364 82399037
-B365 82399038
-B366 82399039
-B367 82399130
-B368 82399131
-B369 82399132
-B36A 82399133
-B36B 82399134
-B36C 82399135
-B36D 82399136
-B36E 82399137
-B36F 82399138
-B370 82399139
-B371 82399230
-B372 82399231
-B373 82399232
-B374 82399233
-B375 82399234
-B376 82399235
-B377 82399236
-B378 82399237
-B379 82399238
-B37A 82399239
-B37B 82399330
-B37C 82399331
-B37D 82399332
-B37E 82399333
-B37F 82399334
-B380 82399335
-B381 82399336
-B382 82399337
-B383 82399338
-B384 82399339
-B385 82399430
-B386 82399431
-B387 82399432
-B388 82399433
-B389 82399434
-B38A 82399435
-B38B 82399436
-B38C 82399437
-B38D 82399438
-B38E 82399439
-B38F 82399530
-B390 82399531
-B391 82399532
-B392 82399533
-B393 82399534
-B394 82399535
-B395 82399536
-B396 82399537
-B397 82399538
-B398 82399539
-B399 82399630
-B39A 82399631
-B39B 82399632
-B39C 82399633
-B39D 82399634
-B39E 82399635
-B39F 82399636
-B3A0 82399637
-B3A1 82399638
-B3A2 82399639
-B3A3 82399730
-B3A4 82399731
-B3A5 82399732
-B3A6 82399733
-B3A7 82399734
-B3A8 82399735
-B3A9 82399736
-B3AA 82399737
-B3AB 82399738
-B3AC 82399739
-B3AD 82399830
-B3AE 82399831
-B3AF 82399832
-B3B0 82399833
-B3B1 82399834
-B3B2 82399835
-B3B3 82399836
-B3B4 82399837
-B3B5 82399838
-B3B6 82399839
-B3B7 82399930
-B3B8 82399931
-B3B9 82399932
-B3BA 82399933
-B3BB 82399934
-B3BC 82399935
-B3BD 82399936
-B3BE 82399937
-B3BF 82399938
-B3C0 82399939
-B3C1 82399A30
-B3C2 82399A31
-B3C3 82399A32
-B3C4 82399A33
-B3C5 82399A34
-B3C6 82399A35
-B3C7 82399A36
-B3C8 82399A37
-B3C9 82399A38
-B3CA 82399A39
-B3CB 82399B30
-B3CC 82399B31
-B3CD 82399B32
-B3CE 82399B33
-B3CF 82399B34
-B3D0 82399B35
-B3D1 82399B36
-B3D2 82399B37
-B3D3 82399B38
-B3D4 82399B39
-B3D5 82399C30
-B3D6 82399C31
-B3D7 82399C32
-B3D8 82399C33
-B3D9 82399C34
-B3DA 82399C35
-B3DB 82399C36
-B3DC 82399C37
-B3DD 82399C38
-B3DE 82399C39
-B3DF 82399D30
-B3E0 82399D31
-B3E1 82399D32
-B3E2 82399D33
-B3E3 82399D34
-B3E4 82399D35
-B3E5 82399D36
-B3E6 82399D37
-B3E7 82399D38
-B3E8 82399D39
-B3E9 82399E30
-B3EA 82399E31
-B3EB 82399E32
-B3EC 82399E33
-B3ED 82399E34
-B3EE 82399E35
-B3EF 82399E36
-B3F0 82399E37
-B3F1 82399E38
-B3F2 82399E39
-B3F3 82399F30
-B3F4 82399F31
-B3F5 82399F32
-B3F6 82399F33
-B3F7 82399F34
-B3F8 82399F35
-B3F9 82399F36
-B3FA 82399F37
-B3FB 82399F38
-B3FC 82399F39
-B3FD 8239A030
-B3FE 8239A031
-B3FF 8239A032
-B400 8239A033
-B401 8239A034
-B402 8239A035
-B403 8239A036
-B404 8239A037
-B405 8239A038
-B406 8239A039
-B407 8239A130
-B408 8239A131
-B409 8239A132
-B40A 8239A133
-B40B 8239A134
-B40C 8239A135
-B40D 8239A136
-B40E 8239A137
-B40F 8239A138
-B410 8239A139
-B411 8239A230
-B412 8239A231
-B413 8239A232
-B414 8239A233
-B415 8239A234
-B416 8239A235
-B417 8239A236
-B418 8239A237
-B419 8239A238
-B41A 8239A239
-B41B 8239A330
-B41C 8239A331
-B41D 8239A332
-B41E 8239A333
-B41F 8239A334
-B420 8239A335
-B421 8239A336
-B422 8239A337
-B423 8239A338
-B424 8239A339
-B425 8239A430
-B426 8239A431
-B427 8239A432
-B428 8239A433
-B429 8239A434
-B42A 8239A435
-B42B 8239A436
-B42C 8239A437
-B42D 8239A438
-B42E 8239A439
-B42F 8239A530
-B430 8239A531
-B431 8239A532
-B432 8239A533
-B433 8239A534
-B434 8239A535
-B435 8239A536
-B436 8239A537
-B437 8239A538
-B438 8239A539
-B439 8239A630
-B43A 8239A631
-B43B 8239A632
-B43C 8239A633
-B43D 8239A634
-B43E 8239A635
-B43F 8239A636
-B440 8239A637
-B441 8239A638
-B442 8239A639
-B443 8239A730
-B444 8239A731
-B445 8239A732
-B446 8239A733
-B447 8239A734
-B448 8239A735
-B449 8239A736
-B44A 8239A737
-B44B 8239A738
-B44C 8239A739
-B44D 8239A830
-B44E 8239A831
-B44F 8239A832
-B450 8239A833
-B451 8239A834
-B452 8239A835
-B453 8239A836
-B454 8239A837
-B455 8239A838
-B456 8239A839
-B457 8239A930
-B458 8239A931
-B459 8239A932
-B45A 8239A933
-B45B 8239A934
-B45C 8239A935
-B45D 8239A936
-B45E 8239A937
-B45F 8239A938
-B460 8239A939
-B461 8239AA30
-B462 8239AA31
-B463 8239AA32
-B464 8239AA33
-B465 8239AA34
-B466 8239AA35
-B467 8239AA36
-B468 8239AA37
-B469 8239AA38
-B46A 8239AA39
-B46B 8239AB30
-B46C 8239AB31
-B46D 8239AB32
-B46E 8239AB33
-B46F 8239AB34
-B470 8239AB35
-B471 8239AB36
-B472 8239AB37
-B473 8239AB38
-B474 8239AB39
-B475 8239AC30
-B476 8239AC31
-B477 8239AC32
-B478 8239AC33
-B479 8239AC34
-B47A 8239AC35
-B47B 8239AC36
-B47C 8239AC37
-B47D 8239AC38
-B47E 8239AC39
-B47F 8239AD30
-B480 8239AD31
-B481 8239AD32
-B482 8239AD33
-B483 8239AD34
-B484 8239AD35
-B485 8239AD36
-B486 8239AD37
-B487 8239AD38
-B488 8239AD39
-B489 8239AE30
-B48A 8239AE31
-B48B 8239AE32
-B48C 8239AE33
-B48D 8239AE34
-B48E 8239AE35
-B48F 8239AE36
-B490 8239AE37
-B491 8239AE38
-B492 8239AE39
-B493 8239AF30
-B494 8239AF31
-B495 8239AF32
-B496 8239AF33
-B497 8239AF34
-B498 8239AF35
-B499 8239AF36
-B49A 8239AF37
-B49B 8239AF38
-B49C 8239AF39
-B49D 8239B030
-B49E 8239B031
-B49F 8239B032
-B4A0 8239B033
-B4A1 8239B034
-B4A2 8239B035
-B4A3 8239B036
-B4A4 8239B037
-B4A5 8239B038
-B4A6 8239B039
-B4A7 8239B130
-B4A8 8239B131
-B4A9 8239B132
-B4AA 8239B133
-B4AB 8239B134
-B4AC 8239B135
-B4AD 8239B136
-B4AE 8239B137
-B4AF 8239B138
-B4B0 8239B139
-B4B1 8239B230
-B4B2 8239B231
-B4B3 8239B232
-B4B4 8239B233
-B4B5 8239B234
-B4B6 8239B235
-B4B7 8239B236
-B4B8 8239B237
-B4B9 8239B238
-B4BA 8239B239
-B4BB 8239B330
-B4BC 8239B331
-B4BD 8239B332
-B4BE 8239B333
-B4BF 8239B334
-B4C0 8239B335
-B4C1 8239B336
-B4C2 8239B337
-B4C3 8239B338
-B4C4 8239B339
-B4C5 8239B430
-B4C6 8239B431
-B4C7 8239B432
-B4C8 8239B433
-B4C9 8239B434
-B4CA 8239B435
-B4CB 8239B436
-B4CC 8239B437
-B4CD 8239B438
-B4CE 8239B439
-B4CF 8239B530
-B4D0 8239B531
-B4D1 8239B532
-B4D2 8239B533
-B4D3 8239B534
-B4D4 8239B535
-B4D5 8239B536
-B4D6 8239B537
-B4D7 8239B538
-B4D8 8239B539
-B4D9 8239B630
-B4DA 8239B631
-B4DB 8239B632
-B4DC 8239B633
-B4DD 8239B634
-B4DE 8239B635
-B4DF 8239B636
-B4E0 8239B637
-B4E1 8239B638
-B4E2 8239B639
-B4E3 8239B730
-B4E4 8239B731
-B4E5 8239B732
-B4E6 8239B733
-B4E7 8239B734
-B4E8 8239B735
-B4E9 8239B736
-B4EA 8239B737
-B4EB 8239B738
-B4EC 8239B739
-B4ED 8239B830
-B4EE 8239B831
-B4EF 8239B832
-B4F0 8239B833
-B4F1 8239B834
-B4F2 8239B835
-B4F3 8239B836
-B4F4 8239B837
-B4F5 8239B838
-B4F6 8239B839
-B4F7 8239B930
-B4F8 8239B931
-B4F9 8239B932
-B4FA 8239B933
-B4FB 8239B934
-B4FC 8239B935
-B4FD 8239B936
-B4FE 8239B937
-B4FF 8239B938
-B500 8239B939
-B501 8239BA30
-B502 8239BA31
-B503 8239BA32
-B504 8239BA33
-B505 8239BA34
-B506 8239BA35
-B507 8239BA36
-B508 8239BA37
-B509 8239BA38
-B50A 8239BA39
-B50B 8239BB30
-B50C 8239BB31
-B50D 8239BB32
-B50E 8239BB33
-B50F 8239BB34
-B510 8239BB35
-B511 8239BB36
-B512 8239BB37
-B513 8239BB38
-B514 8239BB39
-B515 8239BC30
-B516 8239BC31
-B517 8239BC32
-B518 8239BC33
-B519 8239BC34
-B51A 8239BC35
-B51B 8239BC36
-B51C 8239BC37
-B51D 8239BC38
-B51E 8239BC39
-B51F 8239BD30
-B520 8239BD31
-B521 8239BD32
-B522 8239BD33
-B523 8239BD34
-B524 8239BD35
-B525 8239BD36
-B526 8239BD37
-B527 8239BD38
-B528 8239BD39
-B529 8239BE30
-B52A 8239BE31
-B52B 8239BE32
-B52C 8239BE33
-B52D 8239BE34
-B52E 8239BE35
-B52F 8239BE36
-B530 8239BE37
-B531 8239BE38
-B532 8239BE39
-B533 8239BF30
-B534 8239BF31
-B535 8239BF32
-B536 8239BF33
-B537 8239BF34
-B538 8239BF35
-B539 8239BF36
-B53A 8239BF37
-B53B 8239BF38
-B53C 8239BF39
-B53D 8239C030
-B53E 8239C031
-B53F 8239C032
-B540 8239C033
-B541 8239C034
-B542 8239C035
-B543 8239C036
-B544 8239C037
-B545 8239C038
-B546 8239C039
-B547 8239C130
-B548 8239C131
-B549 8239C132
-B54A 8239C133
-B54B 8239C134
-B54C 8239C135
-B54D 8239C136
-B54E 8239C137
-B54F 8239C138
-B550 8239C139
-B551 8239C230
-B552 8239C231
-B553 8239C232
-B554 8239C233
-B555 8239C234
-B556 8239C235
-B557 8239C236
-B558 8239C237
-B559 8239C238
-B55A 8239C239
-B55B 8239C330
-B55C 8239C331
-B55D 8239C332
-B55E 8239C333
-B55F 8239C334
-B560 8239C335
-B561 8239C336
-B562 8239C337
-B563 8239C338
-B564 8239C339
-B565 8239C430
-B566 8239C431
-B567 8239C432
-B568 8239C433
-B569 8239C434
-B56A 8239C435
-B56B 8239C436
-B56C 8239C437
-B56D 8239C438
-B56E 8239C439
-B56F 8239C530
-B570 8239C531
-B571 8239C532
-B572 8239C533
-B573 8239C534
-B574 8239C535
-B575 8239C536
-B576 8239C537
-B577 8239C538
-B578 8239C539
-B579 8239C630
-B57A 8239C631
-B57B 8239C632
-B57C 8239C633
-B57D 8239C634
-B57E 8239C635
-B57F 8239C636
-B580 8239C637
-B581 8239C638
-B582 8239C639
-B583 8239C730
-B584 8239C731
-B585 8239C732
-B586 8239C733
-B587 8239C734
-B588 8239C735
-B589 8239C736
-B58A 8239C737
-B58B 8239C738
-B58C 8239C739
-B58D 8239C830
-B58E 8239C831
-B58F 8239C832
-B590 8239C833
-B591 8239C834
-B592 8239C835
-B593 8239C836
-B594 8239C837
-B595 8239C838
-B596 8239C839
-B597 8239C930
-B598 8239C931
-B599 8239C932
-B59A 8239C933
-B59B 8239C934
-B59C 8239C935
-B59D 8239C936
-B59E 8239C937
-B59F 8239C938
-B5A0 8239C939
-B5A1 8239CA30
-B5A2 8239CA31
-B5A3 8239CA32
-B5A4 8239CA33
-B5A5 8239CA34
-B5A6 8239CA35
-B5A7 8239CA36
-B5A8 8239CA37
-B5A9 8239CA38
-B5AA 8239CA39
-B5AB 8239CB30
-B5AC 8239CB31
-B5AD 8239CB32
-B5AE 8239CB33
-B5AF 8239CB34
-B5B0 8239CB35
-B5B1 8239CB36
-B5B2 8239CB37
-B5B3 8239CB38
-B5B4 8239CB39
-B5B5 8239CC30
-B5B6 8239CC31
-B5B7 8239CC32
-B5B8 8239CC33
-B5B9 8239CC34
-B5BA 8239CC35
-B5BB 8239CC36
-B5BC 8239CC37
-B5BD 8239CC38
-B5BE 8239CC39
-B5BF 8239CD30
-B5C0 8239CD31
-B5C1 8239CD32
-B5C2 8239CD33
-B5C3 8239CD34
-B5C4 8239CD35
-B5C5 8239CD36
-B5C6 8239CD37
-B5C7 8239CD38
-B5C8 8239CD39
-B5C9 8239CE30
-B5CA 8239CE31
-B5CB 8239CE32
-B5CC 8239CE33
-B5CD 8239CE34
-B5CE 8239CE35
-B5CF 8239CE36
-B5D0 8239CE37
-B5D1 8239CE38
-B5D2 8239CE39
-B5D3 8239CF30
-B5D4 8239CF31
-B5D5 8239CF32
-B5D6 8239CF33
-B5D7 8239CF34
-B5D8 8239CF35
-B5D9 8239CF36
-B5DA 8239CF37
-B5DB 8239CF38
-B5DC 8239CF39
-B5DD 8239D030
-B5DE 8239D031
-B5DF 8239D032
-B5E0 8239D033
-B5E1 8239D034
-B5E2 8239D035
-B5E3 8239D036
-B5E4 8239D037
-B5E5 8239D038
-B5E6 8239D039
-B5E7 8239D130
-B5E8 8239D131
-B5E9 8239D132
-B5EA 8239D133
-B5EB 8239D134
-B5EC 8239D135
-B5ED 8239D136
-B5EE 8239D137
-B5EF 8239D138
-B5F0 8239D139
-B5F1 8239D230
-B5F2 8239D231
-B5F3 8239D232
-B5F4 8239D233
-B5F5 8239D234
-B5F6 8239D235
-B5F7 8239D236
-B5F8 8239D237
-B5F9 8239D238
-B5FA 8239D239
-B5FB 8239D330
-B5FC 8239D331
-B5FD 8239D332
-B5FE 8239D333
-B5FF 8239D334
-B600 8239D335
-B601 8239D336
-B602 8239D337
-B603 8239D338
-B604 8239D339
-B605 8239D430
-B606 8239D431
-B607 8239D432
-B608 8239D433
-B609 8239D434
-B60A 8239D435
-B60B 8239D436
-B60C 8239D437
-B60D 8239D438
-B60E 8239D439
-B60F 8239D530
-B610 8239D531
-B611 8239D532
-B612 8239D533
-B613 8239D534
-B614 8239D535
-B615 8239D536
-B616 8239D537
-B617 8239D538
-B618 8239D539
-B619 8239D630
-B61A 8239D631
-B61B 8239D632
-B61C 8239D633
-B61D 8239D634
-B61E 8239D635
-B61F 8239D636
-B620 8239D637
-B621 8239D638
-B622 8239D639
-B623 8239D730
-B624 8239D731
-B625 8239D732
-B626 8239D733
-B627 8239D734
-B628 8239D735
-B629 8239D736
-B62A 8239D737
-B62B 8239D738
-B62C 8239D739
-B62D 8239D830
-B62E 8239D831
-B62F 8239D832
-B630 8239D833
-B631 8239D834
-B632 8239D835
-B633 8239D836
-B634 8239D837
-B635 8239D838
-B636 8239D839
-B637 8239D930
-B638 8239D931
-B639 8239D932
-B63A 8239D933
-B63B 8239D934
-B63C 8239D935
-B63D 8239D936
-B63E 8239D937
-B63F 8239D938
-B640 8239D939
-B641 8239DA30
-B642 8239DA31
-B643 8239DA32
-B644 8239DA33
-B645 8239DA34
-B646 8239DA35
-B647 8239DA36
-B648 8239DA37
-B649 8239DA38
-B64A 8239DA39
-B64B 8239DB30
-B64C 8239DB31
-B64D 8239DB32
-B64E 8239DB33
-B64F 8239DB34
-B650 8239DB35
-B651 8239DB36
-B652 8239DB37
-B653 8239DB38
-B654 8239DB39
-B655 8239DC30
-B656 8239DC31
-B657 8239DC32
-B658 8239DC33
-B659 8239DC34
-B65A 8239DC35
-B65B 8239DC36
-B65C 8239DC37
-B65D 8239DC38
-B65E 8239DC39
-B65F 8239DD30
-B660 8239DD31
-B661 8239DD32
-B662 8239DD33
-B663 8239DD34
-B664 8239DD35
-B665 8239DD36
-B666 8239DD37
-B667 8239DD38
-B668 8239DD39
-B669 8239DE30
-B66A 8239DE31
-B66B 8239DE32
-B66C 8239DE33
-B66D 8239DE34
-B66E 8239DE35
-B66F 8239DE36
-B670 8239DE37
-B671 8239DE38
-B672 8239DE39
-B673 8239DF30
-B674 8239DF31
-B675 8239DF32
-B676 8239DF33
-B677 8239DF34
-B678 8239DF35
-B679 8239DF36
-B67A 8239DF37
-B67B 8239DF38
-B67C 8239DF39
-B67D 8239E030
-B67E 8239E031
-B67F 8239E032
-B680 8239E033
-B681 8239E034
-B682 8239E035
-B683 8239E036
-B684 8239E037
-B685 8239E038
-B686 8239E039
-B687 8239E130
-B688 8239E131
-B689 8239E132
-B68A 8239E133
-B68B 8239E134
-B68C 8239E135
-B68D 8239E136
-B68E 8239E137
-B68F 8239E138
-B690 8239E139
-B691 8239E230
-B692 8239E231
-B693 8239E232
-B694 8239E233
-B695 8239E234
-B696 8239E235
-B697 8239E236
-B698 8239E237
-B699 8239E238
-B69A 8239E239
-B69B 8239E330
-B69C 8239E331
-B69D 8239E332
-B69E 8239E333
-B69F 8239E334
-B6A0 8239E335
-B6A1 8239E336
-B6A2 8239E337
-B6A3 8239E338
-B6A4 8239E339
-B6A5 8239E430
-B6A6 8239E431
-B6A7 8239E432
-B6A8 8239E433
-B6A9 8239E434
-B6AA 8239E435
-B6AB 8239E436
-B6AC 8239E437
-B6AD 8239E438
-B6AE 8239E439
-B6AF 8239E530
-B6B0 8239E531
-B6B1 8239E532
-B6B2 8239E533
-B6B3 8239E534
-B6B4 8239E535
-B6B5 8239E536
-B6B6 8239E537
-B6B7 8239E538
-B6B8 8239E539
-B6B9 8239E630
-B6BA 8239E631
-B6BB 8239E632
-B6BC 8239E633
-B6BD 8239E634
-B6BE 8239E635
-B6BF 8239E636
-B6C0 8239E637
-B6C1 8239E638
-B6C2 8239E639
-B6C3 8239E730
-B6C4 8239E731
-B6C5 8239E732
-B6C6 8239E733
-B6C7 8239E734
-B6C8 8239E735
-B6C9 8239E736
-B6CA 8239E737
-B6CB 8239E738
-B6CC 8239E739
-B6CD 8239E830
-B6CE 8239E831
-B6CF 8239E832
-B6D0 8239E833
-B6D1 8239E834
-B6D2 8239E835
-B6D3 8239E836
-B6D4 8239E837
-B6D5 8239E838
-B6D6 8239E839
-B6D7 8239E930
-B6D8 8239E931
-B6D9 8239E932
-B6DA 8239E933
-B6DB 8239E934
-B6DC 8239E935
-B6DD 8239E936
-B6DE 8239E937
-B6DF 8239E938
-B6E0 8239E939
-B6E1 8239EA30
-B6E2 8239EA31
-B6E3 8239EA32
-B6E4 8239EA33
-B6E5 8239EA34
-B6E6 8239EA35
-B6E7 8239EA36
-B6E8 8239EA37
-B6E9 8239EA38
-B6EA 8239EA39
-B6EB 8239EB30
-B6EC 8239EB31
-B6ED 8239EB32
-B6EE 8239EB33
-B6EF 8239EB34
-B6F0 8239EB35
-B6F1 8239EB36
-B6F2 8239EB37
-B6F3 8239EB38
-B6F4 8239EB39
-B6F5 8239EC30
-B6F6 8239EC31
-B6F7 8239EC32
-B6F8 8239EC33
-B6F9 8239EC34
-B6FA 8239EC35
-B6FB 8239EC36
-B6FC 8239EC37
-B6FD 8239EC38
-B6FE 8239EC39
-B6FF 8239ED30
-B700 8239ED31
-B701 8239ED32
-B702 8239ED33
-B703 8239ED34
-B704 8239ED35
-B705 8239ED36
-B706 8239ED37
-B707 8239ED38
-B708 8239ED39
-B709 8239EE30
-B70A 8239EE31
-B70B 8239EE32
-B70C 8239EE33
-B70D 8239EE34
-B70E 8239EE35
-B70F 8239EE36
-B710 8239EE37
-B711 8239EE38
-B712 8239EE39
-B713 8239EF30
-B714 8239EF31
-B715 8239EF32
-B716 8239EF33
-B717 8239EF34
-B718 8239EF35
-B719 8239EF36
-B71A 8239EF37
-B71B 8239EF38
-B71C 8239EF39
-B71D 8239F030
-B71E 8239F031
-B71F 8239F032
-B720 8239F033
-B721 8239F034
-B722 8239F035
-B723 8239F036
-B724 8239F037
-B725 8239F038
-B726 8239F039
-B727 8239F130
-B728 8239F131
-B729 8239F132
-B72A 8239F133
-B72B 8239F134
-B72C 8239F135
-B72D 8239F136
-B72E 8239F137
-B72F 8239F138
-B730 8239F139
-B731 8239F230
-B732 8239F231
-B733 8239F232
-B734 8239F233
-B735 8239F234
-B736 8239F235
-B737 8239F236
-B738 8239F237
-B739 8239F238
-B73A 8239F239
-B73B 8239F330
-B73C 8239F331
-B73D 8239F332
-B73E 8239F333
-B73F 8239F334
-B740 8239F335
-B741 8239F336
-B742 8239F337
-B743 8239F338
-B744 8239F339
-B745 8239F430
-B746 8239F431
-B747 8239F432
-B748 8239F433
-B749 8239F434
-B74A 8239F435
-B74B 8239F436
-B74C 8239F437
-B74D 8239F438
-B74E 8239F439
-B74F 8239F530
-B750 8239F531
-B751 8239F532
-B752 8239F533
-B753 8239F534
-B754 8239F535
-B755 8239F536
-B756 8239F537
-B757 8239F538
-B758 8239F539
-B759 8239F630
-B75A 8239F631
-B75B 8239F632
-B75C 8239F633
-B75D 8239F634
-B75E 8239F635
-B75F 8239F636
-B760 8239F637
-B761 8239F638
-B762 8239F639
-B763 8239F730
-B764 8239F731
-B765 8239F732
-B766 8239F733
-B767 8239F734
-B768 8239F735
-B769 8239F736
-B76A 8239F737
-B76B 8239F738
-B76C 8239F739
-B76D 8239F830
-B76E 8239F831
-B76F 8239F832
-B770 8239F833
-B771 8239F834
-B772 8239F835
-B773 8239F836
-B774 8239F837
-B775 8239F838
-B776 8239F839
-B777 8239F930
-B778 8239F931
-B779 8239F932
-B77A 8239F933
-B77B 8239F934
-B77C 8239F935
-B77D 8239F936
-B77E 8239F937
-B77F 8239F938
-B780 8239F939
-B781 8239FA30
-B782 8239FA31
-B783 8239FA32
-B784 8239FA33
-B785 8239FA34
-B786 8239FA35
-B787 8239FA36
-B788 8239FA37
-B789 8239FA38
-B78A 8239FA39
-B78B 8239FB30
-B78C 8239FB31
-B78D 8239FB32
-B78E 8239FB33
-B78F 8239FB34
-B790 8239FB35
-B791 8239FB36
-B792 8239FB37
-B793 8239FB38
-B794 8239FB39
-B795 8239FC30
-B796 8239FC31
-B797 8239FC32
-B798 8239FC33
-B799 8239FC34
-B79A 8239FC35
-B79B 8239FC36
-B79C 8239FC37
-B79D 8239FC38
-B79E 8239FC39
-B79F 8239FD30
-B7A0 8239FD31
-B7A1 8239FD32
-B7A2 8239FD33
-B7A3 8239FD34
-B7A4 8239FD35
-B7A5 8239FD36
-B7A6 8239FD37
-B7A7 8239FD38
-B7A8 8239FD39
-B7A9 8239FE30
-B7AA 8239FE31
-B7AB 8239FE32
-B7AC 8239FE33
-B7AD 8239FE34
-B7AE 8239FE35
-B7AF 8239FE36
-B7B0 8239FE37
-B7B1 8239FE38
-B7B2 8239FE39
-B7B3 83308130
-B7B4 83308131
-B7B5 83308132
-B7B6 83308133
-B7B7 83308134
-B7B8 83308135
-B7B9 83308136
-B7BA 83308137
-B7BB 83308138
-B7BC 83308139
-B7BD 83308230
-B7BE 83308231
-B7BF 83308232
-B7C0 83308233
-B7C1 83308234
-B7C2 83308235
-B7C3 83308236
-B7C4 83308237
-B7C5 83308238
-B7C6 83308239
-B7C7 83308330
-B7C8 83308331
-B7C9 83308332
-B7CA 83308333
-B7CB 83308334
-B7CC 83308335
-B7CD 83308336
-B7CE 83308337
-B7CF 83308338
-B7D0 83308339
-B7D1 83308430
-B7D2 83308431
-B7D3 83308432
-B7D4 83308433
-B7D5 83308434
-B7D6 83308435
-B7D7 83308436
-B7D8 83308437
-B7D9 83308438
-B7DA 83308439
-B7DB 83308530
-B7DC 83308531
-B7DD 83308532
-B7DE 83308533
-B7DF 83308534
-B7E0 83308535
-B7E1 83308536
-B7E2 83308537
-B7E3 83308538
-B7E4 83308539
-B7E5 83308630
-B7E6 83308631
-B7E7 83308632
-B7E8 83308633
-B7E9 83308634
-B7EA 83308635
-B7EB 83308636
-B7EC 83308637
-B7ED 83308638
-B7EE 83308639
-B7EF 83308730
-B7F0 83308731
-B7F1 83308732
-B7F2 83308733
-B7F3 83308734
-B7F4 83308735
-B7F5 83308736
-B7F6 83308737
-B7F7 83308738
-B7F8 83308739
-B7F9 83308830
-B7FA 83308831
-B7FB 83308832
-B7FC 83308833
-B7FD 83308834
-B7FE 83308835
-B7FF 83308836
-B800 83308837
-B801 83308838
-B802 83308839
-B803 83308930
-B804 83308931
-B805 83308932
-B806 83308933
-B807 83308934
-B808 83308935
-B809 83308936
-B80A 83308937
-B80B 83308938
-B80C 83308939
-B80D 83308A30
-B80E 83308A31
-B80F 83308A32
-B810 83308A33
-B811 83308A34
-B812 83308A35
-B813 83308A36
-B814 83308A37
-B815 83308A38
-B816 83308A39
-B817 83308B30
-B818 83308B31
-B819 83308B32
-B81A 83308B33
-B81B 83308B34
-B81C 83308B35
-B81D 83308B36
-B81E 83308B37
-B81F 83308B38
-B820 83308B39
-B821 83308C30
-B822 83308C31
-B823 83308C32
-B824 83308C33
-B825 83308C34
-B826 83308C35
-B827 83308C36
-B828 83308C37
-B829 83308C38
-B82A 83308C39
-B82B 83308D30
-B82C 83308D31
-B82D 83308D32
-B82E 83308D33
-B82F 83308D34
-B830 83308D35
-B831 83308D36
-B832 83308D37
-B833 83308D38
-B834 83308D39
-B835 83308E30
-B836 83308E31
-B837 83308E32
-B838 83308E33
-B839 83308E34
-B83A 83308E35
-B83B 83308E36
-B83C 83308E37
-B83D 83308E38
-B83E 83308E39
-B83F 83308F30
-B840 83308F31
-B841 83308F32
-B842 83308F33
-B843 83308F34
-B844 83308F35
-B845 83308F36
-B846 83308F37
-B847 83308F38
-B848 83308F39
-B849 83309030
-B84A 83309031
-B84B 83309032
-B84C 83309033
-B84D 83309034
-B84E 83309035
-B84F 83309036
-B850 83309037
-B851 83309038
-B852 83309039
-B853 83309130
-B854 83309131
-B855 83309132
-B856 83309133
-B857 83309134
-B858 83309135
-B859 83309136
-B85A 83309137
-B85B 83309138
-B85C 83309139
-B85D 83309230
-B85E 83309231
-B85F 83309232
-B860 83309233
-B861 83309234
-B862 83309235
-B863 83309236
-B864 83309237
-B865 83309238
-B866 83309239
-B867 83309330
-B868 83309331
-B869 83309332
-B86A 83309333
-B86B 83309334
-B86C 83309335
-B86D 83309336
-B86E 83309337
-B86F 83309338
-B870 83309339
-B871 83309430
-B872 83309431
-B873 83309432
-B874 83309433
-B875 83309434
-B876 83309435
-B877 83309436
-B878 83309437
-B879 83309438
-B87A 83309439
-B87B 83309530
-B87C 83309531
-B87D 83309532
-B87E 83309533
-B87F 83309534
-B880 83309535
-B881 83309536
-B882 83309537
-B883 83309538
-B884 83309539
-B885 83309630
-B886 83309631
-B887 83309632
-B888 83309633
-B889 83309634
-B88A 83309635
-B88B 83309636
-B88C 83309637
-B88D 83309638
-B88E 83309639
-B88F 83309730
-B890 83309731
-B891 83309732
-B892 83309733
-B893 83309734
-B894 83309735
-B895 83309736
-B896 83309737
-B897 83309738
-B898 83309739
-B899 83309830
-B89A 83309831
-B89B 83309832
-B89C 83309833
-B89D 83309834
-B89E 83309835
-B89F 83309836
-B8A0 83309837
-B8A1 83309838
-B8A2 83309839
-B8A3 83309930
-B8A4 83309931
-B8A5 83309932
-B8A6 83309933
-B8A7 83309934
-B8A8 83309935
-B8A9 83309936
-B8AA 83309937
-B8AB 83309938
-B8AC 83309939
-B8AD 83309A30
-B8AE 83309A31
-B8AF 83309A32
-B8B0 83309A33
-B8B1 83309A34
-B8B2 83309A35
-B8B3 83309A36
-B8B4 83309A37
-B8B5 83309A38
-B8B6 83309A39
-B8B7 83309B30
-B8B8 83309B31
-B8B9 83309B32
-B8BA 83309B33
-B8BB 83309B34
-B8BC 83309B35
-B8BD 83309B36
-B8BE 83309B37
-B8BF 83309B38
-B8C0 83309B39
-B8C1 83309C30
-B8C2 83309C31
-B8C3 83309C32
-B8C4 83309C33
-B8C5 83309C34
-B8C6 83309C35
-B8C7 83309C36
-B8C8 83309C37
-B8C9 83309C38
-B8CA 83309C39
-B8CB 83309D30
-B8CC 83309D31
-B8CD 83309D32
-B8CE 83309D33
-B8CF 83309D34
-B8D0 83309D35
-B8D1 83309D36
-B8D2 83309D37
-B8D3 83309D38
-B8D4 83309D39
-B8D5 83309E30
-B8D6 83309E31
-B8D7 83309E32
-B8D8 83309E33
-B8D9 83309E34
-B8DA 83309E35
-B8DB 83309E36
-B8DC 83309E37
-B8DD 83309E38
-B8DE 83309E39
-B8DF 83309F30
-B8E0 83309F31
-B8E1 83309F32
-B8E2 83309F33
-B8E3 83309F34
-B8E4 83309F35
-B8E5 83309F36
-B8E6 83309F37
-B8E7 83309F38
-B8E8 83309F39
-B8E9 8330A030
-B8EA 8330A031
-B8EB 8330A032
-B8EC 8330A033
-B8ED 8330A034
-B8EE 8330A035
-B8EF 8330A036
-B8F0 8330A037
-B8F1 8330A038
-B8F2 8330A039
-B8F3 8330A130
-B8F4 8330A131
-B8F5 8330A132
-B8F6 8330A133
-B8F7 8330A134
-B8F8 8330A135
-B8F9 8330A136
-B8FA 8330A137
-B8FB 8330A138
-B8FC 8330A139
-B8FD 8330A230
-B8FE 8330A231
-B8FF 8330A232
-B900 8330A233
-B901 8330A234
-B902 8330A235
-B903 8330A236
-B904 8330A237
-B905 8330A238
-B906 8330A239
-B907 8330A330
-B908 8330A331
-B909 8330A332
-B90A 8330A333
-B90B 8330A334
-B90C 8330A335
-B90D 8330A336
-B90E 8330A337
-B90F 8330A338
-B910 8330A339
-B911 8330A430
-B912 8330A431
-B913 8330A432
-B914 8330A433
-B915 8330A434
-B916 8330A435
-B917 8330A436
-B918 8330A437
-B919 8330A438
-B91A 8330A439
-B91B 8330A530
-B91C 8330A531
-B91D 8330A532
-B91E 8330A533
-B91F 8330A534
-B920 8330A535
-B921 8330A536
-B922 8330A537
-B923 8330A538
-B924 8330A539
-B925 8330A630
-B926 8330A631
-B927 8330A632
-B928 8330A633
-B929 8330A634
-B92A 8330A635
-B92B 8330A636
-B92C 8330A637
-B92D 8330A638
-B92E 8330A639
-B92F 8330A730
-B930 8330A731
-B931 8330A732
-B932 8330A733
-B933 8330A734
-B934 8330A735
-B935 8330A736
-B936 8330A737
-B937 8330A738
-B938 8330A739
-B939 8330A830
-B93A 8330A831
-B93B 8330A832
-B93C 8330A833
-B93D 8330A834
-B93E 8330A835
-B93F 8330A836
-B940 8330A837
-B941 8330A838
-B942 8330A839
-B943 8330A930
-B944 8330A931
-B945 8330A932
-B946 8330A933
-B947 8330A934
-B948 8330A935
-B949 8330A936
-B94A 8330A937
-B94B 8330A938
-B94C 8330A939
-B94D 8330AA30
-B94E 8330AA31
-B94F 8330AA32
-B950 8330AA33
-B951 8330AA34
-B952 8330AA35
-B953 8330AA36
-B954 8330AA37
-B955 8330AA38
-B956 8330AA39
-B957 8330AB30
-B958 8330AB31
-B959 8330AB32
-B95A 8330AB33
-B95B 8330AB34
-B95C 8330AB35
-B95D 8330AB36
-B95E 8330AB37
-B95F 8330AB38
-B960 8330AB39
-B961 8330AC30
-B962 8330AC31
-B963 8330AC32
-B964 8330AC33
-B965 8330AC34
-B966 8330AC35
-B967 8330AC36
-B968 8330AC37
-B969 8330AC38
-B96A 8330AC39
-B96B 8330AD30
-B96C 8330AD31
-B96D 8330AD32
-B96E 8330AD33
-B96F 8330AD34
-B970 8330AD35
-B971 8330AD36
-B972 8330AD37
-B973 8330AD38
-B974 8330AD39
-B975 8330AE30
-B976 8330AE31
-B977 8330AE32
-B978 8330AE33
-B979 8330AE34
-B97A 8330AE35
-B97B 8330AE36
-B97C 8330AE37
-B97D 8330AE38
-B97E 8330AE39
-B97F 8330AF30
-B980 8330AF31
-B981 8330AF32
-B982 8330AF33
-B983 8330AF34
-B984 8330AF35
-B985 8330AF36
-B986 8330AF37
-B987 8330AF38
-B988 8330AF39
-B989 8330B030
-B98A 8330B031
-B98B 8330B032
-B98C 8330B033
-B98D 8330B034
-B98E 8330B035
-B98F 8330B036
-B990 8330B037
-B991 8330B038
-B992 8330B039
-B993 8330B130
-B994 8330B131
-B995 8330B132
-B996 8330B133
-B997 8330B134
-B998 8330B135
-B999 8330B136
-B99A 8330B137
-B99B 8330B138
-B99C 8330B139
-B99D 8330B230
-B99E 8330B231
-B99F 8330B232
-B9A0 8330B233
-B9A1 8330B234
-B9A2 8330B235
-B9A3 8330B236
-B9A4 8330B237
-B9A5 8330B238
-B9A6 8330B239
-B9A7 8330B330
-B9A8 8330B331
-B9A9 8330B332
-B9AA 8330B333
-B9AB 8330B334
-B9AC 8330B335
-B9AD 8330B336
-B9AE 8330B337
-B9AF 8330B338
-B9B0 8330B339
-B9B1 8330B430
-B9B2 8330B431
-B9B3 8330B432
-B9B4 8330B433
-B9B5 8330B434
-B9B6 8330B435
-B9B7 8330B436
-B9B8 8330B437
-B9B9 8330B438
-B9BA 8330B439
-B9BB 8330B530
-B9BC 8330B531
-B9BD 8330B532
-B9BE 8330B533
-B9BF 8330B534
-B9C0 8330B535
-B9C1 8330B536
-B9C2 8330B537
-B9C3 8330B538
-B9C4 8330B539
-B9C5 8330B630
-B9C6 8330B631
-B9C7 8330B632
-B9C8 8330B633
-B9C9 8330B634
-B9CA 8330B635
-B9CB 8330B636
-B9CC 8330B637
-B9CD 8330B638
-B9CE 8330B639
-B9CF 8330B730
-B9D0 8330B731
-B9D1 8330B732
-B9D2 8330B733
-B9D3 8330B734
-B9D4 8330B735
-B9D5 8330B736
-B9D6 8330B737
-B9D7 8330B738
-B9D8 8330B739
-B9D9 8330B830
-B9DA 8330B831
-B9DB 8330B832
-B9DC 8330B833
-B9DD 8330B834
-B9DE 8330B835
-B9DF 8330B836
-B9E0 8330B837
-B9E1 8330B838
-B9E2 8330B839
-B9E3 8330B930
-B9E4 8330B931
-B9E5 8330B932
-B9E6 8330B933
-B9E7 8330B934
-B9E8 8330B935
-B9E9 8330B936
-B9EA 8330B937
-B9EB 8330B938
-B9EC 8330B939
-B9ED 8330BA30
-B9EE 8330BA31
-B9EF 8330BA32
-B9F0 8330BA33
-B9F1 8330BA34
-B9F2 8330BA35
-B9F3 8330BA36
-B9F4 8330BA37
-B9F5 8330BA38
-B9F6 8330BA39
-B9F7 8330BB30
-B9F8 8330BB31
-B9F9 8330BB32
-B9FA 8330BB33
-B9FB 8330BB34
-B9FC 8330BB35
-B9FD 8330BB36
-B9FE 8330BB37
-B9FF 8330BB38
-BA00 8330BB39
-BA01 8330BC30
-BA02 8330BC31
-BA03 8330BC32
-BA04 8330BC33
-BA05 8330BC34
-BA06 8330BC35
-BA07 8330BC36
-BA08 8330BC37
-BA09 8330BC38
-BA0A 8330BC39
-BA0B 8330BD30
-BA0C 8330BD31
-BA0D 8330BD32
-BA0E 8330BD33
-BA0F 8330BD34
-BA10 8330BD35
-BA11 8330BD36
-BA12 8330BD37
-BA13 8330BD38
-BA14 8330BD39
-BA15 8330BE30
-BA16 8330BE31
-BA17 8330BE32
-BA18 8330BE33
-BA19 8330BE34
-BA1A 8330BE35
-BA1B 8330BE36
-BA1C 8330BE37
-BA1D 8330BE38
-BA1E 8330BE39
-BA1F 8330BF30
-BA20 8330BF31
-BA21 8330BF32
-BA22 8330BF33
-BA23 8330BF34
-BA24 8330BF35
-BA25 8330BF36
-BA26 8330BF37
-BA27 8330BF38
-BA28 8330BF39
-BA29 8330C030
-BA2A 8330C031
-BA2B 8330C032
-BA2C 8330C033
-BA2D 8330C034
-BA2E 8330C035
-BA2F 8330C036
-BA30 8330C037
-BA31 8330C038
-BA32 8330C039
-BA33 8330C130
-BA34 8330C131
-BA35 8330C132
-BA36 8330C133
-BA37 8330C134
-BA38 8330C135
-BA39 8330C136
-BA3A 8330C137
-BA3B 8330C138
-BA3C 8330C139
-BA3D 8330C230
-BA3E 8330C231
-BA3F 8330C232
-BA40 8330C233
-BA41 8330C234
-BA42 8330C235
-BA43 8330C236
-BA44 8330C237
-BA45 8330C238
-BA46 8330C239
-BA47 8330C330
-BA48 8330C331
-BA49 8330C332
-BA4A 8330C333
-BA4B 8330C334
-BA4C 8330C335
-BA4D 8330C336
-BA4E 8330C337
-BA4F 8330C338
-BA50 8330C339
-BA51 8330C430
-BA52 8330C431
-BA53 8330C432
-BA54 8330C433
-BA55 8330C434
-BA56 8330C435
-BA57 8330C436
-BA58 8330C437
-BA59 8330C438
-BA5A 8330C439
-BA5B 8330C530
-BA5C 8330C531
-BA5D 8330C532
-BA5E 8330C533
-BA5F 8330C534
-BA60 8330C535
-BA61 8330C536
-BA62 8330C537
-BA63 8330C538
-BA64 8330C539
-BA65 8330C630
-BA66 8330C631
-BA67 8330C632
-BA68 8330C633
-BA69 8330C634
-BA6A 8330C635
-BA6B 8330C636
-BA6C 8330C637
-BA6D 8330C638
-BA6E 8330C639
-BA6F 8330C730
-BA70 8330C731
-BA71 8330C732
-BA72 8330C733
-BA73 8330C734
-BA74 8330C735
-BA75 8330C736
-BA76 8330C737
-BA77 8330C738
-BA78 8330C739
-BA79 8330C830
-BA7A 8330C831
-BA7B 8330C832
-BA7C 8330C833
-BA7D 8330C834
-BA7E 8330C835
-BA7F 8330C836
-BA80 8330C837
-BA81 8330C838
-BA82 8330C839
-BA83 8330C930
-BA84 8330C931
-BA85 8330C932
-BA86 8330C933
-BA87 8330C934
-BA88 8330C935
-BA89 8330C936
-BA8A 8330C937
-BA8B 8330C938
-BA8C 8330C939
-BA8D 8330CA30
-BA8E 8330CA31
-BA8F 8330CA32
-BA90 8330CA33
-BA91 8330CA34
-BA92 8330CA35
-BA93 8330CA36
-BA94 8330CA37
-BA95 8330CA38
-BA96 8330CA39
-BA97 8330CB30
-BA98 8330CB31
-BA99 8330CB32
-BA9A 8330CB33
-BA9B 8330CB34
-BA9C 8330CB35
-BA9D 8330CB36
-BA9E 8330CB37
-BA9F 8330CB38
-BAA0 8330CB39
-BAA1 8330CC30
-BAA2 8330CC31
-BAA3 8330CC32
-BAA4 8330CC33
-BAA5 8330CC34
-BAA6 8330CC35
-BAA7 8330CC36
-BAA8 8330CC37
-BAA9 8330CC38
-BAAA 8330CC39
-BAAB 8330CD30
-BAAC 8330CD31
-BAAD 8330CD32
-BAAE 8330CD33
-BAAF 8330CD34
-BAB0 8330CD35
-BAB1 8330CD36
-BAB2 8330CD37
-BAB3 8330CD38
-BAB4 8330CD39
-BAB5 8330CE30
-BAB6 8330CE31
-BAB7 8330CE32
-BAB8 8330CE33
-BAB9 8330CE34
-BABA 8330CE35
-BABB 8330CE36
-BABC 8330CE37
-BABD 8330CE38
-BABE 8330CE39
-BABF 8330CF30
-BAC0 8330CF31
-BAC1 8330CF32
-BAC2 8330CF33
-BAC3 8330CF34
-BAC4 8330CF35
-BAC5 8330CF36
-BAC6 8330CF37
-BAC7 8330CF38
-BAC8 8330CF39
-BAC9 8330D030
-BACA 8330D031
-BACB 8330D032
-BACC 8330D033
-BACD 8330D034
-BACE 8330D035
-BACF 8330D036
-BAD0 8330D037
-BAD1 8330D038
-BAD2 8330D039
-BAD3 8330D130
-BAD4 8330D131
-BAD5 8330D132
-BAD6 8330D133
-BAD7 8330D134
-BAD8 8330D135
-BAD9 8330D136
-BADA 8330D137
-BADB 8330D138
-BADC 8330D139
-BADD 8330D230
-BADE 8330D231
-BADF 8330D232
-BAE0 8330D233
-BAE1 8330D234
-BAE2 8330D235
-BAE3 8330D236
-BAE4 8330D237
-BAE5 8330D238
-BAE6 8330D239
-BAE7 8330D330
-BAE8 8330D331
-BAE9 8330D332
-BAEA 8330D333
-BAEB 8330D334
-BAEC 8330D335
-BAED 8330D336
-BAEE 8330D337
-BAEF 8330D338
-BAF0 8330D339
-BAF1 8330D430
-BAF2 8330D431
-BAF3 8330D432
-BAF4 8330D433
-BAF5 8330D434
-BAF6 8330D435
-BAF7 8330D436
-BAF8 8330D437
-BAF9 8330D438
-BAFA 8330D439
-BAFB 8330D530
-BAFC 8330D531
-BAFD 8330D532
-BAFE 8330D533
-BAFF 8330D534
-BB00 8330D535
-BB01 8330D536
-BB02 8330D537
-BB03 8330D538
-BB04 8330D539
-BB05 8330D630
-BB06 8330D631
-BB07 8330D632
-BB08 8330D633
-BB09 8330D634
-BB0A 8330D635
-BB0B 8330D636
-BB0C 8330D637
-BB0D 8330D638
-BB0E 8330D639
-BB0F 8330D730
-BB10 8330D731
-BB11 8330D732
-BB12 8330D733
-BB13 8330D734
-BB14 8330D735
-BB15 8330D736
-BB16 8330D737
-BB17 8330D738
-BB18 8330D739
-BB19 8330D830
-BB1A 8330D831
-BB1B 8330D832
-BB1C 8330D833
-BB1D 8330D834
-BB1E 8330D835
-BB1F 8330D836
-BB20 8330D837
-BB21 8330D838
-BB22 8330D839
-BB23 8330D930
-BB24 8330D931
-BB25 8330D932
-BB26 8330D933
-BB27 8330D934
-BB28 8330D935
-BB29 8330D936
-BB2A 8330D937
-BB2B 8330D938
-BB2C 8330D939
-BB2D 8330DA30
-BB2E 8330DA31
-BB2F 8330DA32
-BB30 8330DA33
-BB31 8330DA34
-BB32 8330DA35
-BB33 8330DA36
-BB34 8330DA37
-BB35 8330DA38
-BB36 8330DA39
-BB37 8330DB30
-BB38 8330DB31
-BB39 8330DB32
-BB3A 8330DB33
-BB3B 8330DB34
-BB3C 8330DB35
-BB3D 8330DB36
-BB3E 8330DB37
-BB3F 8330DB38
-BB40 8330DB39
-BB41 8330DC30
-BB42 8330DC31
-BB43 8330DC32
-BB44 8330DC33
-BB45 8330DC34
-BB46 8330DC35
-BB47 8330DC36
-BB48 8330DC37
-BB49 8330DC38
-BB4A 8330DC39
-BB4B 8330DD30
-BB4C 8330DD31
-BB4D 8330DD32
-BB4E 8330DD33
-BB4F 8330DD34
-BB50 8330DD35
-BB51 8330DD36
-BB52 8330DD37
-BB53 8330DD38
-BB54 8330DD39
-BB55 8330DE30
-BB56 8330DE31
-BB57 8330DE32
-BB58 8330DE33
-BB59 8330DE34
-BB5A 8330DE35
-BB5B 8330DE36
-BB5C 8330DE37
-BB5D 8330DE38
-BB5E 8330DE39
-BB5F 8330DF30
-BB60 8330DF31
-BB61 8330DF32
-BB62 8330DF33
-BB63 8330DF34
-BB64 8330DF35
-BB65 8330DF36
-BB66 8330DF37
-BB67 8330DF38
-BB68 8330DF39
-BB69 8330E030
-BB6A 8330E031
-BB6B 8330E032
-BB6C 8330E033
-BB6D 8330E034
-BB6E 8330E035
-BB6F 8330E036
-BB70 8330E037
-BB71 8330E038
-BB72 8330E039
-BB73 8330E130
-BB74 8330E131
-BB75 8330E132
-BB76 8330E133
-BB77 8330E134
-BB78 8330E135
-BB79 8330E136
-BB7A 8330E137
-BB7B 8330E138
-BB7C 8330E139
-BB7D 8330E230
-BB7E 8330E231
-BB7F 8330E232
-BB80 8330E233
-BB81 8330E234
-BB82 8330E235
-BB83 8330E236
-BB84 8330E237
-BB85 8330E238
-BB86 8330E239
-BB87 8330E330
-BB88 8330E331
-BB89 8330E332
-BB8A 8330E333
-BB8B 8330E334
-BB8C 8330E335
-BB8D 8330E336
-BB8E 8330E337
-BB8F 8330E338
-BB90 8330E339
-BB91 8330E430
-BB92 8330E431
-BB93 8330E432
-BB94 8330E433
-BB95 8330E434
-BB96 8330E435
-BB97 8330E436
-BB98 8330E437
-BB99 8330E438
-BB9A 8330E439
-BB9B 8330E530
-BB9C 8330E531
-BB9D 8330E532
-BB9E 8330E533
-BB9F 8330E534
-BBA0 8330E535
-BBA1 8330E536
-BBA2 8330E537
-BBA3 8330E538
-BBA4 8330E539
-BBA5 8330E630
-BBA6 8330E631
-BBA7 8330E632
-BBA8 8330E633
-BBA9 8330E634
-BBAA 8330E635
-BBAB 8330E636
-BBAC 8330E637
-BBAD 8330E638
-BBAE 8330E639
-BBAF 8330E730
-BBB0 8330E731
-BBB1 8330E732
-BBB2 8330E733
-BBB3 8330E734
-BBB4 8330E735
-BBB5 8330E736
-BBB6 8330E737
-BBB7 8330E738
-BBB8 8330E739
-BBB9 8330E830
-BBBA 8330E831
-BBBB 8330E832
-BBBC 8330E833
-BBBD 8330E834
-BBBE 8330E835
-BBBF 8330E836
-BBC0 8330E837
-BBC1 8330E838
-BBC2 8330E839
-BBC3 8330E930
-BBC4 8330E931
-BBC5 8330E932
-BBC6 8330E933
-BBC7 8330E934
-BBC8 8330E935
-BBC9 8330E936
-BBCA 8330E937
-BBCB 8330E938
-BBCC 8330E939
-BBCD 8330EA30
-BBCE 8330EA31
-BBCF 8330EA32
-BBD0 8330EA33
-BBD1 8330EA34
-BBD2 8330EA35
-BBD3 8330EA36
-BBD4 8330EA37
-BBD5 8330EA38
-BBD6 8330EA39
-BBD7 8330EB30
-BBD8 8330EB31
-BBD9 8330EB32
-BBDA 8330EB33
-BBDB 8330EB34
-BBDC 8330EB35
-BBDD 8330EB36
-BBDE 8330EB37
-BBDF 8330EB38
-BBE0 8330EB39
-BBE1 8330EC30
-BBE2 8330EC31
-BBE3 8330EC32
-BBE4 8330EC33
-BBE5 8330EC34
-BBE6 8330EC35
-BBE7 8330EC36
-BBE8 8330EC37
-BBE9 8330EC38
-BBEA 8330EC39
-BBEB 8330ED30
-BBEC 8330ED31
-BBED 8330ED32
-BBEE 8330ED33
-BBEF 8330ED34
-BBF0 8330ED35
-BBF1 8330ED36
-BBF2 8330ED37
-BBF3 8330ED38
-BBF4 8330ED39
-BBF5 8330EE30
-BBF6 8330EE31
-BBF7 8330EE32
-BBF8 8330EE33
-BBF9 8330EE34
-BBFA 8330EE35
-BBFB 8330EE36
-BBFC 8330EE37
-BBFD 8330EE38
-BBFE 8330EE39
-BBFF 8330EF30
-BC00 8330EF31
-BC01 8330EF32
-BC02 8330EF33
-BC03 8330EF34
-BC04 8330EF35
-BC05 8330EF36
-BC06 8330EF37
-BC07 8330EF38
-BC08 8330EF39
-BC09 8330F030
-BC0A 8330F031
-BC0B 8330F032
-BC0C 8330F033
-BC0D 8330F034
-BC0E 8330F035
-BC0F 8330F036
-BC10 8330F037
-BC11 8330F038
-BC12 8330F039
-BC13 8330F130
-BC14 8330F131
-BC15 8330F132
-BC16 8330F133
-BC17 8330F134
-BC18 8330F135
-BC19 8330F136
-BC1A 8330F137
-BC1B 8330F138
-BC1C 8330F139
-BC1D 8330F230
-BC1E 8330F231
-BC1F 8330F232
-BC20 8330F233
-BC21 8330F234
-BC22 8330F235
-BC23 8330F236
-BC24 8330F237
-BC25 8330F238
-BC26 8330F239
-BC27 8330F330
-BC28 8330F331
-BC29 8330F332
-BC2A 8330F333
-BC2B 8330F334
-BC2C 8330F335
-BC2D 8330F336
-BC2E 8330F337
-BC2F 8330F338
-BC30 8330F339
-BC31 8330F430
-BC32 8330F431
-BC33 8330F432
-BC34 8330F433
-BC35 8330F434
-BC36 8330F435
-BC37 8330F436
-BC38 8330F437
-BC39 8330F438
-BC3A 8330F439
-BC3B 8330F530
-BC3C 8330F531
-BC3D 8330F532
-BC3E 8330F533
-BC3F 8330F534
-BC40 8330F535
-BC41 8330F536
-BC42 8330F537
-BC43 8330F538
-BC44 8330F539
-BC45 8330F630
-BC46 8330F631
-BC47 8330F632
-BC48 8330F633
-BC49 8330F634
-BC4A 8330F635
-BC4B 8330F636
-BC4C 8330F637
-BC4D 8330F638
-BC4E 8330F639
-BC4F 8330F730
-BC50 8330F731
-BC51 8330F732
-BC52 8330F733
-BC53 8330F734
-BC54 8330F735
-BC55 8330F736
-BC56 8330F737
-BC57 8330F738
-BC58 8330F739
-BC59 8330F830
-BC5A 8330F831
-BC5B 8330F832
-BC5C 8330F833
-BC5D 8330F834
-BC5E 8330F835
-BC5F 8330F836
-BC60 8330F837
-BC61 8330F838
-BC62 8330F839
-BC63 8330F930
-BC64 8330F931
-BC65 8330F932
-BC66 8330F933
-BC67 8330F934
-BC68 8330F935
-BC69 8330F936
-BC6A 8330F937
-BC6B 8330F938
-BC6C 8330F939
-BC6D 8330FA30
-BC6E 8330FA31
-BC6F 8330FA32
-BC70 8330FA33
-BC71 8330FA34
-BC72 8330FA35
-BC73 8330FA36
-BC74 8330FA37
-BC75 8330FA38
-BC76 8330FA39
-BC77 8330FB30
-BC78 8330FB31
-BC79 8330FB32
-BC7A 8330FB33
-BC7B 8330FB34
-BC7C 8330FB35
-BC7D 8330FB36
-BC7E 8330FB37
-BC7F 8330FB38
-BC80 8330FB39
-BC81 8330FC30
-BC82 8330FC31
-BC83 8330FC32
-BC84 8330FC33
-BC85 8330FC34
-BC86 8330FC35
-BC87 8330FC36
-BC88 8330FC37
-BC89 8330FC38
-BC8A 8330FC39
-BC8B 8330FD30
-BC8C 8330FD31
-BC8D 8330FD32
-BC8E 8330FD33
-BC8F 8330FD34
-BC90 8330FD35
-BC91 8330FD36
-BC92 8330FD37
-BC93 8330FD38
-BC94 8330FD39
-BC95 8330FE30
-BC96 8330FE31
-BC97 8330FE32
-BC98 8330FE33
-BC99 8330FE34
-BC9A 8330FE35
-BC9B 8330FE36
-BC9C 8330FE37
-BC9D 8330FE38
-BC9E 8330FE39
-BC9F 83318130
-BCA0 83318131
-BCA1 83318132
-BCA2 83318133
-BCA3 83318134
-BCA4 83318135
-BCA5 83318136
-BCA6 83318137
-BCA7 83318138
-BCA8 83318139
-BCA9 83318230
-BCAA 83318231
-BCAB 83318232
-BCAC 83318233
-BCAD 83318234
-BCAE 83318235
-BCAF 83318236
-BCB0 83318237
-BCB1 83318238
-BCB2 83318239
-BCB3 83318330
-BCB4 83318331
-BCB5 83318332
-BCB6 83318333
-BCB7 83318334
-BCB8 83318335
-BCB9 83318336
-BCBA 83318337
-BCBB 83318338
-BCBC 83318339
-BCBD 83318430
-BCBE 83318431
-BCBF 83318432
-BCC0 83318433
-BCC1 83318434
-BCC2 83318435
-BCC3 83318436
-BCC4 83318437
-BCC5 83318438
-BCC6 83318439
-BCC7 83318530
-BCC8 83318531
-BCC9 83318532
-BCCA 83318533
-BCCB 83318534
-BCCC 83318535
-BCCD 83318536
-BCCE 83318537
-BCCF 83318538
-BCD0 83318539
-BCD1 83318630
-BCD2 83318631
-BCD3 83318632
-BCD4 83318633
-BCD5 83318634
-BCD6 83318635
-BCD7 83318636
-BCD8 83318637
-BCD9 83318638
-BCDA 83318639
-BCDB 83318730
-BCDC 83318731
-BCDD 83318732
-BCDE 83318733
-BCDF 83318734
-BCE0 83318735
-BCE1 83318736
-BCE2 83318737
-BCE3 83318738
-BCE4 83318739
-BCE5 83318830
-BCE6 83318831
-BCE7 83318832
-BCE8 83318833
-BCE9 83318834
-BCEA 83318835
-BCEB 83318836
-BCEC 83318837
-BCED 83318838
-BCEE 83318839
-BCEF 83318930
-BCF0 83318931
-BCF1 83318932
-BCF2 83318933
-BCF3 83318934
-BCF4 83318935
-BCF5 83318936
-BCF6 83318937
-BCF7 83318938
-BCF8 83318939
-BCF9 83318A30
-BCFA 83318A31
-BCFB 83318A32
-BCFC 83318A33
-BCFD 83318A34
-BCFE 83318A35
-BCFF 83318A36
-BD00 83318A37
-BD01 83318A38
-BD02 83318A39
-BD03 83318B30
-BD04 83318B31
-BD05 83318B32
-BD06 83318B33
-BD07 83318B34
-BD08 83318B35
-BD09 83318B36
-BD0A 83318B37
-BD0B 83318B38
-BD0C 83318B39
-BD0D 83318C30
-BD0E 83318C31
-BD0F 83318C32
-BD10 83318C33
-BD11 83318C34
-BD12 83318C35
-BD13 83318C36
-BD14 83318C37
-BD15 83318C38
-BD16 83318C39
-BD17 83318D30
-BD18 83318D31
-BD19 83318D32
-BD1A 83318D33
-BD1B 83318D34
-BD1C 83318D35
-BD1D 83318D36
-BD1E 83318D37
-BD1F 83318D38
-BD20 83318D39
-BD21 83318E30
-BD22 83318E31
-BD23 83318E32
-BD24 83318E33
-BD25 83318E34
-BD26 83318E35
-BD27 83318E36
-BD28 83318E37
-BD29 83318E38
-BD2A 83318E39
-BD2B 83318F30
-BD2C 83318F31
-BD2D 83318F32
-BD2E 83318F33
-BD2F 83318F34
-BD30 83318F35
-BD31 83318F36
-BD32 83318F37
-BD33 83318F38
-BD34 83318F39
-BD35 83319030
-BD36 83319031
-BD37 83319032
-BD38 83319033
-BD39 83319034
-BD3A 83319035
-BD3B 83319036
-BD3C 83319037
-BD3D 83319038
-BD3E 83319039
-BD3F 83319130
-BD40 83319131
-BD41 83319132
-BD42 83319133
-BD43 83319134
-BD44 83319135
-BD45 83319136
-BD46 83319137
-BD47 83319138
-BD48 83319139
-BD49 83319230
-BD4A 83319231
-BD4B 83319232
-BD4C 83319233
-BD4D 83319234
-BD4E 83319235
-BD4F 83319236
-BD50 83319237
-BD51 83319238
-BD52 83319239
-BD53 83319330
-BD54 83319331
-BD55 83319332
-BD56 83319333
-BD57 83319334
-BD58 83319335
-BD59 83319336
-BD5A 83319337
-BD5B 83319338
-BD5C 83319339
-BD5D 83319430
-BD5E 83319431
-BD5F 83319432
-BD60 83319433
-BD61 83319434
-BD62 83319435
-BD63 83319436
-BD64 83319437
-BD65 83319438
-BD66 83319439
-BD67 83319530
-BD68 83319531
-BD69 83319532
-BD6A 83319533
-BD6B 83319534
-BD6C 83319535
-BD6D 83319536
-BD6E 83319537
-BD6F 83319538
-BD70 83319539
-BD71 83319630
-BD72 83319631
-BD73 83319632
-BD74 83319633
-BD75 83319634
-BD76 83319635
-BD77 83319636
-BD78 83319637
-BD79 83319638
-BD7A 83319639
-BD7B 83319730
-BD7C 83319731
-BD7D 83319732
-BD7E 83319733
-BD7F 83319734
-BD80 83319735
-BD81 83319736
-BD82 83319737
-BD83 83319738
-BD84 83319739
-BD85 83319830
-BD86 83319831
-BD87 83319832
-BD88 83319833
-BD89 83319834
-BD8A 83319835
-BD8B 83319836
-BD8C 83319837
-BD8D 83319838
-BD8E 83319839
-BD8F 83319930
-BD90 83319931
-BD91 83319932
-BD92 83319933
-BD93 83319934
-BD94 83319935
-BD95 83319936
-BD96 83319937
-BD97 83319938
-BD98 83319939
-BD99 83319A30
-BD9A 83319A31
-BD9B 83319A32
-BD9C 83319A33
-BD9D 83319A34
-BD9E 83319A35
-BD9F 83319A36
-BDA0 83319A37
-BDA1 83319A38
-BDA2 83319A39
-BDA3 83319B30
-BDA4 83319B31
-BDA5 83319B32
-BDA6 83319B33
-BDA7 83319B34
-BDA8 83319B35
-BDA9 83319B36
-BDAA 83319B37
-BDAB 83319B38
-BDAC 83319B39
-BDAD 83319C30
-BDAE 83319C31
-BDAF 83319C32
-BDB0 83319C33
-BDB1 83319C34
-BDB2 83319C35
-BDB3 83319C36
-BDB4 83319C37
-BDB5 83319C38
-BDB6 83319C39
-BDB7 83319D30
-BDB8 83319D31
-BDB9 83319D32
-BDBA 83319D33
-BDBB 83319D34
-BDBC 83319D35
-BDBD 83319D36
-BDBE 83319D37
-BDBF 83319D38
-BDC0 83319D39
-BDC1 83319E30
-BDC2 83319E31
-BDC3 83319E32
-BDC4 83319E33
-BDC5 83319E34
-BDC6 83319E35
-BDC7 83319E36
-BDC8 83319E37
-BDC9 83319E38
-BDCA 83319E39
-BDCB 83319F30
-BDCC 83319F31
-BDCD 83319F32
-BDCE 83319F33
-BDCF 83319F34
-BDD0 83319F35
-BDD1 83319F36
-BDD2 83319F37
-BDD3 83319F38
-BDD4 83319F39
-BDD5 8331A030
-BDD6 8331A031
-BDD7 8331A032
-BDD8 8331A033
-BDD9 8331A034
-BDDA 8331A035
-BDDB 8331A036
-BDDC 8331A037
-BDDD 8331A038
-BDDE 8331A039
-BDDF 8331A130
-BDE0 8331A131
-BDE1 8331A132
-BDE2 8331A133
-BDE3 8331A134
-BDE4 8331A135
-BDE5 8331A136
-BDE6 8331A137
-BDE7 8331A138
-BDE8 8331A139
-BDE9 8331A230
-BDEA 8331A231
-BDEB 8331A232
-BDEC 8331A233
-BDED 8331A234
-BDEE 8331A235
-BDEF 8331A236
-BDF0 8331A237
-BDF1 8331A238
-BDF2 8331A239
-BDF3 8331A330
-BDF4 8331A331
-BDF5 8331A332
-BDF6 8331A333
-BDF7 8331A334
-BDF8 8331A335
-BDF9 8331A336
-BDFA 8331A337
-BDFB 8331A338
-BDFC 8331A339
-BDFD 8331A430
-BDFE 8331A431
-BDFF 8331A432
-BE00 8331A433
-BE01 8331A434
-BE02 8331A435
-BE03 8331A436
-BE04 8331A437
-BE05 8331A438
-BE06 8331A439
-BE07 8331A530
-BE08 8331A531
-BE09 8331A532
-BE0A 8331A533
-BE0B 8331A534
-BE0C 8331A535
-BE0D 8331A536
-BE0E 8331A537
-BE0F 8331A538
-BE10 8331A539
-BE11 8331A630
-BE12 8331A631
-BE13 8331A632
-BE14 8331A633
-BE15 8331A634
-BE16 8331A635
-BE17 8331A636
-BE18 8331A637
-BE19 8331A638
-BE1A 8331A639
-BE1B 8331A730
-BE1C 8331A731
-BE1D 8331A732
-BE1E 8331A733
-BE1F 8331A734
-BE20 8331A735
-BE21 8331A736
-BE22 8331A737
-BE23 8331A738
-BE24 8331A739
-BE25 8331A830
-BE26 8331A831
-BE27 8331A832
-BE28 8331A833
-BE29 8331A834
-BE2A 8331A835
-BE2B 8331A836
-BE2C 8331A837
-BE2D 8331A838
-BE2E 8331A839
-BE2F 8331A930
-BE30 8331A931
-BE31 8331A932
-BE32 8331A933
-BE33 8331A934
-BE34 8331A935
-BE35 8331A936
-BE36 8331A937
-BE37 8331A938
-BE38 8331A939
-BE39 8331AA30
-BE3A 8331AA31
-BE3B 8331AA32
-BE3C 8331AA33
-BE3D 8331AA34
-BE3E 8331AA35
-BE3F 8331AA36
-BE40 8331AA37
-BE41 8331AA38
-BE42 8331AA39
-BE43 8331AB30
-BE44 8331AB31
-BE45 8331AB32
-BE46 8331AB33
-BE47 8331AB34
-BE48 8331AB35
-BE49 8331AB36
-BE4A 8331AB37
-BE4B 8331AB38
-BE4C 8331AB39
-BE4D 8331AC30
-BE4E 8331AC31
-BE4F 8331AC32
-BE50 8331AC33
-BE51 8331AC34
-BE52 8331AC35
-BE53 8331AC36
-BE54 8331AC37
-BE55 8331AC38
-BE56 8331AC39
-BE57 8331AD30
-BE58 8331AD31
-BE59 8331AD32
-BE5A 8331AD33
-BE5B 8331AD34
-BE5C 8331AD35
-BE5D 8331AD36
-BE5E 8331AD37
-BE5F 8331AD38
-BE60 8331AD39
-BE61 8331AE30
-BE62 8331AE31
-BE63 8331AE32
-BE64 8331AE33
-BE65 8331AE34
-BE66 8331AE35
-BE67 8331AE36
-BE68 8331AE37
-BE69 8331AE38
-BE6A 8331AE39
-BE6B 8331AF30
-BE6C 8331AF31
-BE6D 8331AF32
-BE6E 8331AF33
-BE6F 8331AF34
-BE70 8331AF35
-BE71 8331AF36
-BE72 8331AF37
-BE73 8331AF38
-BE74 8331AF39
-BE75 8331B030
-BE76 8331B031
-BE77 8331B032
-BE78 8331B033
-BE79 8331B034
-BE7A 8331B035
-BE7B 8331B036
-BE7C 8331B037
-BE7D 8331B038
-BE7E 8331B039
-BE7F 8331B130
-BE80 8331B131
-BE81 8331B132
-BE82 8331B133
-BE83 8331B134
-BE84 8331B135
-BE85 8331B136
-BE86 8331B137
-BE87 8331B138
-BE88 8331B139
-BE89 8331B230
-BE8A 8331B231
-BE8B 8331B232
-BE8C 8331B233
-BE8D 8331B234
-BE8E 8331B235
-BE8F 8331B236
-BE90 8331B237
-BE91 8331B238
-BE92 8331B239
-BE93 8331B330
-BE94 8331B331
-BE95 8331B332
-BE96 8331B333
-BE97 8331B334
-BE98 8331B335
-BE99 8331B336
-BE9A 8331B337
-BE9B 8331B338
-BE9C 8331B339
-BE9D 8331B430
-BE9E 8331B431
-BE9F 8331B432
-BEA0 8331B433
-BEA1 8331B434
-BEA2 8331B435
-BEA3 8331B436
-BEA4 8331B437
-BEA5 8331B438
-BEA6 8331B439
-BEA7 8331B530
-BEA8 8331B531
-BEA9 8331B532
-BEAA 8331B533
-BEAB 8331B534
-BEAC 8331B535
-BEAD 8331B536
-BEAE 8331B537
-BEAF 8331B538
-BEB0 8331B539
-BEB1 8331B630
-BEB2 8331B631
-BEB3 8331B632
-BEB4 8331B633
-BEB5 8331B634
-BEB6 8331B635
-BEB7 8331B636
-BEB8 8331B637
-BEB9 8331B638
-BEBA 8331B639
-BEBB 8331B730
-BEBC 8331B731
-BEBD 8331B732
-BEBE 8331B733
-BEBF 8331B734
-BEC0 8331B735
-BEC1 8331B736
-BEC2 8331B737
-BEC3 8331B738
-BEC4 8331B739
-BEC5 8331B830
-BEC6 8331B831
-BEC7 8331B832
-BEC8 8331B833
-BEC9 8331B834
-BECA 8331B835
-BECB 8331B836
-BECC 8331B837
-BECD 8331B838
-BECE 8331B839
-BECF 8331B930
-BED0 8331B931
-BED1 8331B932
-BED2 8331B933
-BED3 8331B934
-BED4 8331B935
-BED5 8331B936
-BED6 8331B937
-BED7 8331B938
-BED8 8331B939
-BED9 8331BA30
-BEDA 8331BA31
-BEDB 8331BA32
-BEDC 8331BA33
-BEDD 8331BA34
-BEDE 8331BA35
-BEDF 8331BA36
-BEE0 8331BA37
-BEE1 8331BA38
-BEE2 8331BA39
-BEE3 8331BB30
-BEE4 8331BB31
-BEE5 8331BB32
-BEE6 8331BB33
-BEE7 8331BB34
-BEE8 8331BB35
-BEE9 8331BB36
-BEEA 8331BB37
-BEEB 8331BB38
-BEEC 8331BB39
-BEED 8331BC30
-BEEE 8331BC31
-BEEF 8331BC32
-BEF0 8331BC33
-BEF1 8331BC34
-BEF2 8331BC35
-BEF3 8331BC36
-BEF4 8331BC37
-BEF5 8331BC38
-BEF6 8331BC39
-BEF7 8331BD30
-BEF8 8331BD31
-BEF9 8331BD32
-BEFA 8331BD33
-BEFB 8331BD34
-BEFC 8331BD35
-BEFD 8331BD36
-BEFE 8331BD37
-BEFF 8331BD38
-BF00 8331BD39
-BF01 8331BE30
-BF02 8331BE31
-BF03 8331BE32
-BF04 8331BE33
-BF05 8331BE34
-BF06 8331BE35
-BF07 8331BE36
-BF08 8331BE37
-BF09 8331BE38
-BF0A 8331BE39
-BF0B 8331BF30
-BF0C 8331BF31
-BF0D 8331BF32
-BF0E 8331BF33
-BF0F 8331BF34
-BF10 8331BF35
-BF11 8331BF36
-BF12 8331BF37
-BF13 8331BF38
-BF14 8331BF39
-BF15 8331C030
-BF16 8331C031
-BF17 8331C032
-BF18 8331C033
-BF19 8331C034
-BF1A 8331C035
-BF1B 8331C036
-BF1C 8331C037
-BF1D 8331C038
-BF1E 8331C039
-BF1F 8331C130
-BF20 8331C131
-BF21 8331C132
-BF22 8331C133
-BF23 8331C134
-BF24 8331C135
-BF25 8331C136
-BF26 8331C137
-BF27 8331C138
-BF28 8331C139
-BF29 8331C230
-BF2A 8331C231
-BF2B 8331C232
-BF2C 8331C233
-BF2D 8331C234
-BF2E 8331C235
-BF2F 8331C236
-BF30 8331C237
-BF31 8331C238
-BF32 8331C239
-BF33 8331C330
-BF34 8331C331
-BF35 8331C332
-BF36 8331C333
-BF37 8331C334
-BF38 8331C335
-BF39 8331C336
-BF3A 8331C337
-BF3B 8331C338
-BF3C 8331C339
-BF3D 8331C430
-BF3E 8331C431
-BF3F 8331C432
-BF40 8331C433
-BF41 8331C434
-BF42 8331C435
-BF43 8331C436
-BF44 8331C437
-BF45 8331C438
-BF46 8331C439
-BF47 8331C530
-BF48 8331C531
-BF49 8331C532
-BF4A 8331C533
-BF4B 8331C534
-BF4C 8331C535
-BF4D 8331C536
-BF4E 8331C537
-BF4F 8331C538
-BF50 8331C539
-BF51 8331C630
-BF52 8331C631
-BF53 8331C632
-BF54 8331C633
-BF55 8331C634
-BF56 8331C635
-BF57 8331C636
-BF58 8331C637
-BF59 8331C638
-BF5A 8331C639
-BF5B 8331C730
-BF5C 8331C731
-BF5D 8331C732
-BF5E 8331C733
-BF5F 8331C734
-BF60 8331C735
-BF61 8331C736
-BF62 8331C737
-BF63 8331C738
-BF64 8331C739
-BF65 8331C830
-BF66 8331C831
-BF67 8331C832
-BF68 8331C833
-BF69 8331C834
-BF6A 8331C835
-BF6B 8331C836
-BF6C 8331C837
-BF6D 8331C838
-BF6E 8331C839
-BF6F 8331C930
-BF70 8331C931
-BF71 8331C932
-BF72 8331C933
-BF73 8331C934
-BF74 8331C935
-BF75 8331C936
-BF76 8331C937
-BF77 8331C938
-BF78 8331C939
-BF79 8331CA30
-BF7A 8331CA31
-BF7B 8331CA32
-BF7C 8331CA33
-BF7D 8331CA34
-BF7E 8331CA35
-BF7F 8331CA36
-BF80 8331CA37
-BF81 8331CA38
-BF82 8331CA39
-BF83 8331CB30
-BF84 8331CB31
-BF85 8331CB32
-BF86 8331CB33
-BF87 8331CB34
-BF88 8331CB35
-BF89 8331CB36
-BF8A 8331CB37
-BF8B 8331CB38
-BF8C 8331CB39
-BF8D 8331CC30
-BF8E 8331CC31
-BF8F 8331CC32
-BF90 8331CC33
-BF91 8331CC34
-BF92 8331CC35
-BF93 8331CC36
-BF94 8331CC37
-BF95 8331CC38
-BF96 8331CC39
-BF97 8331CD30
-BF98 8331CD31
-BF99 8331CD32
-BF9A 8331CD33
-BF9B 8331CD34
-BF9C 8331CD35
-BF9D 8331CD36
-BF9E 8331CD37
-BF9F 8331CD38
-BFA0 8331CD39
-BFA1 8331CE30
-BFA2 8331CE31
-BFA3 8331CE32
-BFA4 8331CE33
-BFA5 8331CE34
-BFA6 8331CE35
-BFA7 8331CE36
-BFA8 8331CE37
-BFA9 8331CE38
-BFAA 8331CE39
-BFAB 8331CF30
-BFAC 8331CF31
-BFAD 8331CF32
-BFAE 8331CF33
-BFAF 8331CF34
-BFB0 8331CF35
-BFB1 8331CF36
-BFB2 8331CF37
-BFB3 8331CF38
-BFB4 8331CF39
-BFB5 8331D030
-BFB6 8331D031
-BFB7 8331D032
-BFB8 8331D033
-BFB9 8331D034
-BFBA 8331D035
-BFBB 8331D036
-BFBC 8331D037
-BFBD 8331D038
-BFBE 8331D039
-BFBF 8331D130
-BFC0 8331D131
-BFC1 8331D132
-BFC2 8331D133
-BFC3 8331D134
-BFC4 8331D135
-BFC5 8331D136
-BFC6 8331D137
-BFC7 8331D138
-BFC8 8331D139
-BFC9 8331D230
-BFCA 8331D231
-BFCB 8331D232
-BFCC 8331D233
-BFCD 8331D234
-BFCE 8331D235
-BFCF 8331D236
-BFD0 8331D237
-BFD1 8331D238
-BFD2 8331D239
-BFD3 8331D330
-BFD4 8331D331
-BFD5 8331D332
-BFD6 8331D333
-BFD7 8331D334
-BFD8 8331D335
-BFD9 8331D336
-BFDA 8331D337
-BFDB 8331D338
-BFDC 8331D339
-BFDD 8331D430
-BFDE 8331D431
-BFDF 8331D432
-BFE0 8331D433
-BFE1 8331D434
-BFE2 8331D435
-BFE3 8331D436
-BFE4 8331D437
-BFE5 8331D438
-BFE6 8331D439
-BFE7 8331D530
-BFE8 8331D531
-BFE9 8331D532
-BFEA 8331D533
-BFEB 8331D534
-BFEC 8331D535
-BFED 8331D536
-BFEE 8331D537
-BFEF 8331D538
-BFF0 8331D539
-BFF1 8331D630
-BFF2 8331D631
-BFF3 8331D632
-BFF4 8331D633
-BFF5 8331D634
-BFF6 8331D635
-BFF7 8331D636
-BFF8 8331D637
-BFF9 8331D638
-BFFA 8331D639
-BFFB 8331D730
-BFFC 8331D731
-BFFD 8331D732
-BFFE 8331D733
-BFFF 8331D734
-C000 8331D735
-C001 8331D736
-C002 8331D737
-C003 8331D738
-C004 8331D739
-C005 8331D830
-C006 8331D831
-C007 8331D832
-C008 8331D833
-C009 8331D834
-C00A 8331D835
-C00B 8331D836
-C00C 8331D837
-C00D 8331D838
-C00E 8331D839
-C00F 8331D930
-C010 8331D931
-C011 8331D932
-C012 8331D933
-C013 8331D934
-C014 8331D935
-C015 8331D936
-C016 8331D937
-C017 8331D938
-C018 8331D939
-C019 8331DA30
-C01A 8331DA31
-C01B 8331DA32
-C01C 8331DA33
-C01D 8331DA34
-C01E 8331DA35
-C01F 8331DA36
-C020 8331DA37
-C021 8331DA38
-C022 8331DA39
-C023 8331DB30
-C024 8331DB31
-C025 8331DB32
-C026 8331DB33
-C027 8331DB34
-C028 8331DB35
-C029 8331DB36
-C02A 8331DB37
-C02B 8331DB38
-C02C 8331DB39
-C02D 8331DC30
-C02E 8331DC31
-C02F 8331DC32
-C030 8331DC33
-C031 8331DC34
-C032 8331DC35
-C033 8331DC36
-C034 8331DC37
-C035 8331DC38
-C036 8331DC39
-C037 8331DD30
-C038 8331DD31
-C039 8331DD32
-C03A 8331DD33
-C03B 8331DD34
-C03C 8331DD35
-C03D 8331DD36
-C03E 8331DD37
-C03F 8331DD38
-C040 8331DD39
-C041 8331DE30
-C042 8331DE31
-C043 8331DE32
-C044 8331DE33
-C045 8331DE34
-C046 8331DE35
-C047 8331DE36
-C048 8331DE37
-C049 8331DE38
-C04A 8331DE39
-C04B 8331DF30
-C04C 8331DF31
-C04D 8331DF32
-C04E 8331DF33
-C04F 8331DF34
-C050 8331DF35
-C051 8331DF36
-C052 8331DF37
-C053 8331DF38
-C054 8331DF39
-C055 8331E030
-C056 8331E031
-C057 8331E032
-C058 8331E033
-C059 8331E034
-C05A 8331E035
-C05B 8331E036
-C05C 8331E037
-C05D 8331E038
-C05E 8331E039
-C05F 8331E130
-C060 8331E131
-C061 8331E132
-C062 8331E133
-C063 8331E134
-C064 8331E135
-C065 8331E136
-C066 8331E137
-C067 8331E138
-C068 8331E139
-C069 8331E230
-C06A 8331E231
-C06B 8331E232
-C06C 8331E233
-C06D 8331E234
-C06E 8331E235
-C06F 8331E236
-C070 8331E237
-C071 8331E238
-C072 8331E239
-C073 8331E330
-C074 8331E331
-C075 8331E332
-C076 8331E333
-C077 8331E334
-C078 8331E335
-C079 8331E336
-C07A 8331E337
-C07B 8331E338
-C07C 8331E339
-C07D 8331E430
-C07E 8331E431
-C07F 8331E432
-C080 8331E433
-C081 8331E434
-C082 8331E435
-C083 8331E436
-C084 8331E437
-C085 8331E438
-C086 8331E439
-C087 8331E530
-C088 8331E531
-C089 8331E532
-C08A 8331E533
-C08B 8331E534
-C08C 8331E535
-C08D 8331E536
-C08E 8331E537
-C08F 8331E538
-C090 8331E539
-C091 8331E630
-C092 8331E631
-C093 8331E632
-C094 8331E633
-C095 8331E634
-C096 8331E635
-C097 8331E636
-C098 8331E637
-C099 8331E638
-C09A 8331E639
-C09B 8331E730
-C09C 8331E731
-C09D 8331E732
-C09E 8331E733
-C09F 8331E734
-C0A0 8331E735
-C0A1 8331E736
-C0A2 8331E737
-C0A3 8331E738
-C0A4 8331E739
-C0A5 8331E830
-C0A6 8331E831
-C0A7 8331E832
-C0A8 8331E833
-C0A9 8331E834
-C0AA 8331E835
-C0AB 8331E836
-C0AC 8331E837
-C0AD 8331E838
-C0AE 8331E839
-C0AF 8331E930
-C0B0 8331E931
-C0B1 8331E932
-C0B2 8331E933
-C0B3 8331E934
-C0B4 8331E935
-C0B5 8331E936
-C0B6 8331E937
-C0B7 8331E938
-C0B8 8331E939
-C0B9 8331EA30
-C0BA 8331EA31
-C0BB 8331EA32
-C0BC 8331EA33
-C0BD 8331EA34
-C0BE 8331EA35
-C0BF 8331EA36
-C0C0 8331EA37
-C0C1 8331EA38
-C0C2 8331EA39
-C0C3 8331EB30
-C0C4 8331EB31
-C0C5 8331EB32
-C0C6 8331EB33
-C0C7 8331EB34
-C0C8 8331EB35
-C0C9 8331EB36
-C0CA 8331EB37
-C0CB 8331EB38
-C0CC 8331EB39
-C0CD 8331EC30
-C0CE 8331EC31
-C0CF 8331EC32
-C0D0 8331EC33
-C0D1 8331EC34
-C0D2 8331EC35
-C0D3 8331EC36
-C0D4 8331EC37
-C0D5 8331EC38
-C0D6 8331EC39
-C0D7 8331ED30
-C0D8 8331ED31
-C0D9 8331ED32
-C0DA 8331ED33
-C0DB 8331ED34
-C0DC 8331ED35
-C0DD 8331ED36
-C0DE 8331ED37
-C0DF 8331ED38
-C0E0 8331ED39
-C0E1 8331EE30
-C0E2 8331EE31
-C0E3 8331EE32
-C0E4 8331EE33
-C0E5 8331EE34
-C0E6 8331EE35
-C0E7 8331EE36
-C0E8 8331EE37
-C0E9 8331EE38
-C0EA 8331EE39
-C0EB 8331EF30
-C0EC 8331EF31
-C0ED 8331EF32
-C0EE 8331EF33
-C0EF 8331EF34
-C0F0 8331EF35
-C0F1 8331EF36
-C0F2 8331EF37
-C0F3 8331EF38
-C0F4 8331EF39
-C0F5 8331F030
-C0F6 8331F031
-C0F7 8331F032
-C0F8 8331F033
-C0F9 8331F034
-C0FA 8331F035
-C0FB 8331F036
-C0FC 8331F037
-C0FD 8331F038
-C0FE 8331F039
-C0FF 8331F130
-C100 8331F131
-C101 8331F132
-C102 8331F133
-C103 8331F134
-C104 8331F135
-C105 8331F136
-C106 8331F137
-C107 8331F138
-C108 8331F139
-C109 8331F230
-C10A 8331F231
-C10B 8331F232
-C10C 8331F233
-C10D 8331F234
-C10E 8331F235
-C10F 8331F236
-C110 8331F237
-C111 8331F238
-C112 8331F239
-C113 8331F330
-C114 8331F331
-C115 8331F332
-C116 8331F333
-C117 8331F334
-C118 8331F335
-C119 8331F336
-C11A 8331F337
-C11B 8331F338
-C11C 8331F339
-C11D 8331F430
-C11E 8331F431
-C11F 8331F432
-C120 8331F433
-C121 8331F434
-C122 8331F435
-C123 8331F436
-C124 8331F437
-C125 8331F438
-C126 8331F439
-C127 8331F530
-C128 8331F531
-C129 8331F532
-C12A 8331F533
-C12B 8331F534
-C12C 8331F535
-C12D 8331F536
-C12E 8331F537
-C12F 8331F538
-C130 8331F539
-C131 8331F630
-C132 8331F631
-C133 8331F632
-C134 8331F633
-C135 8331F634
-C136 8331F635
-C137 8331F636
-C138 8331F637
-C139 8331F638
-C13A 8331F639
-C13B 8331F730
-C13C 8331F731
-C13D 8331F732
-C13E 8331F733
-C13F 8331F734
-C140 8331F735
-C141 8331F736
-C142 8331F737
-C143 8331F738
-C144 8331F739
-C145 8331F830
-C146 8331F831
-C147 8331F832
-C148 8331F833
-C149 8331F834
-C14A 8331F835
-C14B 8331F836
-C14C 8331F837
-C14D 8331F838
-C14E 8331F839
-C14F 8331F930
-C150 8331F931
-C151 8331F932
-C152 8331F933
-C153 8331F934
-C154 8331F935
-C155 8331F936
-C156 8331F937
-C157 8331F938
-C158 8331F939
-C159 8331FA30
-C15A 8331FA31
-C15B 8331FA32
-C15C 8331FA33
-C15D 8331FA34
-C15E 8331FA35
-C15F 8331FA36
-C160 8331FA37
-C161 8331FA38
-C162 8331FA39
-C163 8331FB30
-C164 8331FB31
-C165 8331FB32
-C166 8331FB33
-C167 8331FB34
-C168 8331FB35
-C169 8331FB36
-C16A 8331FB37
-C16B 8331FB38
-C16C 8331FB39
-C16D 8331FC30
-C16E 8331FC31
-C16F 8331FC32
-C170 8331FC33
-C171 8331FC34
-C172 8331FC35
-C173 8331FC36
-C174 8331FC37
-C175 8331FC38
-C176 8331FC39
-C177 8331FD30
-C178 8331FD31
-C179 8331FD32
-C17A 8331FD33
-C17B 8331FD34
-C17C 8331FD35
-C17D 8331FD36
-C17E 8331FD37
-C17F 8331FD38
-C180 8331FD39
-C181 8331FE30
-C182 8331FE31
-C183 8331FE32
-C184 8331FE33
-C185 8331FE34
-C186 8331FE35
-C187 8331FE36
-C188 8331FE37
-C189 8331FE38
-C18A 8331FE39
-C18B 83328130
-C18C 83328131
-C18D 83328132
-C18E 83328133
-C18F 83328134
-C190 83328135
-C191 83328136
-C192 83328137
-C193 83328138
-C194 83328139
-C195 83328230
-C196 83328231
-C197 83328232
-C198 83328233
-C199 83328234
-C19A 83328235
-C19B 83328236
-C19C 83328237
-C19D 83328238
-C19E 83328239
-C19F 83328330
-C1A0 83328331
-C1A1 83328332
-C1A2 83328333
-C1A3 83328334
-C1A4 83328335
-C1A5 83328336
-C1A6 83328337
-C1A7 83328338
-C1A8 83328339
-C1A9 83328430
-C1AA 83328431
-C1AB 83328432
-C1AC 83328433
-C1AD 83328434
-C1AE 83328435
-C1AF 83328436
-C1B0 83328437
-C1B1 83328438
-C1B2 83328439
-C1B3 83328530
-C1B4 83328531
-C1B5 83328532
-C1B6 83328533
-C1B7 83328534
-C1B8 83328535
-C1B9 83328536
-C1BA 83328537
-C1BB 83328538
-C1BC 83328539
-C1BD 83328630
-C1BE 83328631
-C1BF 83328632
-C1C0 83328633
-C1C1 83328634
-C1C2 83328635
-C1C3 83328636
-C1C4 83328637
-C1C5 83328638
-C1C6 83328639
-C1C7 83328730
-C1C8 83328731
-C1C9 83328732
-C1CA 83328733
-C1CB 83328734
-C1CC 83328735
-C1CD 83328736
-C1CE 83328737
-C1CF 83328738
-C1D0 83328739
-C1D1 83328830
-C1D2 83328831
-C1D3 83328832
-C1D4 83328833
-C1D5 83328834
-C1D6 83328835
-C1D7 83328836
-C1D8 83328837
-C1D9 83328838
-C1DA 83328839
-C1DB 83328930
-C1DC 83328931
-C1DD 83328932
-C1DE 83328933
-C1DF 83328934
-C1E0 83328935
-C1E1 83328936
-C1E2 83328937
-C1E3 83328938
-C1E4 83328939
-C1E5 83328A30
-C1E6 83328A31
-C1E7 83328A32
-C1E8 83328A33
-C1E9 83328A34
-C1EA 83328A35
-C1EB 83328A36
-C1EC 83328A37
-C1ED 83328A38
-C1EE 83328A39
-C1EF 83328B30
-C1F0 83328B31
-C1F1 83328B32
-C1F2 83328B33
-C1F3 83328B34
-C1F4 83328B35
-C1F5 83328B36
-C1F6 83328B37
-C1F7 83328B38
-C1F8 83328B39
-C1F9 83328C30
-C1FA 83328C31
-C1FB 83328C32
-C1FC 83328C33
-C1FD 83328C34
-C1FE 83328C35
-C1FF 83328C36
-C200 83328C37
-C201 83328C38
-C202 83328C39
-C203 83328D30
-C204 83328D31
-C205 83328D32
-C206 83328D33
-C207 83328D34
-C208 83328D35
-C209 83328D36
-C20A 83328D37
-C20B 83328D38
-C20C 83328D39
-C20D 83328E30
-C20E 83328E31
-C20F 83328E32
-C210 83328E33
-C211 83328E34
-C212 83328E35
-C213 83328E36
-C214 83328E37
-C215 83328E38
-C216 83328E39
-C217 83328F30
-C218 83328F31
-C219 83328F32
-C21A 83328F33
-C21B 83328F34
-C21C 83328F35
-C21D 83328F36
-C21E 83328F37
-C21F 83328F38
-C220 83328F39
-C221 83329030
-C222 83329031
-C223 83329032
-C224 83329033
-C225 83329034
-C226 83329035
-C227 83329036
-C228 83329037
-C229 83329038
-C22A 83329039
-C22B 83329130
-C22C 83329131
-C22D 83329132
-C22E 83329133
-C22F 83329134
-C230 83329135
-C231 83329136
-C232 83329137
-C233 83329138
-C234 83329139
-C235 83329230
-C236 83329231
-C237 83329232
-C238 83329233
-C239 83329234
-C23A 83329235
-C23B 83329236
-C23C 83329237
-C23D 83329238
-C23E 83329239
-C23F 83329330
-C240 83329331
-C241 83329332
-C242 83329333
-C243 83329334
-C244 83329335
-C245 83329336
-C246 83329337
-C247 83329338
-C248 83329339
-C249 83329430
-C24A 83329431
-C24B 83329432
-C24C 83329433
-C24D 83329434
-C24E 83329435
-C24F 83329436
-C250 83329437
-C251 83329438
-C252 83329439
-C253 83329530
-C254 83329531
-C255 83329532
-C256 83329533
-C257 83329534
-C258 83329535
-C259 83329536
-C25A 83329537
-C25B 83329538
-C25C 83329539
-C25D 83329630
-C25E 83329631
-C25F 83329632
-C260 83329633
-C261 83329634
-C262 83329635
-C263 83329636
-C264 83329637
-C265 83329638
-C266 83329639
-C267 83329730
-C268 83329731
-C269 83329732
-C26A 83329733
-C26B 83329734
-C26C 83329735
-C26D 83329736
-C26E 83329737
-C26F 83329738
-C270 83329739
-C271 83329830
-C272 83329831
-C273 83329832
-C274 83329833
-C275 83329834
-C276 83329835
-C277 83329836
-C278 83329837
-C279 83329838
-C27A 83329839
-C27B 83329930
-C27C 83329931
-C27D 83329932
-C27E 83329933
-C27F 83329934
-C280 83329935
-C281 83329936
-C282 83329937
-C283 83329938
-C284 83329939
-C285 83329A30
-C286 83329A31
-C287 83329A32
-C288 83329A33
-C289 83329A34
-C28A 83329A35
-C28B 83329A36
-C28C 83329A37
-C28D 83329A38
-C28E 83329A39
-C28F 83329B30
-C290 83329B31
-C291 83329B32
-C292 83329B33
-C293 83329B34
-C294 83329B35
-C295 83329B36
-C296 83329B37
-C297 83329B38
-C298 83329B39
-C299 83329C30
-C29A 83329C31
-C29B 83329C32
-C29C 83329C33
-C29D 83329C34
-C29E 83329C35
-C29F 83329C36
-C2A0 83329C37
-C2A1 83329C38
-C2A2 83329C39
-C2A3 83329D30
-C2A4 83329D31
-C2A5 83329D32
-C2A6 83329D33
-C2A7 83329D34
-C2A8 83329D35
-C2A9 83329D36
-C2AA 83329D37
-C2AB 83329D38
-C2AC 83329D39
-C2AD 83329E30
-C2AE 83329E31
-C2AF 83329E32
-C2B0 83329E33
-C2B1 83329E34
-C2B2 83329E35
-C2B3 83329E36
-C2B4 83329E37
-C2B5 83329E38
-C2B6 83329E39
-C2B7 83329F30
-C2B8 83329F31
-C2B9 83329F32
-C2BA 83329F33
-C2BB 83329F34
-C2BC 83329F35
-C2BD 83329F36
-C2BE 83329F37
-C2BF 83329F38
-C2C0 83329F39
-C2C1 8332A030
-C2C2 8332A031
-C2C3 8332A032
-C2C4 8332A033
-C2C5 8332A034
-C2C6 8332A035
-C2C7 8332A036
-C2C8 8332A037
-C2C9 8332A038
-C2CA 8332A039
-C2CB 8332A130
-C2CC 8332A131
-C2CD 8332A132
-C2CE 8332A133
-C2CF 8332A134
-C2D0 8332A135
-C2D1 8332A136
-C2D2 8332A137
-C2D3 8332A138
-C2D4 8332A139
-C2D5 8332A230
-C2D6 8332A231
-C2D7 8332A232
-C2D8 8332A233
-C2D9 8332A234
-C2DA 8332A235
-C2DB 8332A236
-C2DC 8332A237
-C2DD 8332A238
-C2DE 8332A239
-C2DF 8332A330
-C2E0 8332A331
-C2E1 8332A332
-C2E2 8332A333
-C2E3 8332A334
-C2E4 8332A335
-C2E5 8332A336
-C2E6 8332A337
-C2E7 8332A338
-C2E8 8332A339
-C2E9 8332A430
-C2EA 8332A431
-C2EB 8332A432
-C2EC 8332A433
-C2ED 8332A434
-C2EE 8332A435
-C2EF 8332A436
-C2F0 8332A437
-C2F1 8332A438
-C2F2 8332A439
-C2F3 8332A530
-C2F4 8332A531
-C2F5 8332A532
-C2F6 8332A533
-C2F7 8332A534
-C2F8 8332A535
-C2F9 8332A536
-C2FA 8332A537
-C2FB 8332A538
-C2FC 8332A539
-C2FD 8332A630
-C2FE 8332A631
-C2FF 8332A632
-C300 8332A633
-C301 8332A634
-C302 8332A635
-C303 8332A636
-C304 8332A637
-C305 8332A638
-C306 8332A639
-C307 8332A730
-C308 8332A731
-C309 8332A732
-C30A 8332A733
-C30B 8332A734
-C30C 8332A735
-C30D 8332A736
-C30E 8332A737
-C30F 8332A738
-C310 8332A739
-C311 8332A830
-C312 8332A831
-C313 8332A832
-C314 8332A833
-C315 8332A834
-C316 8332A835
-C317 8332A836
-C318 8332A837
-C319 8332A838
-C31A 8332A839
-C31B 8332A930
-C31C 8332A931
-C31D 8332A932
-C31E 8332A933
-C31F 8332A934
-C320 8332A935
-C321 8332A936
-C322 8332A937
-C323 8332A938
-C324 8332A939
-C325 8332AA30
-C326 8332AA31
-C327 8332AA32
-C328 8332AA33
-C329 8332AA34
-C32A 8332AA35
-C32B 8332AA36
-C32C 8332AA37
-C32D 8332AA38
-C32E 8332AA39
-C32F 8332AB30
-C330 8332AB31
-C331 8332AB32
-C332 8332AB33
-C333 8332AB34
-C334 8332AB35
-C335 8332AB36
-C336 8332AB37
-C337 8332AB38
-C338 8332AB39
-C339 8332AC30
-C33A 8332AC31
-C33B 8332AC32
-C33C 8332AC33
-C33D 8332AC34
-C33E 8332AC35
-C33F 8332AC36
-C340 8332AC37
-C341 8332AC38
-C342 8332AC39
-C343 8332AD30
-C344 8332AD31
-C345 8332AD32
-C346 8332AD33
-C347 8332AD34
-C348 8332AD35
-C349 8332AD36
-C34A 8332AD37
-C34B 8332AD38
-C34C 8332AD39
-C34D 8332AE30
-C34E 8332AE31
-C34F 8332AE32
-C350 8332AE33
-C351 8332AE34
-C352 8332AE35
-C353 8332AE36
-C354 8332AE37
-C355 8332AE38
-C356 8332AE39
-C357 8332AF30
-C358 8332AF31
-C359 8332AF32
-C35A 8332AF33
-C35B 8332AF34
-C35C 8332AF35
-C35D 8332AF36
-C35E 8332AF37
-C35F 8332AF38
-C360 8332AF39
-C361 8332B030
-C362 8332B031
-C363 8332B032
-C364 8332B033
-C365 8332B034
-C366 8332B035
-C367 8332B036
-C368 8332B037
-C369 8332B038
-C36A 8332B039
-C36B 8332B130
-C36C 8332B131
-C36D 8332B132
-C36E 8332B133
-C36F 8332B134
-C370 8332B135
-C371 8332B136
-C372 8332B137
-C373 8332B138
-C374 8332B139
-C375 8332B230
-C376 8332B231
-C377 8332B232
-C378 8332B233
-C379 8332B234
-C37A 8332B235
-C37B 8332B236
-C37C 8332B237
-C37D 8332B238
-C37E 8332B239
-C37F 8332B330
-C380 8332B331
-C381 8332B332
-C382 8332B333
-C383 8332B334
-C384 8332B335
-C385 8332B336
-C386 8332B337
-C387 8332B338
-C388 8332B339
-C389 8332B430
-C38A 8332B431
-C38B 8332B432
-C38C 8332B433
-C38D 8332B434
-C38E 8332B435
-C38F 8332B436
-C390 8332B437
-C391 8332B438
-C392 8332B439
-C393 8332B530
-C394 8332B531
-C395 8332B532
-C396 8332B533
-C397 8332B534
-C398 8332B535
-C399 8332B536
-C39A 8332B537
-C39B 8332B538
-C39C 8332B539
-C39D 8332B630
-C39E 8332B631
-C39F 8332B632
-C3A0 8332B633
-C3A1 8332B634
-C3A2 8332B635
-C3A3 8332B636
-C3A4 8332B637
-C3A5 8332B638
-C3A6 8332B639
-C3A7 8332B730
-C3A8 8332B731
-C3A9 8332B732
-C3AA 8332B733
-C3AB 8332B734
-C3AC 8332B735
-C3AD 8332B736
-C3AE 8332B737
-C3AF 8332B738
-C3B0 8332B739
-C3B1 8332B830
-C3B2 8332B831
-C3B3 8332B832
-C3B4 8332B833
-C3B5 8332B834
-C3B6 8332B835
-C3B7 8332B836
-C3B8 8332B837
-C3B9 8332B838
-C3BA 8332B839
-C3BB 8332B930
-C3BC 8332B931
-C3BD 8332B932
-C3BE 8332B933
-C3BF 8332B934
-C3C0 8332B935
-C3C1 8332B936
-C3C2 8332B937
-C3C3 8332B938
-C3C4 8332B939
-C3C5 8332BA30
-C3C6 8332BA31
-C3C7 8332BA32
-C3C8 8332BA33
-C3C9 8332BA34
-C3CA 8332BA35
-C3CB 8332BA36
-C3CC 8332BA37
-C3CD 8332BA38
-C3CE 8332BA39
-C3CF 8332BB30
-C3D0 8332BB31
-C3D1 8332BB32
-C3D2 8332BB33
-C3D3 8332BB34
-C3D4 8332BB35
-C3D5 8332BB36
-C3D6 8332BB37
-C3D7 8332BB38
-C3D8 8332BB39
-C3D9 8332BC30
-C3DA 8332BC31
-C3DB 8332BC32
-C3DC 8332BC33
-C3DD 8332BC34
-C3DE 8332BC35
-C3DF 8332BC36
-C3E0 8332BC37
-C3E1 8332BC38
-C3E2 8332BC39
-C3E3 8332BD30
-C3E4 8332BD31
-C3E5 8332BD32
-C3E6 8332BD33
-C3E7 8332BD34
-C3E8 8332BD35
-C3E9 8332BD36
-C3EA 8332BD37
-C3EB 8332BD38
-C3EC 8332BD39
-C3ED 8332BE30
-C3EE 8332BE31
-C3EF 8332BE32
-C3F0 8332BE33
-C3F1 8332BE34
-C3F2 8332BE35
-C3F3 8332BE36
-C3F4 8332BE37
-C3F5 8332BE38
-C3F6 8332BE39
-C3F7 8332BF30
-C3F8 8332BF31
-C3F9 8332BF32
-C3FA 8332BF33
-C3FB 8332BF34
-C3FC 8332BF35
-C3FD 8332BF36
-C3FE 8332BF37
-C3FF 8332BF38
-C400 8332BF39
-C401 8332C030
-C402 8332C031
-C403 8332C032
-C404 8332C033
-C405 8332C034
-C406 8332C035
-C407 8332C036
-C408 8332C037
-C409 8332C038
-C40A 8332C039
-C40B 8332C130
-C40C 8332C131
-C40D 8332C132
-C40E 8332C133
-C40F 8332C134
-C410 8332C135
-C411 8332C136
-C412 8332C137
-C413 8332C138
-C414 8332C139
-C415 8332C230
-C416 8332C231
-C417 8332C232
-C418 8332C233
-C419 8332C234
-C41A 8332C235
-C41B 8332C236
-C41C 8332C237
-C41D 8332C238
-C41E 8332C239
-C41F 8332C330
-C420 8332C331
-C421 8332C332
-C422 8332C333
-C423 8332C334
-C424 8332C335
-C425 8332C336
-C426 8332C337
-C427 8332C338
-C428 8332C339
-C429 8332C430
-C42A 8332C431
-C42B 8332C432
-C42C 8332C433
-C42D 8332C434
-C42E 8332C435
-C42F 8332C436
-C430 8332C437
-C431 8332C438
-C432 8332C439
-C433 8332C530
-C434 8332C531
-C435 8332C532
-C436 8332C533
-C437 8332C534
-C438 8332C535
-C439 8332C536
-C43A 8332C537
-C43B 8332C538
-C43C 8332C539
-C43D 8332C630
-C43E 8332C631
-C43F 8332C632
-C440 8332C633
-C441 8332C634
-C442 8332C635
-C443 8332C636
-C444 8332C637
-C445 8332C638
-C446 8332C639
-C447 8332C730
-C448 8332C731
-C449 8332C732
-C44A 8332C733
-C44B 8332C734
-C44C 8332C735
-C44D 8332C736
-C44E 8332C737
-C44F 8332C738
-C450 8332C739
-C451 8332C830
-C452 8332C831
-C453 8332C832
-C454 8332C833
-C455 8332C834
-C456 8332C835
-C457 8332C836
-C458 8332C837
-C459 8332C838
-C45A 8332C839
-C45B 8332C930
-C45C 8332C931
-C45D 8332C932
-C45E 8332C933
-C45F 8332C934
-C460 8332C935
-C461 8332C936
-C462 8332C937
-C463 8332C938
-C464 8332C939
-C465 8332CA30
-C466 8332CA31
-C467 8332CA32
-C468 8332CA33
-C469 8332CA34
-C46A 8332CA35
-C46B 8332CA36
-C46C 8332CA37
-C46D 8332CA38
-C46E 8332CA39
-C46F 8332CB30
-C470 8332CB31
-C471 8332CB32
-C472 8332CB33
-C473 8332CB34
-C474 8332CB35
-C475 8332CB36
-C476 8332CB37
-C477 8332CB38
-C478 8332CB39
-C479 8332CC30
-C47A 8332CC31
-C47B 8332CC32
-C47C 8332CC33
-C47D 8332CC34
-C47E 8332CC35
-C47F 8332CC36
-C480 8332CC37
-C481 8332CC38
-C482 8332CC39
-C483 8332CD30
-C484 8332CD31
-C485 8332CD32
-C486 8332CD33
-C487 8332CD34
-C488 8332CD35
-C489 8332CD36
-C48A 8332CD37
-C48B 8332CD38
-C48C 8332CD39
-C48D 8332CE30
-C48E 8332CE31
-C48F 8332CE32
-C490 8332CE33
-C491 8332CE34
-C492 8332CE35
-C493 8332CE36
-C494 8332CE37
-C495 8332CE38
-C496 8332CE39
-C497 8332CF30
-C498 8332CF31
-C499 8332CF32
-C49A 8332CF33
-C49B 8332CF34
-C49C 8332CF35
-C49D 8332CF36
-C49E 8332CF37
-C49F 8332CF38
-C4A0 8332CF39
-C4A1 8332D030
-C4A2 8332D031
-C4A3 8332D032
-C4A4 8332D033
-C4A5 8332D034
-C4A6 8332D035
-C4A7 8332D036
-C4A8 8332D037
-C4A9 8332D038
-C4AA 8332D039
-C4AB 8332D130
-C4AC 8332D131
-C4AD 8332D132
-C4AE 8332D133
-C4AF 8332D134
-C4B0 8332D135
-C4B1 8332D136
-C4B2 8332D137
-C4B3 8332D138
-C4B4 8332D139
-C4B5 8332D230
-C4B6 8332D231
-C4B7 8332D232
-C4B8 8332D233
-C4B9 8332D234
-C4BA 8332D235
-C4BB 8332D236
-C4BC 8332D237
-C4BD 8332D238
-C4BE 8332D239
-C4BF 8332D330
-C4C0 8332D331
-C4C1 8332D332
-C4C2 8332D333
-C4C3 8332D334
-C4C4 8332D335
-C4C5 8332D336
-C4C6 8332D337
-C4C7 8332D338
-C4C8 8332D339
-C4C9 8332D430
-C4CA 8332D431
-C4CB 8332D432
-C4CC 8332D433
-C4CD 8332D434
-C4CE 8332D435
-C4CF 8332D436
-C4D0 8332D437
-C4D1 8332D438
-C4D2 8332D439
-C4D3 8332D530
-C4D4 8332D531
-C4D5 8332D532
-C4D6 8332D533
-C4D7 8332D534
-C4D8 8332D535
-C4D9 8332D536
-C4DA 8332D537
-C4DB 8332D538
-C4DC 8332D539
-C4DD 8332D630
-C4DE 8332D631
-C4DF 8332D632
-C4E0 8332D633
-C4E1 8332D634
-C4E2 8332D635
-C4E3 8332D636
-C4E4 8332D637
-C4E5 8332D638
-C4E6 8332D639
-C4E7 8332D730
-C4E8 8332D731
-C4E9 8332D732
-C4EA 8332D733
-C4EB 8332D734
-C4EC 8332D735
-C4ED 8332D736
-C4EE 8332D737
-C4EF 8332D738
-C4F0 8332D739
-C4F1 8332D830
-C4F2 8332D831
-C4F3 8332D832
-C4F4 8332D833
-C4F5 8332D834
-C4F6 8332D835
-C4F7 8332D836
-C4F8 8332D837
-C4F9 8332D838
-C4FA 8332D839
-C4FB 8332D930
-C4FC 8332D931
-C4FD 8332D932
-C4FE 8332D933
-C4FF 8332D934
-C500 8332D935
-C501 8332D936
-C502 8332D937
-C503 8332D938
-C504 8332D939
-C505 8332DA30
-C506 8332DA31
-C507 8332DA32
-C508 8332DA33
-C509 8332DA34
-C50A 8332DA35
-C50B 8332DA36
-C50C 8332DA37
-C50D 8332DA38
-C50E 8332DA39
-C50F 8332DB30
-C510 8332DB31
-C511 8332DB32
-C512 8332DB33
-C513 8332DB34
-C514 8332DB35
-C515 8332DB36
-C516 8332DB37
-C517 8332DB38
-C518 8332DB39
-C519 8332DC30
-C51A 8332DC31
-C51B 8332DC32
-C51C 8332DC33
-C51D 8332DC34
-C51E 8332DC35
-C51F 8332DC36
-C520 8332DC37
-C521 8332DC38
-C522 8332DC39
-C523 8332DD30
-C524 8332DD31
-C525 8332DD32
-C526 8332DD33
-C527 8332DD34
-C528 8332DD35
-C529 8332DD36
-C52A 8332DD37
-C52B 8332DD38
-C52C 8332DD39
-C52D 8332DE30
-C52E 8332DE31
-C52F 8332DE32
-C530 8332DE33
-C531 8332DE34
-C532 8332DE35
-C533 8332DE36
-C534 8332DE37
-C535 8332DE38
-C536 8332DE39
-C537 8332DF30
-C538 8332DF31
-C539 8332DF32
-C53A 8332DF33
-C53B 8332DF34
-C53C 8332DF35
-C53D 8332DF36
-C53E 8332DF37
-C53F 8332DF38
-C540 8332DF39
-C541 8332E030
-C542 8332E031
-C543 8332E032
-C544 8332E033
-C545 8332E034
-C546 8332E035
-C547 8332E036
-C548 8332E037
-C549 8332E038
-C54A 8332E039
-C54B 8332E130
-C54C 8332E131
-C54D 8332E132
-C54E 8332E133
-C54F 8332E134
-C550 8332E135
-C551 8332E136
-C552 8332E137
-C553 8332E138
-C554 8332E139
-C555 8332E230
-C556 8332E231
-C557 8332E232
-C558 8332E233
-C559 8332E234
-C55A 8332E235
-C55B 8332E236
-C55C 8332E237
-C55D 8332E238
-C55E 8332E239
-C55F 8332E330
-C560 8332E331
-C561 8332E332
-C562 8332E333
-C563 8332E334
-C564 8332E335
-C565 8332E336
-C566 8332E337
-C567 8332E338
-C568 8332E339
-C569 8332E430
-C56A 8332E431
-C56B 8332E432
-C56C 8332E433
-C56D 8332E434
-C56E 8332E435
-C56F 8332E436
-C570 8332E437
-C571 8332E438
-C572 8332E439
-C573 8332E530
-C574 8332E531
-C575 8332E532
-C576 8332E533
-C577 8332E534
-C578 8332E535
-C579 8332E536
-C57A 8332E537
-C57B 8332E538
-C57C 8332E539
-C57D 8332E630
-C57E 8332E631
-C57F 8332E632
-C580 8332E633
-C581 8332E634
-C582 8332E635
-C583 8332E636
-C584 8332E637
-C585 8332E638
-C586 8332E639
-C587 8332E730
-C588 8332E731
-C589 8332E732
-C58A 8332E733
-C58B 8332E734
-C58C 8332E735
-C58D 8332E736
-C58E 8332E737
-C58F 8332E738
-C590 8332E739
-C591 8332E830
-C592 8332E831
-C593 8332E832
-C594 8332E833
-C595 8332E834
-C596 8332E835
-C597 8332E836
-C598 8332E837
-C599 8332E838
-C59A 8332E839
-C59B 8332E930
-C59C 8332E931
-C59D 8332E932
-C59E 8332E933
-C59F 8332E934
-C5A0 8332E935
-C5A1 8332E936
-C5A2 8332E937
-C5A3 8332E938
-C5A4 8332E939
-C5A5 8332EA30
-C5A6 8332EA31
-C5A7 8332EA32
-C5A8 8332EA33
-C5A9 8332EA34
-C5AA 8332EA35
-C5AB 8332EA36
-C5AC 8332EA37
-C5AD 8332EA38
-C5AE 8332EA39
-C5AF 8332EB30
-C5B0 8332EB31
-C5B1 8332EB32
-C5B2 8332EB33
-C5B3 8332EB34
-C5B4 8332EB35
-C5B5 8332EB36
-C5B6 8332EB37
-C5B7 8332EB38
-C5B8 8332EB39
-C5B9 8332EC30
-C5BA 8332EC31
-C5BB 8332EC32
-C5BC 8332EC33
-C5BD 8332EC34
-C5BE 8332EC35
-C5BF 8332EC36
-C5C0 8332EC37
-C5C1 8332EC38
-C5C2 8332EC39
-C5C3 8332ED30
-C5C4 8332ED31
-C5C5 8332ED32
-C5C6 8332ED33
-C5C7 8332ED34
-C5C8 8332ED35
-C5C9 8332ED36
-C5CA 8332ED37
-C5CB 8332ED38
-C5CC 8332ED39
-C5CD 8332EE30
-C5CE 8332EE31
-C5CF 8332EE32
-C5D0 8332EE33
-C5D1 8332EE34
-C5D2 8332EE35
-C5D3 8332EE36
-C5D4 8332EE37
-C5D5 8332EE38
-C5D6 8332EE39
-C5D7 8332EF30
-C5D8 8332EF31
-C5D9 8332EF32
-C5DA 8332EF33
-C5DB 8332EF34
-C5DC 8332EF35
-C5DD 8332EF36
-C5DE 8332EF37
-C5DF 8332EF38
-C5E0 8332EF39
-C5E1 8332F030
-C5E2 8332F031
-C5E3 8332F032
-C5E4 8332F033
-C5E5 8332F034
-C5E6 8332F035
-C5E7 8332F036
-C5E8 8332F037
-C5E9 8332F038
-C5EA 8332F039
-C5EB 8332F130
-C5EC 8332F131
-C5ED 8332F132
-C5EE 8332F133
-C5EF 8332F134
-C5F0 8332F135
-C5F1 8332F136
-C5F2 8332F137
-C5F3 8332F138
-C5F4 8332F139
-C5F5 8332F230
-C5F6 8332F231
-C5F7 8332F232
-C5F8 8332F233
-C5F9 8332F234
-C5FA 8332F235
-C5FB 8332F236
-C5FC 8332F237
-C5FD 8332F238
-C5FE 8332F239
-C5FF 8332F330
-C600 8332F331
-C601 8332F332
-C602 8332F333
-C603 8332F334
-C604 8332F335
-C605 8332F336
-C606 8332F337
-C607 8332F338
-C608 8332F339
-C609 8332F430
-C60A 8332F431
-C60B 8332F432
-C60C 8332F433
-C60D 8332F434
-C60E 8332F435
-C60F 8332F436
-C610 8332F437
-C611 8332F438
-C612 8332F439
-C613 8332F530
-C614 8332F531
-C615 8332F532
-C616 8332F533
-C617 8332F534
-C618 8332F535
-C619 8332F536
-C61A 8332F537
-C61B 8332F538
-C61C 8332F539
-C61D 8332F630
-C61E 8332F631
-C61F 8332F632
-C620 8332F633
-C621 8332F634
-C622 8332F635
-C623 8332F636
-C624 8332F637
-C625 8332F638
-C626 8332F639
-C627 8332F730
-C628 8332F731
-C629 8332F732
-C62A 8332F733
-C62B 8332F734
-C62C 8332F735
-C62D 8332F736
-C62E 8332F737
-C62F 8332F738
-C630 8332F739
-C631 8332F830
-C632 8332F831
-C633 8332F832
-C634 8332F833
-C635 8332F834
-C636 8332F835
-C637 8332F836
-C638 8332F837
-C639 8332F838
-C63A 8332F839
-C63B 8332F930
-C63C 8332F931
-C63D 8332F932
-C63E 8332F933
-C63F 8332F934
-C640 8332F935
-C641 8332F936
-C642 8332F937
-C643 8332F938
-C644 8332F939
-C645 8332FA30
-C646 8332FA31
-C647 8332FA32
-C648 8332FA33
-C649 8332FA34
-C64A 8332FA35
-C64B 8332FA36
-C64C 8332FA37
-C64D 8332FA38
-C64E 8332FA39
-C64F 8332FB30
-C650 8332FB31
-C651 8332FB32
-C652 8332FB33
-C653 8332FB34
-C654 8332FB35
-C655 8332FB36
-C656 8332FB37
-C657 8332FB38
-C658 8332FB39
-C659 8332FC30
-C65A 8332FC31
-C65B 8332FC32
-C65C 8332FC33
-C65D 8332FC34
-C65E 8332FC35
-C65F 8332FC36
-C660 8332FC37
-C661 8332FC38
-C662 8332FC39
-C663 8332FD30
-C664 8332FD31
-C665 8332FD32
-C666 8332FD33
-C667 8332FD34
-C668 8332FD35
-C669 8332FD36
-C66A 8332FD37
-C66B 8332FD38
-C66C 8332FD39
-C66D 8332FE30
-C66E 8332FE31
-C66F 8332FE32
-C670 8332FE33
-C671 8332FE34
-C672 8332FE35
-C673 8332FE36
-C674 8332FE37
-C675 8332FE38
-C676 8332FE39
-C677 83338130
-C678 83338131
-C679 83338132
-C67A 83338133
-C67B 83338134
-C67C 83338135
-C67D 83338136
-C67E 83338137
-C67F 83338138
-C680 83338139
-C681 83338230
-C682 83338231
-C683 83338232
-C684 83338233
-C685 83338234
-C686 83338235
-C687 83338236
-C688 83338237
-C689 83338238
-C68A 83338239
-C68B 83338330
-C68C 83338331
-C68D 83338332
-C68E 83338333
-C68F 83338334
-C690 83338335
-C691 83338336
-C692 83338337
-C693 83338338
-C694 83338339
-C695 83338430
-C696 83338431
-C697 83338432
-C698 83338433
-C699 83338434
-C69A 83338435
-C69B 83338436
-C69C 83338437
-C69D 83338438
-C69E 83338439
-C69F 83338530
-C6A0 83338531
-C6A1 83338532
-C6A2 83338533
-C6A3 83338534
-C6A4 83338535
-C6A5 83338536
-C6A6 83338537
-C6A7 83338538
-C6A8 83338539
-C6A9 83338630
-C6AA 83338631
-C6AB 83338632
-C6AC 83338633
-C6AD 83338634
-C6AE 83338635
-C6AF 83338636
-C6B0 83338637
-C6B1 83338638
-C6B2 83338639
-C6B3 83338730
-C6B4 83338731
-C6B5 83338732
-C6B6 83338733
-C6B7 83338734
-C6B8 83338735
-C6B9 83338736
-C6BA 83338737
-C6BB 83338738
-C6BC 83338739
-C6BD 83338830
-C6BE 83338831
-C6BF 83338832
-C6C0 83338833
-C6C1 83338834
-C6C2 83338835
-C6C3 83338836
-C6C4 83338837
-C6C5 83338838
-C6C6 83338839
-C6C7 83338930
-C6C8 83338931
-C6C9 83338932
-C6CA 83338933
-C6CB 83338934
-C6CC 83338935
-C6CD 83338936
-C6CE 83338937
-C6CF 83338938
-C6D0 83338939
-C6D1 83338A30
-C6D2 83338A31
-C6D3 83338A32
-C6D4 83338A33
-C6D5 83338A34
-C6D6 83338A35
-C6D7 83338A36
-C6D8 83338A37
-C6D9 83338A38
-C6DA 83338A39
-C6DB 83338B30
-C6DC 83338B31
-C6DD 83338B32
-C6DE 83338B33
-C6DF 83338B34
-C6E0 83338B35
-C6E1 83338B36
-C6E2 83338B37
-C6E3 83338B38
-C6E4 83338B39
-C6E5 83338C30
-C6E6 83338C31
-C6E7 83338C32
-C6E8 83338C33
-C6E9 83338C34
-C6EA 83338C35
-C6EB 83338C36
-C6EC 83338C37
-C6ED 83338C38
-C6EE 83338C39
-C6EF 83338D30
-C6F0 83338D31
-C6F1 83338D32
-C6F2 83338D33
-C6F3 83338D34
-C6F4 83338D35
-C6F5 83338D36
-C6F6 83338D37
-C6F7 83338D38
-C6F8 83338D39
-C6F9 83338E30
-C6FA 83338E31
-C6FB 83338E32
-C6FC 83338E33
-C6FD 83338E34
-C6FE 83338E35
-C6FF 83338E36
-C700 83338E37
-C701 83338E38
-C702 83338E39
-C703 83338F30
-C704 83338F31
-C705 83338F32
-C706 83338F33
-C707 83338F34
-C708 83338F35
-C709 83338F36
-C70A 83338F37
-C70B 83338F38
-C70C 83338F39
-C70D 83339030
-C70E 83339031
-C70F 83339032
-C710 83339033
-C711 83339034
-C712 83339035
-C713 83339036
-C714 83339037
-C715 83339038
-C716 83339039
-C717 83339130
-C718 83339131
-C719 83339132
-C71A 83339133
-C71B 83339134
-C71C 83339135
-C71D 83339136
-C71E 83339137
-C71F 83339138
-C720 83339139
-C721 83339230
-C722 83339231
-C723 83339232
-C724 83339233
-C725 83339234
-C726 83339235
-C727 83339236
-C728 83339237
-C729 83339238
-C72A 83339239
-C72B 83339330
-C72C 83339331
-C72D 83339332
-C72E 83339333
-C72F 83339334
-C730 83339335
-C731 83339336
-C732 83339337
-C733 83339338
-C734 83339339
-C735 83339430
-C736 83339431
-C737 83339432
-C738 83339433
-C739 83339434
-C73A 83339435
-C73B 83339436
-C73C 83339437
-C73D 83339438
-C73E 83339439
-C73F 83339530
-C740 83339531
-C741 83339532
-C742 83339533
-C743 83339534
-C744 83339535
-C745 83339536
-C746 83339537
-C747 83339538
-C748 83339539
-C749 83339630
-C74A 83339631
-C74B 83339632
-C74C 83339633
-C74D 83339634
-C74E 83339635
-C74F 83339636
-C750 83339637
-C751 83339638
-C752 83339639
-C753 83339730
-C754 83339731
-C755 83339732
-C756 83339733
-C757 83339734
-C758 83339735
-C759 83339736
-C75A 83339737
-C75B 83339738
-C75C 83339739
-C75D 83339830
-C75E 83339831
-C75F 83339832
-C760 83339833
-C761 83339834
-C762 83339835
-C763 83339836
-C764 83339837
-C765 83339838
-C766 83339839
-C767 83339930
-C768 83339931
-C769 83339932
-C76A 83339933
-C76B 83339934
-C76C 83339935
-C76D 83339936
-C76E 83339937
-C76F 83339938
-C770 83339939
-C771 83339A30
-C772 83339A31
-C773 83339A32
-C774 83339A33
-C775 83339A34
-C776 83339A35
-C777 83339A36
-C778 83339A37
-C779 83339A38
-C77A 83339A39
-C77B 83339B30
-C77C 83339B31
-C77D 83339B32
-C77E 83339B33
-C77F 83339B34
-C780 83339B35
-C781 83339B36
-C782 83339B37
-C783 83339B38
-C784 83339B39
-C785 83339C30
-C786 83339C31
-C787 83339C32
-C788 83339C33
-C789 83339C34
-C78A 83339C35
-C78B 83339C36
-C78C 83339C37
-C78D 83339C38
-C78E 83339C39
-C78F 83339D30
-C790 83339D31
-C791 83339D32
-C792 83339D33
-C793 83339D34
-C794 83339D35
-C795 83339D36
-C796 83339D37
-C797 83339D38
-C798 83339D39
-C799 83339E30
-C79A 83339E31
-C79B 83339E32
-C79C 83339E33
-C79D 83339E34
-C79E 83339E35
-C79F 83339E36
-C7A0 83339E37
-C7A1 83339E38
-C7A2 83339E39
-C7A3 83339F30
-C7A4 83339F31
-C7A5 83339F32
-C7A6 83339F33
-C7A7 83339F34
-C7A8 83339F35
-C7A9 83339F36
-C7AA 83339F37
-C7AB 83339F38
-C7AC 83339F39
-C7AD 8333A030
-C7AE 8333A031
-C7AF 8333A032
-C7B0 8333A033
-C7B1 8333A034
-C7B2 8333A035
-C7B3 8333A036
-C7B4 8333A037
-C7B5 8333A038
-C7B6 8333A039
-C7B7 8333A130
-C7B8 8333A131
-C7B9 8333A132
-C7BA 8333A133
-C7BB 8333A134
-C7BC 8333A135
-C7BD 8333A136
-C7BE 8333A137
-C7BF 8333A138
-C7C0 8333A139
-C7C1 8333A230
-C7C2 8333A231
-C7C3 8333A232
-C7C4 8333A233
-C7C5 8333A234
-C7C6 8333A235
-C7C7 8333A236
-C7C8 8333A237
-C7C9 8333A238
-C7CA 8333A239
-C7CB 8333A330
-C7CC 8333A331
-C7CD 8333A332
-C7CE 8333A333
-C7CF 8333A334
-C7D0 8333A335
-C7D1 8333A336
-C7D2 8333A337
-C7D3 8333A338
-C7D4 8333A339
-C7D5 8333A430
-C7D6 8333A431
-C7D7 8333A432
-C7D8 8333A433
-C7D9 8333A434
-C7DA 8333A435
-C7DB 8333A436
-C7DC 8333A437
-C7DD 8333A438
-C7DE 8333A439
-C7DF 8333A530
-C7E0 8333A531
-C7E1 8333A532
-C7E2 8333A533
-C7E3 8333A534
-C7E4 8333A535
-C7E5 8333A536
-C7E6 8333A537
-C7E7 8333A538
-C7E8 8333A539
-C7E9 8333A630
-C7EA 8333A631
-C7EB 8333A632
-C7EC 8333A633
-C7ED 8333A634
-C7EE 8333A635
-C7EF 8333A636
-C7F0 8333A637
-C7F1 8333A638
-C7F2 8333A639
-C7F3 8333A730
-C7F4 8333A731
-C7F5 8333A732
-C7F6 8333A733
-C7F7 8333A734
-C7F8 8333A735
-C7F9 8333A736
-C7FA 8333A737
-C7FB 8333A738
-C7FC 8333A739
-C7FD 8333A830
-C7FE 8333A831
-C7FF 8333A832
-C800 8333A833
-C801 8333A834
-C802 8333A835
-C803 8333A836
-C804 8333A837
-C805 8333A838
-C806 8333A839
-C807 8333A930
-C808 8333A931
-C809 8333A932
-C80A 8333A933
-C80B 8333A934
-C80C 8333A935
-C80D 8333A936
-C80E 8333A937
-C80F 8333A938
-C810 8333A939
-C811 8333AA30
-C812 8333AA31
-C813 8333AA32
-C814 8333AA33
-C815 8333AA34
-C816 8333AA35
-C817 8333AA36
-C818 8333AA37
-C819 8333AA38
-C81A 8333AA39
-C81B 8333AB30
-C81C 8333AB31
-C81D 8333AB32
-C81E 8333AB33
-C81F 8333AB34
-C820 8333AB35
-C821 8333AB36
-C822 8333AB37
-C823 8333AB38
-C824 8333AB39
-C825 8333AC30
-C826 8333AC31
-C827 8333AC32
-C828 8333AC33
-C829 8333AC34
-C82A 8333AC35
-C82B 8333AC36
-C82C 8333AC37
-C82D 8333AC38
-C82E 8333AC39
-C82F 8333AD30
-C830 8333AD31
-C831 8333AD32
-C832 8333AD33
-C833 8333AD34
-C834 8333AD35
-C835 8333AD36
-C836 8333AD37
-C837 8333AD38
-C838 8333AD39
-C839 8333AE30
-C83A 8333AE31
-C83B 8333AE32
-C83C 8333AE33
-C83D 8333AE34
-C83E 8333AE35
-C83F 8333AE36
-C840 8333AE37
-C841 8333AE38
-C842 8333AE39
-C843 8333AF30
-C844 8333AF31
-C845 8333AF32
-C846 8333AF33
-C847 8333AF34
-C848 8333AF35
-C849 8333AF36
-C84A 8333AF37
-C84B 8333AF38
-C84C 8333AF39
-C84D 8333B030
-C84E 8333B031
-C84F 8333B032
-C850 8333B033
-C851 8333B034
-C852 8333B035
-C853 8333B036
-C854 8333B037
-C855 8333B038
-C856 8333B039
-C857 8333B130
-C858 8333B131
-C859 8333B132
-C85A 8333B133
-C85B 8333B134
-C85C 8333B135
-C85D 8333B136
-C85E 8333B137
-C85F 8333B138
-C860 8333B139
-C861 8333B230
-C862 8333B231
-C863 8333B232
-C864 8333B233
-C865 8333B234
-C866 8333B235
-C867 8333B236
-C868 8333B237
-C869 8333B238
-C86A 8333B239
-C86B 8333B330
-C86C 8333B331
-C86D 8333B332
-C86E 8333B333
-C86F 8333B334
-C870 8333B335
-C871 8333B336
-C872 8333B337
-C873 8333B338
-C874 8333B339
-C875 8333B430
-C876 8333B431
-C877 8333B432
-C878 8333B433
-C879 8333B434
-C87A 8333B435
-C87B 8333B436
-C87C 8333B437
-C87D 8333B438
-C87E 8333B439
-C87F 8333B530
-C880 8333B531
-C881 8333B532
-C882 8333B533
-C883 8333B534
-C884 8333B535
-C885 8333B536
-C886 8333B537
-C887 8333B538
-C888 8333B539
-C889 8333B630
-C88A 8333B631
-C88B 8333B632
-C88C 8333B633
-C88D 8333B634
-C88E 8333B635
-C88F 8333B636
-C890 8333B637
-C891 8333B638
-C892 8333B639
-C893 8333B730
-C894 8333B731
-C895 8333B732
-C896 8333B733
-C897 8333B734
-C898 8333B735
-C899 8333B736
-C89A 8333B737
-C89B 8333B738
-C89C 8333B739
-C89D 8333B830
-C89E 8333B831
-C89F 8333B832
-C8A0 8333B833
-C8A1 8333B834
-C8A2 8333B835
-C8A3 8333B836
-C8A4 8333B837
-C8A5 8333B838
-C8A6 8333B839
-C8A7 8333B930
-C8A8 8333B931
-C8A9 8333B932
-C8AA 8333B933
-C8AB 8333B934
-C8AC 8333B935
-C8AD 8333B936
-C8AE 8333B937
-C8AF 8333B938
-C8B0 8333B939
-C8B1 8333BA30
-C8B2 8333BA31
-C8B3 8333BA32
-C8B4 8333BA33
-C8B5 8333BA34
-C8B6 8333BA35
-C8B7 8333BA36
-C8B8 8333BA37
-C8B9 8333BA38
-C8BA 8333BA39
-C8BB 8333BB30
-C8BC 8333BB31
-C8BD 8333BB32
-C8BE 8333BB33
-C8BF 8333BB34
-C8C0 8333BB35
-C8C1 8333BB36
-C8C2 8333BB37
-C8C3 8333BB38
-C8C4 8333BB39
-C8C5 8333BC30
-C8C6 8333BC31
-C8C7 8333BC32
-C8C8 8333BC33
-C8C9 8333BC34
-C8CA 8333BC35
-C8CB 8333BC36
-C8CC 8333BC37
-C8CD 8333BC38
-C8CE 8333BC39
-C8CF 8333BD30
-C8D0 8333BD31
-C8D1 8333BD32
-C8D2 8333BD33
-C8D3 8333BD34
-C8D4 8333BD35
-C8D5 8333BD36
-C8D6 8333BD37
-C8D7 8333BD38
-C8D8 8333BD39
-C8D9 8333BE30
-C8DA 8333BE31
-C8DB 8333BE32
-C8DC 8333BE33
-C8DD 8333BE34
-C8DE 8333BE35
-C8DF 8333BE36
-C8E0 8333BE37
-C8E1 8333BE38
-C8E2 8333BE39
-C8E3 8333BF30
-C8E4 8333BF31
-C8E5 8333BF32
-C8E6 8333BF33
-C8E7 8333BF34
-C8E8 8333BF35
-C8E9 8333BF36
-C8EA 8333BF37
-C8EB 8333BF38
-C8EC 8333BF39
-C8ED 8333C030
-C8EE 8333C031
-C8EF 8333C032
-C8F0 8333C033
-C8F1 8333C034
-C8F2 8333C035
-C8F3 8333C036
-C8F4 8333C037
-C8F5 8333C038
-C8F6 8333C039
-C8F7 8333C130
-C8F8 8333C131
-C8F9 8333C132
-C8FA 8333C133
-C8FB 8333C134
-C8FC 8333C135
-C8FD 8333C136
-C8FE 8333C137
-C8FF 8333C138
-C900 8333C139
-C901 8333C230
-C902 8333C231
-C903 8333C232
-C904 8333C233
-C905 8333C234
-C906 8333C235
-C907 8333C236
-C908 8333C237
-C909 8333C238
-C90A 8333C239
-C90B 8333C330
-C90C 8333C331
-C90D 8333C332
-C90E 8333C333
-C90F 8333C334
-C910 8333C335
-C911 8333C336
-C912 8333C337
-C913 8333C338
-C914 8333C339
-C915 8333C430
-C916 8333C431
-C917 8333C432
-C918 8333C433
-C919 8333C434
-C91A 8333C435
-C91B 8333C436
-C91C 8333C437
-C91D 8333C438
-C91E 8333C439
-C91F 8333C530
-C920 8333C531
-C921 8333C532
-C922 8333C533
-C923 8333C534
-C924 8333C535
-C925 8333C536
-C926 8333C537
-C927 8333C538
-C928 8333C539
-C929 8333C630
-C92A 8333C631
-C92B 8333C632
-C92C 8333C633
-C92D 8333C634
-C92E 8333C635
-C92F 8333C636
-C930 8333C637
-C931 8333C638
-C932 8333C639
-C933 8333C730
-C934 8333C731
-C935 8333C732
-C936 8333C733
-C937 8333C734
-C938 8333C735
-C939 8333C736
-C93A 8333C737
-C93B 8333C738
-C93C 8333C739
-C93D 8333C830
-C93E 8333C831
-C93F 8333C832
-C940 8333C833
-C941 8333C834
-C942 8333C835
-C943 8333C836
-C944 8333C837
-C945 8333C838
-C946 8333C839
-C947 8333C930
-C948 8333C931
-C949 8333C932
-C94A 8333C933
-C94B 8333C934
-C94C 8333C935
-C94D 8333C936
-C94E 8333C937
-C94F 8333C938
-C950 8333C939
-C951 8333CA30
-C952 8333CA31
-C953 8333CA32
-C954 8333CA33
-C955 8333CA34
-C956 8333CA35
-C957 8333CA36
-C958 8333CA37
-C959 8333CA38
-C95A 8333CA39
-C95B 8333CB30
-C95C 8333CB31
-C95D 8333CB32
-C95E 8333CB33
-C95F 8333CB34
-C960 8333CB35
-C961 8333CB36
-C962 8333CB37
-C963 8333CB38
-C964 8333CB39
-C965 8333CC30
-C966 8333CC31
-C967 8333CC32
-C968 8333CC33
-C969 8333CC34
-C96A 8333CC35
-C96B 8333CC36
-C96C 8333CC37
-C96D 8333CC38
-C96E 8333CC39
-C96F 8333CD30
-C970 8333CD31
-C971 8333CD32
-C972 8333CD33
-C973 8333CD34
-C974 8333CD35
-C975 8333CD36
-C976 8333CD37
-C977 8333CD38
-C978 8333CD39
-C979 8333CE30
-C97A 8333CE31
-C97B 8333CE32
-C97C 8333CE33
-C97D 8333CE34
-C97E 8333CE35
-C97F 8333CE36
-C980 8333CE37
-C981 8333CE38
-C982 8333CE39
-C983 8333CF30
-C984 8333CF31
-C985 8333CF32
-C986 8333CF33
-C987 8333CF34
-C988 8333CF35
-C989 8333CF36
-C98A 8333CF37
-C98B 8333CF38
-C98C 8333CF39
-C98D 8333D030
-C98E 8333D031
-C98F 8333D032
-C990 8333D033
-C991 8333D034
-C992 8333D035
-C993 8333D036
-C994 8333D037
-C995 8333D038
-C996 8333D039
-C997 8333D130
-C998 8333D131
-C999 8333D132
-C99A 8333D133
-C99B 8333D134
-C99C 8333D135
-C99D 8333D136
-C99E 8333D137
-C99F 8333D138
-C9A0 8333D139
-C9A1 8333D230
-C9A2 8333D231
-C9A3 8333D232
-C9A4 8333D233
-C9A5 8333D234
-C9A6 8333D235
-C9A7 8333D236
-C9A8 8333D237
-C9A9 8333D238
-C9AA 8333D239
-C9AB 8333D330
-C9AC 8333D331
-C9AD 8333D332
-C9AE 8333D333
-C9AF 8333D334
-C9B0 8333D335
-C9B1 8333D336
-C9B2 8333D337
-C9B3 8333D338
-C9B4 8333D339
-C9B5 8333D430
-C9B6 8333D431
-C9B7 8333D432
-C9B8 8333D433
-C9B9 8333D434
-C9BA 8333D435
-C9BB 8333D436
-C9BC 8333D437
-C9BD 8333D438
-C9BE 8333D439
-C9BF 8333D530
-C9C0 8333D531
-C9C1 8333D532
-C9C2 8333D533
-C9C3 8333D534
-C9C4 8333D535
-C9C5 8333D536
-C9C6 8333D537
-C9C7 8333D538
-C9C8 8333D539
-C9C9 8333D630
-C9CA 8333D631
-C9CB 8333D632
-C9CC 8333D633
-C9CD 8333D634
-C9CE 8333D635
-C9CF 8333D636
-C9D0 8333D637
-C9D1 8333D638
-C9D2 8333D639
-C9D3 8333D730
-C9D4 8333D731
-C9D5 8333D732
-C9D6 8333D733
-C9D7 8333D734
-C9D8 8333D735
-C9D9 8333D736
-C9DA 8333D737
-C9DB 8333D738
-C9DC 8333D739
-C9DD 8333D830
-C9DE 8333D831
-C9DF 8333D832
-C9E0 8333D833
-C9E1 8333D834
-C9E2 8333D835
-C9E3 8333D836
-C9E4 8333D837
-C9E5 8333D838
-C9E6 8333D839
-C9E7 8333D930
-C9E8 8333D931
-C9E9 8333D932
-C9EA 8333D933
-C9EB 8333D934
-C9EC 8333D935
-C9ED 8333D936
-C9EE 8333D937
-C9EF 8333D938
-C9F0 8333D939
-C9F1 8333DA30
-C9F2 8333DA31
-C9F3 8333DA32
-C9F4 8333DA33
-C9F5 8333DA34
-C9F6 8333DA35
-C9F7 8333DA36
-C9F8 8333DA37
-C9F9 8333DA38
-C9FA 8333DA39
-C9FB 8333DB30
-C9FC 8333DB31
-C9FD 8333DB32
-C9FE 8333DB33
-C9FF 8333DB34
-CA00 8333DB35
-CA01 8333DB36
-CA02 8333DB37
-CA03 8333DB38
-CA04 8333DB39
-CA05 8333DC30
-CA06 8333DC31
-CA07 8333DC32
-CA08 8333DC33
-CA09 8333DC34
-CA0A 8333DC35
-CA0B 8333DC36
-CA0C 8333DC37
-CA0D 8333DC38
-CA0E 8333DC39
-CA0F 8333DD30
-CA10 8333DD31
-CA11 8333DD32
-CA12 8333DD33
-CA13 8333DD34
-CA14 8333DD35
-CA15 8333DD36
-CA16 8333DD37
-CA17 8333DD38
-CA18 8333DD39
-CA19 8333DE30
-CA1A 8333DE31
-CA1B 8333DE32
-CA1C 8333DE33
-CA1D 8333DE34
-CA1E 8333DE35
-CA1F 8333DE36
-CA20 8333DE37
-CA21 8333DE38
-CA22 8333DE39
-CA23 8333DF30
-CA24 8333DF31
-CA25 8333DF32
-CA26 8333DF33
-CA27 8333DF34
-CA28 8333DF35
-CA29 8333DF36
-CA2A 8333DF37
-CA2B 8333DF38
-CA2C 8333DF39
-CA2D 8333E030
-CA2E 8333E031
-CA2F 8333E032
-CA30 8333E033
-CA31 8333E034
-CA32 8333E035
-CA33 8333E036
-CA34 8333E037
-CA35 8333E038
-CA36 8333E039
-CA37 8333E130
-CA38 8333E131
-CA39 8333E132
-CA3A 8333E133
-CA3B 8333E134
-CA3C 8333E135
-CA3D 8333E136
-CA3E 8333E137
-CA3F 8333E138
-CA40 8333E139
-CA41 8333E230
-CA42 8333E231
-CA43 8333E232
-CA44 8333E233
-CA45 8333E234
-CA46 8333E235
-CA47 8333E236
-CA48 8333E237
-CA49 8333E238
-CA4A 8333E239
-CA4B 8333E330
-CA4C 8333E331
-CA4D 8333E332
-CA4E 8333E333
-CA4F 8333E334
-CA50 8333E335
-CA51 8333E336
-CA52 8333E337
-CA53 8333E338
-CA54 8333E339
-CA55 8333E430
-CA56 8333E431
-CA57 8333E432
-CA58 8333E433
-CA59 8333E434
-CA5A 8333E435
-CA5B 8333E436
-CA5C 8333E437
-CA5D 8333E438
-CA5E 8333E439
-CA5F 8333E530
-CA60 8333E531
-CA61 8333E532
-CA62 8333E533
-CA63 8333E534
-CA64 8333E535
-CA65 8333E536
-CA66 8333E537
-CA67 8333E538
-CA68 8333E539
-CA69 8333E630
-CA6A 8333E631
-CA6B 8333E632
-CA6C 8333E633
-CA6D 8333E634
-CA6E 8333E635
-CA6F 8333E636
-CA70 8333E637
-CA71 8333E638
-CA72 8333E639
-CA73 8333E730
-CA74 8333E731
-CA75 8333E732
-CA76 8333E733
-CA77 8333E734
-CA78 8333E735
-CA79 8333E736
-CA7A 8333E737
-CA7B 8333E738
-CA7C 8333E739
-CA7D 8333E830
-CA7E 8333E831
-CA7F 8333E832
-CA80 8333E833
-CA81 8333E834
-CA82 8333E835
-CA83 8333E836
-CA84 8333E837
-CA85 8333E838
-CA86 8333E839
-CA87 8333E930
-CA88 8333E931
-CA89 8333E932
-CA8A 8333E933
-CA8B 8333E934
-CA8C 8333E935
-CA8D 8333E936
-CA8E 8333E937
-CA8F 8333E938
-CA90 8333E939
-CA91 8333EA30
-CA92 8333EA31
-CA93 8333EA32
-CA94 8333EA33
-CA95 8333EA34
-CA96 8333EA35
-CA97 8333EA36
-CA98 8333EA37
-CA99 8333EA38
-CA9A 8333EA39
-CA9B 8333EB30
-CA9C 8333EB31
-CA9D 8333EB32
-CA9E 8333EB33
-CA9F 8333EB34
-CAA0 8333EB35
-CAA1 8333EB36
-CAA2 8333EB37
-CAA3 8333EB38
-CAA4 8333EB39
-CAA5 8333EC30
-CAA6 8333EC31
-CAA7 8333EC32
-CAA8 8333EC33
-CAA9 8333EC34
-CAAA 8333EC35
-CAAB 8333EC36
-CAAC 8333EC37
-CAAD 8333EC38
-CAAE 8333EC39
-CAAF 8333ED30
-CAB0 8333ED31
-CAB1 8333ED32
-CAB2 8333ED33
-CAB3 8333ED34
-CAB4 8333ED35
-CAB5 8333ED36
-CAB6 8333ED37
-CAB7 8333ED38
-CAB8 8333ED39
-CAB9 8333EE30
-CABA 8333EE31
-CABB 8333EE32
-CABC 8333EE33
-CABD 8333EE34
-CABE 8333EE35
-CABF 8333EE36
-CAC0 8333EE37
-CAC1 8333EE38
-CAC2 8333EE39
-CAC3 8333EF30
-CAC4 8333EF31
-CAC5 8333EF32
-CAC6 8333EF33
-CAC7 8333EF34
-CAC8 8333EF35
-CAC9 8333EF36
-CACA 8333EF37
-CACB 8333EF38
-CACC 8333EF39
-CACD 8333F030
-CACE 8333F031
-CACF 8333F032
-CAD0 8333F033
-CAD1 8333F034
-CAD2 8333F035
-CAD3 8333F036
-CAD4 8333F037
-CAD5 8333F038
-CAD6 8333F039
-CAD7 8333F130
-CAD8 8333F131
-CAD9 8333F132
-CADA 8333F133
-CADB 8333F134
-CADC 8333F135
-CADD 8333F136
-CADE 8333F137
-CADF 8333F138
-CAE0 8333F139
-CAE1 8333F230
-CAE2 8333F231
-CAE3 8333F232
-CAE4 8333F233
-CAE5 8333F234
-CAE6 8333F235
-CAE7 8333F236
-CAE8 8333F237
-CAE9 8333F238
-CAEA 8333F239
-CAEB 8333F330
-CAEC 8333F331
-CAED 8333F332
-CAEE 8333F333
-CAEF 8333F334
-CAF0 8333F335
-CAF1 8333F336
-CAF2 8333F337
-CAF3 8333F338
-CAF4 8333F339
-CAF5 8333F430
-CAF6 8333F431
-CAF7 8333F432
-CAF8 8333F433
-CAF9 8333F434
-CAFA 8333F435
-CAFB 8333F436
-CAFC 8333F437
-CAFD 8333F438
-CAFE 8333F439
-CAFF 8333F530
-CB00 8333F531
-CB01 8333F532
-CB02 8333F533
-CB03 8333F534
-CB04 8333F535
-CB05 8333F536
-CB06 8333F537
-CB07 8333F538
-CB08 8333F539
-CB09 8333F630
-CB0A 8333F631
-CB0B 8333F632
-CB0C 8333F633
-CB0D 8333F634
-CB0E 8333F635
-CB0F 8333F636
-CB10 8333F637
-CB11 8333F638
-CB12 8333F639
-CB13 8333F730
-CB14 8333F731
-CB15 8333F732
-CB16 8333F733
-CB17 8333F734
-CB18 8333F735
-CB19 8333F736
-CB1A 8333F737
-CB1B 8333F738
-CB1C 8333F739
-CB1D 8333F830
-CB1E 8333F831
-CB1F 8333F832
-CB20 8333F833
-CB21 8333F834
-CB22 8333F835
-CB23 8333F836
-CB24 8333F837
-CB25 8333F838
-CB26 8333F839
-CB27 8333F930
-CB28 8333F931
-CB29 8333F932
-CB2A 8333F933
-CB2B 8333F934
-CB2C 8333F935
-CB2D 8333F936
-CB2E 8333F937
-CB2F 8333F938
-CB30 8333F939
-CB31 8333FA30
-CB32 8333FA31
-CB33 8333FA32
-CB34 8333FA33
-CB35 8333FA34
-CB36 8333FA35
-CB37 8333FA36
-CB38 8333FA37
-CB39 8333FA38
-CB3A 8333FA39
-CB3B 8333FB30
-CB3C 8333FB31
-CB3D 8333FB32
-CB3E 8333FB33
-CB3F 8333FB34
-CB40 8333FB35
-CB41 8333FB36
-CB42 8333FB37
-CB43 8333FB38
-CB44 8333FB39
-CB45 8333FC30
-CB46 8333FC31
-CB47 8333FC32
-CB48 8333FC33
-CB49 8333FC34
-CB4A 8333FC35
-CB4B 8333FC36
-CB4C 8333FC37
-CB4D 8333FC38
-CB4E 8333FC39
-CB4F 8333FD30
-CB50 8333FD31
-CB51 8333FD32
-CB52 8333FD33
-CB53 8333FD34
-CB54 8333FD35
-CB55 8333FD36
-CB56 8333FD37
-CB57 8333FD38
-CB58 8333FD39
-CB59 8333FE30
-CB5A 8333FE31
-CB5B 8333FE32
-CB5C 8333FE33
-CB5D 8333FE34
-CB5E 8333FE35
-CB5F 8333FE36
-CB60 8333FE37
-CB61 8333FE38
-CB62 8333FE39
-CB63 83348130
-CB64 83348131
-CB65 83348132
-CB66 83348133
-CB67 83348134
-CB68 83348135
-CB69 83348136
-CB6A 83348137
-CB6B 83348138
-CB6C 83348139
-CB6D 83348230
-CB6E 83348231
-CB6F 83348232
-CB70 83348233
-CB71 83348234
-CB72 83348235
-CB73 83348236
-CB74 83348237
-CB75 83348238
-CB76 83348239
-CB77 83348330
-CB78 83348331
-CB79 83348332
-CB7A 83348333
-CB7B 83348334
-CB7C 83348335
-CB7D 83348336
-CB7E 83348337
-CB7F 83348338
-CB80 83348339
-CB81 83348430
-CB82 83348431
-CB83 83348432
-CB84 83348433
-CB85 83348434
-CB86 83348435
-CB87 83348436
-CB88 83348437
-CB89 83348438
-CB8A 83348439
-CB8B 83348530
-CB8C 83348531
-CB8D 83348532
-CB8E 83348533
-CB8F 83348534
-CB90 83348535
-CB91 83348536
-CB92 83348537
-CB93 83348538
-CB94 83348539
-CB95 83348630
-CB96 83348631
-CB97 83348632
-CB98 83348633
-CB99 83348634
-CB9A 83348635
-CB9B 83348636
-CB9C 83348637
-CB9D 83348638
-CB9E 83348639
-CB9F 83348730
-CBA0 83348731
-CBA1 83348732
-CBA2 83348733
-CBA3 83348734
-CBA4 83348735
-CBA5 83348736
-CBA6 83348737
-CBA7 83348738
-CBA8 83348739
-CBA9 83348830
-CBAA 83348831
-CBAB 83348832
-CBAC 83348833
-CBAD 83348834
-CBAE 83348835
-CBAF 83348836
-CBB0 83348837
-CBB1 83348838
-CBB2 83348839
-CBB3 83348930
-CBB4 83348931
-CBB5 83348932
-CBB6 83348933
-CBB7 83348934
-CBB8 83348935
-CBB9 83348936
-CBBA 83348937
-CBBB 83348938
-CBBC 83348939
-CBBD 83348A30
-CBBE 83348A31
-CBBF 83348A32
-CBC0 83348A33
-CBC1 83348A34
-CBC2 83348A35
-CBC3 83348A36
-CBC4 83348A37
-CBC5 83348A38
-CBC6 83348A39
-CBC7 83348B30
-CBC8 83348B31
-CBC9 83348B32
-CBCA 83348B33
-CBCB 83348B34
-CBCC 83348B35
-CBCD 83348B36
-CBCE 83348B37
-CBCF 83348B38
-CBD0 83348B39
-CBD1 83348C30
-CBD2 83348C31
-CBD3 83348C32
-CBD4 83348C33
-CBD5 83348C34
-CBD6 83348C35
-CBD7 83348C36
-CBD8 83348C37
-CBD9 83348C38
-CBDA 83348C39
-CBDB 83348D30
-CBDC 83348D31
-CBDD 83348D32
-CBDE 83348D33
-CBDF 83348D34
-CBE0 83348D35
-CBE1 83348D36
-CBE2 83348D37
-CBE3 83348D38
-CBE4 83348D39
-CBE5 83348E30
-CBE6 83348E31
-CBE7 83348E32
-CBE8 83348E33
-CBE9 83348E34
-CBEA 83348E35
-CBEB 83348E36
-CBEC 83348E37
-CBED 83348E38
-CBEE 83348E39
-CBEF 83348F30
-CBF0 83348F31
-CBF1 83348F32
-CBF2 83348F33
-CBF3 83348F34
-CBF4 83348F35
-CBF5 83348F36
-CBF6 83348F37
-CBF7 83348F38
-CBF8 83348F39
-CBF9 83349030
-CBFA 83349031
-CBFB 83349032
-CBFC 83349033
-CBFD 83349034
-CBFE 83349035
-CBFF 83349036
-CC00 83349037
-CC01 83349038
-CC02 83349039
-CC03 83349130
-CC04 83349131
-CC05 83349132
-CC06 83349133
-CC07 83349134
-CC08 83349135
-CC09 83349136
-CC0A 83349137
-CC0B 83349138
-CC0C 83349139
-CC0D 83349230
-CC0E 83349231
-CC0F 83349232
-CC10 83349233
-CC11 83349234
-CC12 83349235
-CC13 83349236
-CC14 83349237
-CC15 83349238
-CC16 83349239
-CC17 83349330
-CC18 83349331
-CC19 83349332
-CC1A 83349333
-CC1B 83349334
-CC1C 83349335
-CC1D 83349336
-CC1E 83349337
-CC1F 83349338
-CC20 83349339
-CC21 83349430
-CC22 83349431
-CC23 83349432
-CC24 83349433
-CC25 83349434
-CC26 83349435
-CC27 83349436
-CC28 83349437
-CC29 83349438
-CC2A 83349439
-CC2B 83349530
-CC2C 83349531
-CC2D 83349532
-CC2E 83349533
-CC2F 83349534
-CC30 83349535
-CC31 83349536
-CC32 83349537
-CC33 83349538
-CC34 83349539
-CC35 83349630
-CC36 83349631
-CC37 83349632
-CC38 83349633
-CC39 83349634
-CC3A 83349635
-CC3B 83349636
-CC3C 83349637
-CC3D 83349638
-CC3E 83349639
-CC3F 83349730
-CC40 83349731
-CC41 83349732
-CC42 83349733
-CC43 83349734
-CC44 83349735
-CC45 83349736
-CC46 83349737
-CC47 83349738
-CC48 83349739
-CC49 83349830
-CC4A 83349831
-CC4B 83349832
-CC4C 83349833
-CC4D 83349834
-CC4E 83349835
-CC4F 83349836
-CC50 83349837
-CC51 83349838
-CC52 83349839
-CC53 83349930
-CC54 83349931
-CC55 83349932
-CC56 83349933
-CC57 83349934
-CC58 83349935
-CC59 83349936
-CC5A 83349937
-CC5B 83349938
-CC5C 83349939
-CC5D 83349A30
-CC5E 83349A31
-CC5F 83349A32
-CC60 83349A33
-CC61 83349A34
-CC62 83349A35
-CC63 83349A36
-CC64 83349A37
-CC65 83349A38
-CC66 83349A39
-CC67 83349B30
-CC68 83349B31
-CC69 83349B32
-CC6A 83349B33
-CC6B 83349B34
-CC6C 83349B35
-CC6D 83349B36
-CC6E 83349B37
-CC6F 83349B38
-CC70 83349B39
-CC71 83349C30
-CC72 83349C31
-CC73 83349C32
-CC74 83349C33
-CC75 83349C34
-CC76 83349C35
-CC77 83349C36
-CC78 83349C37
-CC79 83349C38
-CC7A 83349C39
-CC7B 83349D30
-CC7C 83349D31
-CC7D 83349D32
-CC7E 83349D33
-CC7F 83349D34
-CC80 83349D35
-CC81 83349D36
-CC82 83349D37
-CC83 83349D38
-CC84 83349D39
-CC85 83349E30
-CC86 83349E31
-CC87 83349E32
-CC88 83349E33
-CC89 83349E34
-CC8A 83349E35
-CC8B 83349E36
-CC8C 83349E37
-CC8D 83349E38
-CC8E 83349E39
-CC8F 83349F30
-CC90 83349F31
-CC91 83349F32
-CC92 83349F33
-CC93 83349F34
-CC94 83349F35
-CC95 83349F36
-CC96 83349F37
-CC97 83349F38
-CC98 83349F39
-CC99 8334A030
-CC9A 8334A031
-CC9B 8334A032
-CC9C 8334A033
-CC9D 8334A034
-CC9E 8334A035
-CC9F 8334A036
-CCA0 8334A037
-CCA1 8334A038
-CCA2 8334A039
-CCA3 8334A130
-CCA4 8334A131
-CCA5 8334A132
-CCA6 8334A133
-CCA7 8334A134
-CCA8 8334A135
-CCA9 8334A136
-CCAA 8334A137
-CCAB 8334A138
-CCAC 8334A139
-CCAD 8334A230
-CCAE 8334A231
-CCAF 8334A232
-CCB0 8334A233
-CCB1 8334A234
-CCB2 8334A235
-CCB3 8334A236
-CCB4 8334A237
-CCB5 8334A238
-CCB6 8334A239
-CCB7 8334A330
-CCB8 8334A331
-CCB9 8334A332
-CCBA 8334A333
-CCBB 8334A334
-CCBC 8334A335
-CCBD 8334A336
-CCBE 8334A337
-CCBF 8334A338
-CCC0 8334A339
-CCC1 8334A430
-CCC2 8334A431
-CCC3 8334A432
-CCC4 8334A433
-CCC5 8334A434
-CCC6 8334A435
-CCC7 8334A436
-CCC8 8334A437
-CCC9 8334A438
-CCCA 8334A439
-CCCB 8334A530
-CCCC 8334A531
-CCCD 8334A532
-CCCE 8334A533
-CCCF 8334A534
-CCD0 8334A535
-CCD1 8334A536
-CCD2 8334A537
-CCD3 8334A538
-CCD4 8334A539
-CCD5 8334A630
-CCD6 8334A631
-CCD7 8334A632
-CCD8 8334A633
-CCD9 8334A634
-CCDA 8334A635
-CCDB 8334A636
-CCDC 8334A637
-CCDD 8334A638
-CCDE 8334A639
-CCDF 8334A730
-CCE0 8334A731
-CCE1 8334A732
-CCE2 8334A733
-CCE3 8334A734
-CCE4 8334A735
-CCE5 8334A736
-CCE6 8334A737
-CCE7 8334A738
-CCE8 8334A739
-CCE9 8334A830
-CCEA 8334A831
-CCEB 8334A832
-CCEC 8334A833
-CCED 8334A834
-CCEE 8334A835
-CCEF 8334A836
-CCF0 8334A837
-CCF1 8334A838
-CCF2 8334A839
-CCF3 8334A930
-CCF4 8334A931
-CCF5 8334A932
-CCF6 8334A933
-CCF7 8334A934
-CCF8 8334A935
-CCF9 8334A936
-CCFA 8334A937
-CCFB 8334A938
-CCFC 8334A939
-CCFD 8334AA30
-CCFE 8334AA31
-CCFF 8334AA32
-CD00 8334AA33
-CD01 8334AA34
-CD02 8334AA35
-CD03 8334AA36
-CD04 8334AA37
-CD05 8334AA38
-CD06 8334AA39
-CD07 8334AB30
-CD08 8334AB31
-CD09 8334AB32
-CD0A 8334AB33
-CD0B 8334AB34
-CD0C 8334AB35
-CD0D 8334AB36
-CD0E 8334AB37
-CD0F 8334AB38
-CD10 8334AB39
-CD11 8334AC30
-CD12 8334AC31
-CD13 8334AC32
-CD14 8334AC33
-CD15 8334AC34
-CD16 8334AC35
-CD17 8334AC36
-CD18 8334AC37
-CD19 8334AC38
-CD1A 8334AC39
-CD1B 8334AD30
-CD1C 8334AD31
-CD1D 8334AD32
-CD1E 8334AD33
-CD1F 8334AD34
-CD20 8334AD35
-CD21 8334AD36
-CD22 8334AD37
-CD23 8334AD38
-CD24 8334AD39
-CD25 8334AE30
-CD26 8334AE31
-CD27 8334AE32
-CD28 8334AE33
-CD29 8334AE34
-CD2A 8334AE35
-CD2B 8334AE36
-CD2C 8334AE37
-CD2D 8334AE38
-CD2E 8334AE39
-CD2F 8334AF30
-CD30 8334AF31
-CD31 8334AF32
-CD32 8334AF33
-CD33 8334AF34
-CD34 8334AF35
-CD35 8334AF36
-CD36 8334AF37
-CD37 8334AF38
-CD38 8334AF39
-CD39 8334B030
-CD3A 8334B031
-CD3B 8334B032
-CD3C 8334B033
-CD3D 8334B034
-CD3E 8334B035
-CD3F 8334B036
-CD40 8334B037
-CD41 8334B038
-CD42 8334B039
-CD43 8334B130
-CD44 8334B131
-CD45 8334B132
-CD46 8334B133
-CD47 8334B134
-CD48 8334B135
-CD49 8334B136
-CD4A 8334B137
-CD4B 8334B138
-CD4C 8334B139
-CD4D 8334B230
-CD4E 8334B231
-CD4F 8334B232
-CD50 8334B233
-CD51 8334B234
-CD52 8334B235
-CD53 8334B236
-CD54 8334B237
-CD55 8334B238
-CD56 8334B239
-CD57 8334B330
-CD58 8334B331
-CD59 8334B332
-CD5A 8334B333
-CD5B 8334B334
-CD5C 8334B335
-CD5D 8334B336
-CD5E 8334B337
-CD5F 8334B338
-CD60 8334B339
-CD61 8334B430
-CD62 8334B431
-CD63 8334B432
-CD64 8334B433
-CD65 8334B434
-CD66 8334B435
-CD67 8334B436
-CD68 8334B437
-CD69 8334B438
-CD6A 8334B439
-CD6B 8334B530
-CD6C 8334B531
-CD6D 8334B532
-CD6E 8334B533
-CD6F 8334B534
-CD70 8334B535
-CD71 8334B536
-CD72 8334B537
-CD73 8334B538
-CD74 8334B539
-CD75 8334B630
-CD76 8334B631
-CD77 8334B632
-CD78 8334B633
-CD79 8334B634
-CD7A 8334B635
-CD7B 8334B636
-CD7C 8334B637
-CD7D 8334B638
-CD7E 8334B639
-CD7F 8334B730
-CD80 8334B731
-CD81 8334B732
-CD82 8334B733
-CD83 8334B734
-CD84 8334B735
-CD85 8334B736
-CD86 8334B737
-CD87 8334B738
-CD88 8334B739
-CD89 8334B830
-CD8A 8334B831
-CD8B 8334B832
-CD8C 8334B833
-CD8D 8334B834
-CD8E 8334B835
-CD8F 8334B836
-CD90 8334B837
-CD91 8334B838
-CD92 8334B839
-CD93 8334B930
-CD94 8334B931
-CD95 8334B932
-CD96 8334B933
-CD97 8334B934
-CD98 8334B935
-CD99 8334B936
-CD9A 8334B937
-CD9B 8334B938
-CD9C 8334B939
-CD9D 8334BA30
-CD9E 8334BA31
-CD9F 8334BA32
-CDA0 8334BA33
-CDA1 8334BA34
-CDA2 8334BA35
-CDA3 8334BA36
-CDA4 8334BA37
-CDA5 8334BA38
-CDA6 8334BA39
-CDA7 8334BB30
-CDA8 8334BB31
-CDA9 8334BB32
-CDAA 8334BB33
-CDAB 8334BB34
-CDAC 8334BB35
-CDAD 8334BB36
-CDAE 8334BB37
-CDAF 8334BB38
-CDB0 8334BB39
-CDB1 8334BC30
-CDB2 8334BC31
-CDB3 8334BC32
-CDB4 8334BC33
-CDB5 8334BC34
-CDB6 8334BC35
-CDB7 8334BC36
-CDB8 8334BC37
-CDB9 8334BC38
-CDBA 8334BC39
-CDBB 8334BD30
-CDBC 8334BD31
-CDBD 8334BD32
-CDBE 8334BD33
-CDBF 8334BD34
-CDC0 8334BD35
-CDC1 8334BD36
-CDC2 8334BD37
-CDC3 8334BD38
-CDC4 8334BD39
-CDC5 8334BE30
-CDC6 8334BE31
-CDC7 8334BE32
-CDC8 8334BE33
-CDC9 8334BE34
-CDCA 8334BE35
-CDCB 8334BE36
-CDCC 8334BE37
-CDCD 8334BE38
-CDCE 8334BE39
-CDCF 8334BF30
-CDD0 8334BF31
-CDD1 8334BF32
-CDD2 8334BF33
-CDD3 8334BF34
-CDD4 8334BF35
-CDD5 8334BF36
-CDD6 8334BF37
-CDD7 8334BF38
-CDD8 8334BF39
-CDD9 8334C030
-CDDA 8334C031
-CDDB 8334C032
-CDDC 8334C033
-CDDD 8334C034
-CDDE 8334C035
-CDDF 8334C036
-CDE0 8334C037
-CDE1 8334C038
-CDE2 8334C039
-CDE3 8334C130
-CDE4 8334C131
-CDE5 8334C132
-CDE6 8334C133
-CDE7 8334C134
-CDE8 8334C135
-CDE9 8334C136
-CDEA 8334C137
-CDEB 8334C138
-CDEC 8334C139
-CDED 8334C230
-CDEE 8334C231
-CDEF 8334C232
-CDF0 8334C233
-CDF1 8334C234
-CDF2 8334C235
-CDF3 8334C236
-CDF4 8334C237
-CDF5 8334C238
-CDF6 8334C239
-CDF7 8334C330
-CDF8 8334C331
-CDF9 8334C332
-CDFA 8334C333
-CDFB 8334C334
-CDFC 8334C335
-CDFD 8334C336
-CDFE 8334C337
-CDFF 8334C338
-CE00 8334C339
-CE01 8334C430
-CE02 8334C431
-CE03 8334C432
-CE04 8334C433
-CE05 8334C434
-CE06 8334C435
-CE07 8334C436
-CE08 8334C437
-CE09 8334C438
-CE0A 8334C439
-CE0B 8334C530
-CE0C 8334C531
-CE0D 8334C532
-CE0E 8334C533
-CE0F 8334C534
-CE10 8334C535
-CE11 8334C536
-CE12 8334C537
-CE13 8334C538
-CE14 8334C539
-CE15 8334C630
-CE16 8334C631
-CE17 8334C632
-CE18 8334C633
-CE19 8334C634
-CE1A 8334C635
-CE1B 8334C636
-CE1C 8334C637
-CE1D 8334C638
-CE1E 8334C639
-CE1F 8334C730
-CE20 8334C731
-CE21 8334C732
-CE22 8334C733
-CE23 8334C734
-CE24 8334C735
-CE25 8334C736
-CE26 8334C737
-CE27 8334C738
-CE28 8334C739
-CE29 8334C830
-CE2A 8334C831
-CE2B 8334C832
-CE2C 8334C833
-CE2D 8334C834
-CE2E 8334C835
-CE2F 8334C836
-CE30 8334C837
-CE31 8334C838
-CE32 8334C839
-CE33 8334C930
-CE34 8334C931
-CE35 8334C932
-CE36 8334C933
-CE37 8334C934
-CE38 8334C935
-CE39 8334C936
-CE3A 8334C937
-CE3B 8334C938
-CE3C 8334C939
-CE3D 8334CA30
-CE3E 8334CA31
-CE3F 8334CA32
-CE40 8334CA33
-CE41 8334CA34
-CE42 8334CA35
-CE43 8334CA36
-CE44 8334CA37
-CE45 8334CA38
-CE46 8334CA39
-CE47 8334CB30
-CE48 8334CB31
-CE49 8334CB32
-CE4A 8334CB33
-CE4B 8334CB34
-CE4C 8334CB35
-CE4D 8334CB36
-CE4E 8334CB37
-CE4F 8334CB38
-CE50 8334CB39
-CE51 8334CC30
-CE52 8334CC31
-CE53 8334CC32
-CE54 8334CC33
-CE55 8334CC34
-CE56 8334CC35
-CE57 8334CC36
-CE58 8334CC37
-CE59 8334CC38
-CE5A 8334CC39
-CE5B 8334CD30
-CE5C 8334CD31
-CE5D 8334CD32
-CE5E 8334CD33
-CE5F 8334CD34
-CE60 8334CD35
-CE61 8334CD36
-CE62 8334CD37
-CE63 8334CD38
-CE64 8334CD39
-CE65 8334CE30
-CE66 8334CE31
-CE67 8334CE32
-CE68 8334CE33
-CE69 8334CE34
-CE6A 8334CE35
-CE6B 8334CE36
-CE6C 8334CE37
-CE6D 8334CE38
-CE6E 8334CE39
-CE6F 8334CF30
-CE70 8334CF31
-CE71 8334CF32
-CE72 8334CF33
-CE73 8334CF34
-CE74 8334CF35
-CE75 8334CF36
-CE76 8334CF37
-CE77 8334CF38
-CE78 8334CF39
-CE79 8334D030
-CE7A 8334D031
-CE7B 8334D032
-CE7C 8334D033
-CE7D 8334D034
-CE7E 8334D035
-CE7F 8334D036
-CE80 8334D037
-CE81 8334D038
-CE82 8334D039
-CE83 8334D130
-CE84 8334D131
-CE85 8334D132
-CE86 8334D133
-CE87 8334D134
-CE88 8334D135
-CE89 8334D136
-CE8A 8334D137
-CE8B 8334D138
-CE8C 8334D139
-CE8D 8334D230
-CE8E 8334D231
-CE8F 8334D232
-CE90 8334D233
-CE91 8334D234
-CE92 8334D235
-CE93 8334D236
-CE94 8334D237
-CE95 8334D238
-CE96 8334D239
-CE97 8334D330
-CE98 8334D331
-CE99 8334D332
-CE9A 8334D333
-CE9B 8334D334
-CE9C 8334D335
-CE9D 8334D336
-CE9E 8334D337
-CE9F 8334D338
-CEA0 8334D339
-CEA1 8334D430
-CEA2 8334D431
-CEA3 8334D432
-CEA4 8334D433
-CEA5 8334D434
-CEA6 8334D435
-CEA7 8334D436
-CEA8 8334D437
-CEA9 8334D438
-CEAA 8334D439
-CEAB 8334D530
-CEAC 8334D531
-CEAD 8334D532
-CEAE 8334D533
-CEAF 8334D534
-CEB0 8334D535
-CEB1 8334D536
-CEB2 8334D537
-CEB3 8334D538
-CEB4 8334D539
-CEB5 8334D630
-CEB6 8334D631
-CEB7 8334D632
-CEB8 8334D633
-CEB9 8334D634
-CEBA 8334D635
-CEBB 8334D636
-CEBC 8334D637
-CEBD 8334D638
-CEBE 8334D639
-CEBF 8334D730
-CEC0 8334D731
-CEC1 8334D732
-CEC2 8334D733
-CEC3 8334D734
-CEC4 8334D735
-CEC5 8334D736
-CEC6 8334D737
-CEC7 8334D738
-CEC8 8334D739
-CEC9 8334D830
-CECA 8334D831
-CECB 8334D832
-CECC 8334D833
-CECD 8334D834
-CECE 8334D835
-CECF 8334D836
-CED0 8334D837
-CED1 8334D838
-CED2 8334D839
-CED3 8334D930
-CED4 8334D931
-CED5 8334D932
-CED6 8334D933
-CED7 8334D934
-CED8 8334D935
-CED9 8334D936
-CEDA 8334D937
-CEDB 8334D938
-CEDC 8334D939
-CEDD 8334DA30
-CEDE 8334DA31
-CEDF 8334DA32
-CEE0 8334DA33
-CEE1 8334DA34
-CEE2 8334DA35
-CEE3 8334DA36
-CEE4 8334DA37
-CEE5 8334DA38
-CEE6 8334DA39
-CEE7 8334DB30
-CEE8 8334DB31
-CEE9 8334DB32
-CEEA 8334DB33
-CEEB 8334DB34
-CEEC 8334DB35
-CEED 8334DB36
-CEEE 8334DB37
-CEEF 8334DB38
-CEF0 8334DB39
-CEF1 8334DC30
-CEF2 8334DC31
-CEF3 8334DC32
-CEF4 8334DC33
-CEF5 8334DC34
-CEF6 8334DC35
-CEF7 8334DC36
-CEF8 8334DC37
-CEF9 8334DC38
-CEFA 8334DC39
-CEFB 8334DD30
-CEFC 8334DD31
-CEFD 8334DD32
-CEFE 8334DD33
-CEFF 8334DD34
-CF00 8334DD35
-CF01 8334DD36
-CF02 8334DD37
-CF03 8334DD38
-CF04 8334DD39
-CF05 8334DE30
-CF06 8334DE31
-CF07 8334DE32
-CF08 8334DE33
-CF09 8334DE34
-CF0A 8334DE35
-CF0B 8334DE36
-CF0C 8334DE37
-CF0D 8334DE38
-CF0E 8334DE39
-CF0F 8334DF30
-CF10 8334DF31
-CF11 8334DF32
-CF12 8334DF33
-CF13 8334DF34
-CF14 8334DF35
-CF15 8334DF36
-CF16 8334DF37
-CF17 8334DF38
-CF18 8334DF39
-CF19 8334E030
-CF1A 8334E031
-CF1B 8334E032
-CF1C 8334E033
-CF1D 8334E034
-CF1E 8334E035
-CF1F 8334E036
-CF20 8334E037
-CF21 8334E038
-CF22 8334E039
-CF23 8334E130
-CF24 8334E131
-CF25 8334E132
-CF26 8334E133
-CF27 8334E134
-CF28 8334E135
-CF29 8334E136
-CF2A 8334E137
-CF2B 8334E138
-CF2C 8334E139
-CF2D 8334E230
-CF2E 8334E231
-CF2F 8334E232
-CF30 8334E233
-CF31 8334E234
-CF32 8334E235
-CF33 8334E236
-CF34 8334E237
-CF35 8334E238
-CF36 8334E239
-CF37 8334E330
-CF38 8334E331
-CF39 8334E332
-CF3A 8334E333
-CF3B 8334E334
-CF3C 8334E335
-CF3D 8334E336
-CF3E 8334E337
-CF3F 8334E338
-CF40 8334E339
-CF41 8334E430
-CF42 8334E431
-CF43 8334E432
-CF44 8334E433
-CF45 8334E434
-CF46 8334E435
-CF47 8334E436
-CF48 8334E437
-CF49 8334E438
-CF4A 8334E439
-CF4B 8334E530
-CF4C 8334E531
-CF4D 8334E532
-CF4E 8334E533
-CF4F 8334E534
-CF50 8334E535
-CF51 8334E536
-CF52 8334E537
-CF53 8334E538
-CF54 8334E539
-CF55 8334E630
-CF56 8334E631
-CF57 8334E632
-CF58 8334E633
-CF59 8334E634
-CF5A 8334E635
-CF5B 8334E636
-CF5C 8334E637
-CF5D 8334E638
-CF5E 8334E639
-CF5F 8334E730
-CF60 8334E731
-CF61 8334E732
-CF62 8334E733
-CF63 8334E734
-CF64 8334E735
-CF65 8334E736
-CF66 8334E737
-CF67 8334E738
-CF68 8334E739
-CF69 8334E830
-CF6A 8334E831
-CF6B 8334E832
-CF6C 8334E833
-CF6D 8334E834
-CF6E 8334E835
-CF6F 8334E836
-CF70 8334E837
-CF71 8334E838
-CF72 8334E839
-CF73 8334E930
-CF74 8334E931
-CF75 8334E932
-CF76 8334E933
-CF77 8334E934
-CF78 8334E935
-CF79 8334E936
-CF7A 8334E937
-CF7B 8334E938
-CF7C 8334E939
-CF7D 8334EA30
-CF7E 8334EA31
-CF7F 8334EA32
-CF80 8334EA33
-CF81 8334EA34
-CF82 8334EA35
-CF83 8334EA36
-CF84 8334EA37
-CF85 8334EA38
-CF86 8334EA39
-CF87 8334EB30
-CF88 8334EB31
-CF89 8334EB32
-CF8A 8334EB33
-CF8B 8334EB34
-CF8C 8334EB35
-CF8D 8334EB36
-CF8E 8334EB37
-CF8F 8334EB38
-CF90 8334EB39
-CF91 8334EC30
-CF92 8334EC31
-CF93 8334EC32
-CF94 8334EC33
-CF95 8334EC34
-CF96 8334EC35
-CF97 8334EC36
-CF98 8334EC37
-CF99 8334EC38
-CF9A 8334EC39
-CF9B 8334ED30
-CF9C 8334ED31
-CF9D 8334ED32
-CF9E 8334ED33
-CF9F 8334ED34
-CFA0 8334ED35
-CFA1 8334ED36
-CFA2 8334ED37
-CFA3 8334ED38
-CFA4 8334ED39
-CFA5 8334EE30
-CFA6 8334EE31
-CFA7 8334EE32
-CFA8 8334EE33
-CFA9 8334EE34
-CFAA 8334EE35
-CFAB 8334EE36
-CFAC 8334EE37
-CFAD 8334EE38
-CFAE 8334EE39
-CFAF 8334EF30
-CFB0 8334EF31
-CFB1 8334EF32
-CFB2 8334EF33
-CFB3 8334EF34
-CFB4 8334EF35
-CFB5 8334EF36
-CFB6 8334EF37
-CFB7 8334EF38
-CFB8 8334EF39
-CFB9 8334F030
-CFBA 8334F031
-CFBB 8334F032
-CFBC 8334F033
-CFBD 8334F034
-CFBE 8334F035
-CFBF 8334F036
-CFC0 8334F037
-CFC1 8334F038
-CFC2 8334F039
-CFC3 8334F130
-CFC4 8334F131
-CFC5 8334F132
-CFC6 8334F133
-CFC7 8334F134
-CFC8 8334F135
-CFC9 8334F136
-CFCA 8334F137
-CFCB 8334F138
-CFCC 8334F139
-CFCD 8334F230
-CFCE 8334F231
-CFCF 8334F232
-CFD0 8334F233
-CFD1 8334F234
-CFD2 8334F235
-CFD3 8334F236
-CFD4 8334F237
-CFD5 8334F238
-CFD6 8334F239
-CFD7 8334F330
-CFD8 8334F331
-CFD9 8334F332
-CFDA 8334F333
-CFDB 8334F334
-CFDC 8334F335
-CFDD 8334F336
-CFDE 8334F337
-CFDF 8334F338
-CFE0 8334F339
-CFE1 8334F430
-CFE2 8334F431
-CFE3 8334F432
-CFE4 8334F433
-CFE5 8334F434
-CFE6 8334F435
-CFE7 8334F436
-CFE8 8334F437
-CFE9 8334F438
-CFEA 8334F439
-CFEB 8334F530
-CFEC 8334F531
-CFED 8334F532
-CFEE 8334F533
-CFEF 8334F534
-CFF0 8334F535
-CFF1 8334F536
-CFF2 8334F537
-CFF3 8334F538
-CFF4 8334F539
-CFF5 8334F630
-CFF6 8334F631
-CFF7 8334F632
-CFF8 8334F633
-CFF9 8334F634
-CFFA 8334F635
-CFFB 8334F636
-CFFC 8334F637
-CFFD 8334F638
-CFFE 8334F639
-CFFF 8334F730
-D000 8334F731
-D001 8334F732
-D002 8334F733
-D003 8334F734
-D004 8334F735
-D005 8334F736
-D006 8334F737
-D007 8334F738
-D008 8334F739
-D009 8334F830
-D00A 8334F831
-D00B 8334F832
-D00C 8334F833
-D00D 8334F834
-D00E 8334F835
-D00F 8334F836
-D010 8334F837
-D011 8334F838
-D012 8334F839
-D013 8334F930
-D014 8334F931
-D015 8334F932
-D016 8334F933
-D017 8334F934
-D018 8334F935
-D019 8334F936
-D01A 8334F937
-D01B 8334F938
-D01C 8334F939
-D01D 8334FA30
-D01E 8334FA31
-D01F 8334FA32
-D020 8334FA33
-D021 8334FA34
-D022 8334FA35
-D023 8334FA36
-D024 8334FA37
-D025 8334FA38
-D026 8334FA39
-D027 8334FB30
-D028 8334FB31
-D029 8334FB32
-D02A 8334FB33
-D02B 8334FB34
-D02C 8334FB35
-D02D 8334FB36
-D02E 8334FB37
-D02F 8334FB38
-D030 8334FB39
-D031 8334FC30
-D032 8334FC31
-D033 8334FC32
-D034 8334FC33
-D035 8334FC34
-D036 8334FC35
-D037 8334FC36
-D038 8334FC37
-D039 8334FC38
-D03A 8334FC39
-D03B 8334FD30
-D03C 8334FD31
-D03D 8334FD32
-D03E 8334FD33
-D03F 8334FD34
-D040 8334FD35
-D041 8334FD36
-D042 8334FD37
-D043 8334FD38
-D044 8334FD39
-D045 8334FE30
-D046 8334FE31
-D047 8334FE32
-D048 8334FE33
-D049 8334FE34
-D04A 8334FE35
-D04B 8334FE36
-D04C 8334FE37
-D04D 8334FE38
-D04E 8334FE39
-D04F 83358130
-D050 83358131
-D051 83358132
-D052 83358133
-D053 83358134
-D054 83358135
-D055 83358136
-D056 83358137
-D057 83358138
-D058 83358139
-D059 83358230
-D05A 83358231
-D05B 83358232
-D05C 83358233
-D05D 83358234
-D05E 83358235
-D05F 83358236
-D060 83358237
-D061 83358238
-D062 83358239
-D063 83358330
-D064 83358331
-D065 83358332
-D066 83358333
-D067 83358334
-D068 83358335
-D069 83358336
-D06A 83358337
-D06B 83358338
-D06C 83358339
-D06D 83358430
-D06E 83358431
-D06F 83358432
-D070 83358433
-D071 83358434
-D072 83358435
-D073 83358436
-D074 83358437
-D075 83358438
-D076 83358439
-D077 83358530
-D078 83358531
-D079 83358532
-D07A 83358533
-D07B 83358534
-D07C 83358535
-D07D 83358536
-D07E 83358537
-D07F 83358538
-D080 83358539
-D081 83358630
-D082 83358631
-D083 83358632
-D084 83358633
-D085 83358634
-D086 83358635
-D087 83358636
-D088 83358637
-D089 83358638
-D08A 83358639
-D08B 83358730
-D08C 83358731
-D08D 83358732
-D08E 83358733
-D08F 83358734
-D090 83358735
-D091 83358736
-D092 83358737
-D093 83358738
-D094 83358739
-D095 83358830
-D096 83358831
-D097 83358832
-D098 83358833
-D099 83358834
-D09A 83358835
-D09B 83358836
-D09C 83358837
-D09D 83358838
-D09E 83358839
-D09F 83358930
-D0A0 83358931
-D0A1 83358932
-D0A2 83358933
-D0A3 83358934
-D0A4 83358935
-D0A5 83358936
-D0A6 83358937
-D0A7 83358938
-D0A8 83358939
-D0A9 83358A30
-D0AA 83358A31
-D0AB 83358A32
-D0AC 83358A33
-D0AD 83358A34
-D0AE 83358A35
-D0AF 83358A36
-D0B0 83358A37
-D0B1 83358A38
-D0B2 83358A39
-D0B3 83358B30
-D0B4 83358B31
-D0B5 83358B32
-D0B6 83358B33
-D0B7 83358B34
-D0B8 83358B35
-D0B9 83358B36
-D0BA 83358B37
-D0BB 83358B38
-D0BC 83358B39
-D0BD 83358C30
-D0BE 83358C31
-D0BF 83358C32
-D0C0 83358C33
-D0C1 83358C34
-D0C2 83358C35
-D0C3 83358C36
-D0C4 83358C37
-D0C5 83358C38
-D0C6 83358C39
-D0C7 83358D30
-D0C8 83358D31
-D0C9 83358D32
-D0CA 83358D33
-D0CB 83358D34
-D0CC 83358D35
-D0CD 83358D36
-D0CE 83358D37
-D0CF 83358D38
-D0D0 83358D39
-D0D1 83358E30
-D0D2 83358E31
-D0D3 83358E32
-D0D4 83358E33
-D0D5 83358E34
-D0D6 83358E35
-D0D7 83358E36
-D0D8 83358E37
-D0D9 83358E38
-D0DA 83358E39
-D0DB 83358F30
-D0DC 83358F31
-D0DD 83358F32
-D0DE 83358F33
-D0DF 83358F34
-D0E0 83358F35
-D0E1 83358F36
-D0E2 83358F37
-D0E3 83358F38
-D0E4 83358F39
-D0E5 83359030
-D0E6 83359031
-D0E7 83359032
-D0E8 83359033
-D0E9 83359034
-D0EA 83359035
-D0EB 83359036
-D0EC 83359037
-D0ED 83359038
-D0EE 83359039
-D0EF 83359130
-D0F0 83359131
-D0F1 83359132
-D0F2 83359133
-D0F3 83359134
-D0F4 83359135
-D0F5 83359136
-D0F6 83359137
-D0F7 83359138
-D0F8 83359139
-D0F9 83359230
-D0FA 83359231
-D0FB 83359232
-D0FC 83359233
-D0FD 83359234
-D0FE 83359235
-D0FF 83359236
-D100 83359237
-D101 83359238
-D102 83359239
-D103 83359330
-D104 83359331
-D105 83359332
-D106 83359333
-D107 83359334
-D108 83359335
-D109 83359336
-D10A 83359337
-D10B 83359338
-D10C 83359339
-D10D 83359430
-D10E 83359431
-D10F 83359432
-D110 83359433
-D111 83359434
-D112 83359435
-D113 83359436
-D114 83359437
-D115 83359438
-D116 83359439
-D117 83359530
-D118 83359531
-D119 83359532
-D11A 83359533
-D11B 83359534
-D11C 83359535
-D11D 83359536
-D11E 83359537
-D11F 83359538
-D120 83359539
-D121 83359630
-D122 83359631
-D123 83359632
-D124 83359633
-D125 83359634
-D126 83359635
-D127 83359636
-D128 83359637
-D129 83359638
-D12A 83359639
-D12B 83359730
-D12C 83359731
-D12D 83359732
-D12E 83359733
-D12F 83359734
-D130 83359735
-D131 83359736
-D132 83359737
-D133 83359738
-D134 83359739
-D135 83359830
-D136 83359831
-D137 83359832
-D138 83359833
-D139 83359834
-D13A 83359835
-D13B 83359836
-D13C 83359837
-D13D 83359838
-D13E 83359839
-D13F 83359930
-D140 83359931
-D141 83359932
-D142 83359933
-D143 83359934
-D144 83359935
-D145 83359936
-D146 83359937
-D147 83359938
-D148 83359939
-D149 83359A30
-D14A 83359A31
-D14B 83359A32
-D14C 83359A33
-D14D 83359A34
-D14E 83359A35
-D14F 83359A36
-D150 83359A37
-D151 83359A38
-D152 83359A39
-D153 83359B30
-D154 83359B31
-D155 83359B32
-D156 83359B33
-D157 83359B34
-D158 83359B35
-D159 83359B36
-D15A 83359B37
-D15B 83359B38
-D15C 83359B39
-D15D 83359C30
-D15E 83359C31
-D15F 83359C32
-D160 83359C33
-D161 83359C34
-D162 83359C35
-D163 83359C36
-D164 83359C37
-D165 83359C38
-D166 83359C39
-D167 83359D30
-D168 83359D31
-D169 83359D32
-D16A 83359D33
-D16B 83359D34
-D16C 83359D35
-D16D 83359D36
-D16E 83359D37
-D16F 83359D38
-D170 83359D39
-D171 83359E30
-D172 83359E31
-D173 83359E32
-D174 83359E33
-D175 83359E34
-D176 83359E35
-D177 83359E36
-D178 83359E37
-D179 83359E38
-D17A 83359E39
-D17B 83359F30
-D17C 83359F31
-D17D 83359F32
-D17E 83359F33
-D17F 83359F34
-D180 83359F35
-D181 83359F36
-D182 83359F37
-D183 83359F38
-D184 83359F39
-D185 8335A030
-D186 8335A031
-D187 8335A032
-D188 8335A033
-D189 8335A034
-D18A 8335A035
-D18B 8335A036
-D18C 8335A037
-D18D 8335A038
-D18E 8335A039
-D18F 8335A130
-D190 8335A131
-D191 8335A132
-D192 8335A133
-D193 8335A134
-D194 8335A135
-D195 8335A136
-D196 8335A137
-D197 8335A138
-D198 8335A139
-D199 8335A230
-D19A 8335A231
-D19B 8335A232
-D19C 8335A233
-D19D 8335A234
-D19E 8335A235
-D19F 8335A236
-D1A0 8335A237
-D1A1 8335A238
-D1A2 8335A239
-D1A3 8335A330
-D1A4 8335A331
-D1A5 8335A332
-D1A6 8335A333
-D1A7 8335A334
-D1A8 8335A335
-D1A9 8335A336
-D1AA 8335A337
-D1AB 8335A338
-D1AC 8335A339
-D1AD 8335A430
-D1AE 8335A431
-D1AF 8335A432
-D1B0 8335A433
-D1B1 8335A434
-D1B2 8335A435
-D1B3 8335A436
-D1B4 8335A437
-D1B5 8335A438
-D1B6 8335A439
-D1B7 8335A530
-D1B8 8335A531
-D1B9 8335A532
-D1BA 8335A533
-D1BB 8335A534
-D1BC 8335A535
-D1BD 8335A536
-D1BE 8335A537
-D1BF 8335A538
-D1C0 8335A539
-D1C1 8335A630
-D1C2 8335A631
-D1C3 8335A632
-D1C4 8335A633
-D1C5 8335A634
-D1C6 8335A635
-D1C7 8335A636
-D1C8 8335A637
-D1C9 8335A638
-D1CA 8335A639
-D1CB 8335A730
-D1CC 8335A731
-D1CD 8335A732
-D1CE 8335A733
-D1CF 8335A734
-D1D0 8335A735
-D1D1 8335A736
-D1D2 8335A737
-D1D3 8335A738
-D1D4 8335A739
-D1D5 8335A830
-D1D6 8335A831
-D1D7 8335A832
-D1D8 8335A833
-D1D9 8335A834
-D1DA 8335A835
-D1DB 8335A836
-D1DC 8335A837
-D1DD 8335A838
-D1DE 8335A839
-D1DF 8335A930
-D1E0 8335A931
-D1E1 8335A932
-D1E2 8335A933
-D1E3 8335A934
-D1E4 8335A935
-D1E5 8335A936
-D1E6 8335A937
-D1E7 8335A938
-D1E8 8335A939
-D1E9 8335AA30
-D1EA 8335AA31
-D1EB 8335AA32
-D1EC 8335AA33
-D1ED 8335AA34
-D1EE 8335AA35
-D1EF 8335AA36
-D1F0 8335AA37
-D1F1 8335AA38
-D1F2 8335AA39
-D1F3 8335AB30
-D1F4 8335AB31
-D1F5 8335AB32
-D1F6 8335AB33
-D1F7 8335AB34
-D1F8 8335AB35
-D1F9 8335AB36
-D1FA 8335AB37
-D1FB 8335AB38
-D1FC 8335AB39
-D1FD 8335AC30
-D1FE 8335AC31
-D1FF 8335AC32
-D200 8335AC33
-D201 8335AC34
-D202 8335AC35
-D203 8335AC36
-D204 8335AC37
-D205 8335AC38
-D206 8335AC39
-D207 8335AD30
-D208 8335AD31
-D209 8335AD32
-D20A 8335AD33
-D20B 8335AD34
-D20C 8335AD35
-D20D 8335AD36
-D20E 8335AD37
-D20F 8335AD38
-D210 8335AD39
-D211 8335AE30
-D212 8335AE31
-D213 8335AE32
-D214 8335AE33
-D215 8335AE34
-D216 8335AE35
-D217 8335AE36
-D218 8335AE37
-D219 8335AE38
-D21A 8335AE39
-D21B 8335AF30
-D21C 8335AF31
-D21D 8335AF32
-D21E 8335AF33
-D21F 8335AF34
-D220 8335AF35
-D221 8335AF36
-D222 8335AF37
-D223 8335AF38
-D224 8335AF39
-D225 8335B030
-D226 8335B031
-D227 8335B032
-D228 8335B033
-D229 8335B034
-D22A 8335B035
-D22B 8335B036
-D22C 8335B037
-D22D 8335B038
-D22E 8335B039
-D22F 8335B130
-D230 8335B131
-D231 8335B132
-D232 8335B133
-D233 8335B134
-D234 8335B135
-D235 8335B136
-D236 8335B137
-D237 8335B138
-D238 8335B139
-D239 8335B230
-D23A 8335B231
-D23B 8335B232
-D23C 8335B233
-D23D 8335B234
-D23E 8335B235
-D23F 8335B236
-D240 8335B237
-D241 8335B238
-D242 8335B239
-D243 8335B330
-D244 8335B331
-D245 8335B332
-D246 8335B333
-D247 8335B334
-D248 8335B335
-D249 8335B336
-D24A 8335B337
-D24B 8335B338
-D24C 8335B339
-D24D 8335B430
-D24E 8335B431
-D24F 8335B432
-D250 8335B433
-D251 8335B434
-D252 8335B435
-D253 8335B436
-D254 8335B437
-D255 8335B438
-D256 8335B439
-D257 8335B530
-D258 8335B531
-D259 8335B532
-D25A 8335B533
-D25B 8335B534
-D25C 8335B535
-D25D 8335B536
-D25E 8335B537
-D25F 8335B538
-D260 8335B539
-D261 8335B630
-D262 8335B631
-D263 8335B632
-D264 8335B633
-D265 8335B634
-D266 8335B635
-D267 8335B636
-D268 8335B637
-D269 8335B638
-D26A 8335B639
-D26B 8335B730
-D26C 8335B731
-D26D 8335B732
-D26E 8335B733
-D26F 8335B734
-D270 8335B735
-D271 8335B736
-D272 8335B737
-D273 8335B738
-D274 8335B739
-D275 8335B830
-D276 8335B831
-D277 8335B832
-D278 8335B833
-D279 8335B834
-D27A 8335B835
-D27B 8335B836
-D27C 8335B837
-D27D 8335B838
-D27E 8335B839
-D27F 8335B930
-D280 8335B931
-D281 8335B932
-D282 8335B933
-D283 8335B934
-D284 8335B935
-D285 8335B936
-D286 8335B937
-D287 8335B938
-D288 8335B939
-D289 8335BA30
-D28A 8335BA31
-D28B 8335BA32
-D28C 8335BA33
-D28D 8335BA34
-D28E 8335BA35
-D28F 8335BA36
-D290 8335BA37
-D291 8335BA38
-D292 8335BA39
-D293 8335BB30
-D294 8335BB31
-D295 8335BB32
-D296 8335BB33
-D297 8335BB34
-D298 8335BB35
-D299 8335BB36
-D29A 8335BB37
-D29B 8335BB38
-D29C 8335BB39
-D29D 8335BC30
-D29E 8335BC31
-D29F 8335BC32
-D2A0 8335BC33
-D2A1 8335BC34
-D2A2 8335BC35
-D2A3 8335BC36
-D2A4 8335BC37
-D2A5 8335BC38
-D2A6 8335BC39
-D2A7 8335BD30
-D2A8 8335BD31
-D2A9 8335BD32
-D2AA 8335BD33
-D2AB 8335BD34
-D2AC 8335BD35
-D2AD 8335BD36
-D2AE 8335BD37
-D2AF 8335BD38
-D2B0 8335BD39
-D2B1 8335BE30
-D2B2 8335BE31
-D2B3 8335BE32
-D2B4 8335BE33
-D2B5 8335BE34
-D2B6 8335BE35
-D2B7 8335BE36
-D2B8 8335BE37
-D2B9 8335BE38
-D2BA 8335BE39
-D2BB 8335BF30
-D2BC 8335BF31
-D2BD 8335BF32
-D2BE 8335BF33
-D2BF 8335BF34
-D2C0 8335BF35
-D2C1 8335BF36
-D2C2 8335BF37
-D2C3 8335BF38
-D2C4 8335BF39
-D2C5 8335C030
-D2C6 8335C031
-D2C7 8335C032
-D2C8 8335C033
-D2C9 8335C034
-D2CA 8335C035
-D2CB 8335C036
-D2CC 8335C037
-D2CD 8335C038
-D2CE 8335C039
-D2CF 8335C130
-D2D0 8335C131
-D2D1 8335C132
-D2D2 8335C133
-D2D3 8335C134
-D2D4 8335C135
-D2D5 8335C136
-D2D6 8335C137
-D2D7 8335C138
-D2D8 8335C139
-D2D9 8335C230
-D2DA 8335C231
-D2DB 8335C232
-D2DC 8335C233
-D2DD 8335C234
-D2DE 8335C235
-D2DF 8335C236
-D2E0 8335C237
-D2E1 8335C238
-D2E2 8335C239
-D2E3 8335C330
-D2E4 8335C331
-D2E5 8335C332
-D2E6 8335C333
-D2E7 8335C334
-D2E8 8335C335
-D2E9 8335C336
-D2EA 8335C337
-D2EB 8335C338
-D2EC 8335C339
-D2ED 8335C430
-D2EE 8335C431
-D2EF 8335C432
-D2F0 8335C433
-D2F1 8335C434
-D2F2 8335C435
-D2F3 8335C436
-D2F4 8335C437
-D2F5 8335C438
-D2F6 8335C439
-D2F7 8335C530
-D2F8 8335C531
-D2F9 8335C532
-D2FA 8335C533
-D2FB 8335C534
-D2FC 8335C535
-D2FD 8335C536
-D2FE 8335C537
-D2FF 8335C538
-D300 8335C539
-D301 8335C630
-D302 8335C631
-D303 8335C632
-D304 8335C633
-D305 8335C634
-D306 8335C635
-D307 8335C636
-D308 8335C637
-D309 8335C638
-D30A 8335C639
-D30B 8335C730
-D30C 8335C731
-D30D 8335C732
-D30E 8335C733
-D30F 8335C734
-D310 8335C735
-D311 8335C736
-D312 8335C737
-D313 8335C738
-D314 8335C739
-D315 8335C830
-D316 8335C831
-D317 8335C832
-D318 8335C833
-D319 8335C834
-D31A 8335C835
-D31B 8335C836
-D31C 8335C837
-D31D 8335C838
-D31E 8335C839
-D31F 8335C930
-D320 8335C931
-D321 8335C932
-D322 8335C933
-D323 8335C934
-D324 8335C935
-D325 8335C936
-D326 8335C937
-D327 8335C938
-D328 8335C939
-D329 8335CA30
-D32A 8335CA31
-D32B 8335CA32
-D32C 8335CA33
-D32D 8335CA34
-D32E 8335CA35
-D32F 8335CA36
-D330 8335CA37
-D331 8335CA38
-D332 8335CA39
-D333 8335CB30
-D334 8335CB31
-D335 8335CB32
-D336 8335CB33
-D337 8335CB34
-D338 8335CB35
-D339 8335CB36
-D33A 8335CB37
-D33B 8335CB38
-D33C 8335CB39
-D33D 8335CC30
-D33E 8335CC31
-D33F 8335CC32
-D340 8335CC33
-D341 8335CC34
-D342 8335CC35
-D343 8335CC36
-D344 8335CC37
-D345 8335CC38
-D346 8335CC39
-D347 8335CD30
-D348 8335CD31
-D349 8335CD32
-D34A 8335CD33
-D34B 8335CD34
-D34C 8335CD35
-D34D 8335CD36
-D34E 8335CD37
-D34F 8335CD38
-D350 8335CD39
-D351 8335CE30
-D352 8335CE31
-D353 8335CE32
-D354 8335CE33
-D355 8335CE34
-D356 8335CE35
-D357 8335CE36
-D358 8335CE37
-D359 8335CE38
-D35A 8335CE39
-D35B 8335CF30
-D35C 8335CF31
-D35D 8335CF32
-D35E 8335CF33
-D35F 8335CF34
-D360 8335CF35
-D361 8335CF36
-D362 8335CF37
-D363 8335CF38
-D364 8335CF39
-D365 8335D030
-D366 8335D031
-D367 8335D032
-D368 8335D033
-D369 8335D034
-D36A 8335D035
-D36B 8335D036
-D36C 8335D037
-D36D 8335D038
-D36E 8335D039
-D36F 8335D130
-D370 8335D131
-D371 8335D132
-D372 8335D133
-D373 8335D134
-D374 8335D135
-D375 8335D136
-D376 8335D137
-D377 8335D138
-D378 8335D139
-D379 8335D230
-D37A 8335D231
-D37B 8335D232
-D37C 8335D233
-D37D 8335D234
-D37E 8335D235
-D37F 8335D236
-D380 8335D237
-D381 8335D238
-D382 8335D239
-D383 8335D330
-D384 8335D331
-D385 8335D332
-D386 8335D333
-D387 8335D334
-D388 8335D335
-D389 8335D336
-D38A 8335D337
-D38B 8335D338
-D38C 8335D339
-D38D 8335D430
-D38E 8335D431
-D38F 8335D432
-D390 8335D433
-D391 8335D434
-D392 8335D435
-D393 8335D436
-D394 8335D437
-D395 8335D438
-D396 8335D439
-D397 8335D530
-D398 8335D531
-D399 8335D532
-D39A 8335D533
-D39B 8335D534
-D39C 8335D535
-D39D 8335D536
-D39E 8335D537
-D39F 8335D538
-D3A0 8335D539
-D3A1 8335D630
-D3A2 8335D631
-D3A3 8335D632
-D3A4 8335D633
-D3A5 8335D634
-D3A6 8335D635
-D3A7 8335D636
-D3A8 8335D637
-D3A9 8335D638
-D3AA 8335D639
-D3AB 8335D730
-D3AC 8335D731
-D3AD 8335D732
-D3AE 8335D733
-D3AF 8335D734
-D3B0 8335D735
-D3B1 8335D736
-D3B2 8335D737
-D3B3 8335D738
-D3B4 8335D739
-D3B5 8335D830
-D3B6 8335D831
-D3B7 8335D832
-D3B8 8335D833
-D3B9 8335D834
-D3BA 8335D835
-D3BB 8335D836
-D3BC 8335D837
-D3BD 8335D838
-D3BE 8335D839
-D3BF 8335D930
-D3C0 8335D931
-D3C1 8335D932
-D3C2 8335D933
-D3C3 8335D934
-D3C4 8335D935
-D3C5 8335D936
-D3C6 8335D937
-D3C7 8335D938
-D3C8 8335D939
-D3C9 8335DA30
-D3CA 8335DA31
-D3CB 8335DA32
-D3CC 8335DA33
-D3CD 8335DA34
-D3CE 8335DA35
-D3CF 8335DA36
-D3D0 8335DA37
-D3D1 8335DA38
-D3D2 8335DA39
-D3D3 8335DB30
-D3D4 8335DB31
-D3D5 8335DB32
-D3D6 8335DB33
-D3D7 8335DB34
-D3D8 8335DB35
-D3D9 8335DB36
-D3DA 8335DB37
-D3DB 8335DB38
-D3DC 8335DB39
-D3DD 8335DC30
-D3DE 8335DC31
-D3DF 8335DC32
-D3E0 8335DC33
-D3E1 8335DC34
-D3E2 8335DC35
-D3E3 8335DC36
-D3E4 8335DC37
-D3E5 8335DC38
-D3E6 8335DC39
-D3E7 8335DD30
-D3E8 8335DD31
-D3E9 8335DD32
-D3EA 8335DD33
-D3EB 8335DD34
-D3EC 8335DD35
-D3ED 8335DD36
-D3EE 8335DD37
-D3EF 8335DD38
-D3F0 8335DD39
-D3F1 8335DE30
-D3F2 8335DE31
-D3F3 8335DE32
-D3F4 8335DE33
-D3F5 8335DE34
-D3F6 8335DE35
-D3F7 8335DE36
-D3F8 8335DE37
-D3F9 8335DE38
-D3FA 8335DE39
-D3FB 8335DF30
-D3FC 8335DF31
-D3FD 8335DF32
-D3FE 8335DF33
-D3FF 8335DF34
-D400 8335DF35
-D401 8335DF36
-D402 8335DF37
-D403 8335DF38
-D404 8335DF39
-D405 8335E030
-D406 8335E031
-D407 8335E032
-D408 8335E033
-D409 8335E034
-D40A 8335E035
-D40B 8335E036
-D40C 8335E037
-D40D 8335E038
-D40E 8335E039
-D40F 8335E130
-D410 8335E131
-D411 8335E132
-D412 8335E133
-D413 8335E134
-D414 8335E135
-D415 8335E136
-D416 8335E137
-D417 8335E138
-D418 8335E139
-D419 8335E230
-D41A 8335E231
-D41B 8335E232
-D41C 8335E233
-D41D 8335E234
-D41E 8335E235
-D41F 8335E236
-D420 8335E237
-D421 8335E238
-D422 8335E239
-D423 8335E330
-D424 8335E331
-D425 8335E332
-D426 8335E333
-D427 8335E334
-D428 8335E335
-D429 8335E336
-D42A 8335E337
-D42B 8335E338
-D42C 8335E339
-D42D 8335E430
-D42E 8335E431
-D42F 8335E432
-D430 8335E433
-D431 8335E434
-D432 8335E435
-D433 8335E436
-D434 8335E437
-D435 8335E438
-D436 8335E439
-D437 8335E530
-D438 8335E531
-D439 8335E532
-D43A 8335E533
-D43B 8335E534
-D43C 8335E535
-D43D 8335E536
-D43E 8335E537
-D43F 8335E538
-D440 8335E539
-D441 8335E630
-D442 8335E631
-D443 8335E632
-D444 8335E633
-D445 8335E634
-D446 8335E635
-D447 8335E636
-D448 8335E637
-D449 8335E638
-D44A 8335E639
-D44B 8335E730
-D44C 8335E731
-D44D 8335E732
-D44E 8335E733
-D44F 8335E734
-D450 8335E735
-D451 8335E736
-D452 8335E737
-D453 8335E738
-D454 8335E739
-D455 8335E830
-D456 8335E831
-D457 8335E832
-D458 8335E833
-D459 8335E834
-D45A 8335E835
-D45B 8335E836
-D45C 8335E837
-D45D 8335E838
-D45E 8335E839
-D45F 8335E930
-D460 8335E931
-D461 8335E932
-D462 8335E933
-D463 8335E934
-D464 8335E935
-D465 8335E936
-D466 8335E937
-D467 8335E938
-D468 8335E939
-D469 8335EA30
-D46A 8335EA31
-D46B 8335EA32
-D46C 8335EA33
-D46D 8335EA34
-D46E 8335EA35
-D46F 8335EA36
-D470 8335EA37
-D471 8335EA38
-D472 8335EA39
-D473 8335EB30
-D474 8335EB31
-D475 8335EB32
-D476 8335EB33
-D477 8335EB34
-D478 8335EB35
-D479 8335EB36
-D47A 8335EB37
-D47B 8335EB38
-D47C 8335EB39
-D47D 8335EC30
-D47E 8335EC31
-D47F 8335EC32
-D480 8335EC33
-D481 8335EC34
-D482 8335EC35
-D483 8335EC36
-D484 8335EC37
-D485 8335EC38
-D486 8335EC39
-D487 8335ED30
-D488 8335ED31
-D489 8335ED32
-D48A 8335ED33
-D48B 8335ED34
-D48C 8335ED35
-D48D 8335ED36
-D48E 8335ED37
-D48F 8335ED38
-D490 8335ED39
-D491 8335EE30
-D492 8335EE31
-D493 8335EE32
-D494 8335EE33
-D495 8335EE34
-D496 8335EE35
-D497 8335EE36
-D498 8335EE37
-D499 8335EE38
-D49A 8335EE39
-D49B 8335EF30
-D49C 8335EF31
-D49D 8335EF32
-D49E 8335EF33
-D49F 8335EF34
-D4A0 8335EF35
-D4A1 8335EF36
-D4A2 8335EF37
-D4A3 8335EF38
-D4A4 8335EF39
-D4A5 8335F030
-D4A6 8335F031
-D4A7 8335F032
-D4A8 8335F033
-D4A9 8335F034
-D4AA 8335F035
-D4AB 8335F036
-D4AC 8335F037
-D4AD 8335F038
-D4AE 8335F039
-D4AF 8335F130
-D4B0 8335F131
-D4B1 8335F132
-D4B2 8335F133
-D4B3 8335F134
-D4B4 8335F135
-D4B5 8335F136
-D4B6 8335F137
-D4B7 8335F138
-D4B8 8335F139
-D4B9 8335F230
-D4BA 8335F231
-D4BB 8335F232
-D4BC 8335F233
-D4BD 8335F234
-D4BE 8335F235
-D4BF 8335F236
-D4C0 8335F237
-D4C1 8335F238
-D4C2 8335F239
-D4C3 8335F330
-D4C4 8335F331
-D4C5 8335F332
-D4C6 8335F333
-D4C7 8335F334
-D4C8 8335F335
-D4C9 8335F336
-D4CA 8335F337
-D4CB 8335F338
-D4CC 8335F339
-D4CD 8335F430
-D4CE 8335F431
-D4CF 8335F432
-D4D0 8335F433
-D4D1 8335F434
-D4D2 8335F435
-D4D3 8335F436
-D4D4 8335F437
-D4D5 8335F438
-D4D6 8335F439
-D4D7 8335F530
-D4D8 8335F531
-D4D9 8335F532
-D4DA 8335F533
-D4DB 8335F534
-D4DC 8335F535
-D4DD 8335F536
-D4DE 8335F537
-D4DF 8335F538
-D4E0 8335F539
-D4E1 8335F630
-D4E2 8335F631
-D4E3 8335F632
-D4E4 8335F633
-D4E5 8335F634
-D4E6 8335F635
-D4E7 8335F636
-D4E8 8335F637
-D4E9 8335F638
-D4EA 8335F639
-D4EB 8335F730
-D4EC 8335F731
-D4ED 8335F732
-D4EE 8335F733
-D4EF 8335F734
-D4F0 8335F735
-D4F1 8335F736
-D4F2 8335F737
-D4F3 8335F738
-D4F4 8335F739
-D4F5 8335F830
-D4F6 8335F831
-D4F7 8335F832
-D4F8 8335F833
-D4F9 8335F834
-D4FA 8335F835
-D4FB 8335F836
-D4FC 8335F837
-D4FD 8335F838
-D4FE 8335F839
-D4FF 8335F930
-D500 8335F931
-D501 8335F932
-D502 8335F933
-D503 8335F934
-D504 8335F935
-D505 8335F936
-D506 8335F937
-D507 8335F938
-D508 8335F939
-D509 8335FA30
-D50A 8335FA31
-D50B 8335FA32
-D50C 8335FA33
-D50D 8335FA34
-D50E 8335FA35
-D50F 8335FA36
-D510 8335FA37
-D511 8335FA38
-D512 8335FA39
-D513 8335FB30
-D514 8335FB31
-D515 8335FB32
-D516 8335FB33
-D517 8335FB34
-D518 8335FB35
-D519 8335FB36
-D51A 8335FB37
-D51B 8335FB38
-D51C 8335FB39
-D51D 8335FC30
-D51E 8335FC31
-D51F 8335FC32
-D520 8335FC33
-D521 8335FC34
-D522 8335FC35
-D523 8335FC36
-D524 8335FC37
-D525 8335FC38
-D526 8335FC39
-D527 8335FD30
-D528 8335FD31
-D529 8335FD32
-D52A 8335FD33
-D52B 8335FD34
-D52C 8335FD35
-D52D 8335FD36
-D52E 8335FD37
-D52F 8335FD38
-D530 8335FD39
-D531 8335FE30
-D532 8335FE31
-D533 8335FE32
-D534 8335FE33
-D535 8335FE34
-D536 8335FE35
-D537 8335FE36
-D538 8335FE37
-D539 8335FE38
-D53A 8335FE39
-D53B 83368130
-D53C 83368131
-D53D 83368132
-D53E 83368133
-D53F 83368134
-D540 83368135
-D541 83368136
-D542 83368137
-D543 83368138
-D544 83368139
-D545 83368230
-D546 83368231
-D547 83368232
-D548 83368233
-D549 83368234
-D54A 83368235
-D54B 83368236
-D54C 83368237
-D54D 83368238
-D54E 83368239
-D54F 83368330
-D550 83368331
-D551 83368332
-D552 83368333
-D553 83368334
-D554 83368335
-D555 83368336
-D556 83368337
-D557 83368338
-D558 83368339
-D559 83368430
-D55A 83368431
-D55B 83368432
-D55C 83368433
-D55D 83368434
-D55E 83368435
-D55F 83368436
-D560 83368437
-D561 83368438
-D562 83368439
-D563 83368530
-D564 83368531
-D565 83368532
-D566 83368533
-D567 83368534
-D568 83368535
-D569 83368536
-D56A 83368537
-D56B 83368538
-D56C 83368539
-D56D 83368630
-D56E 83368631
-D56F 83368632
-D570 83368633
-D571 83368634
-D572 83368635
-D573 83368636
-D574 83368637
-D575 83368638
-D576 83368639
-D577 83368730
-D578 83368731
-D579 83368732
-D57A 83368733
-D57B 83368734
-D57C 83368735
-D57D 83368736
-D57E 83368737
-D57F 83368738
-D580 83368739
-D581 83368830
-D582 83368831
-D583 83368832
-D584 83368833
-D585 83368834
-D586 83368835
-D587 83368836
-D588 83368837
-D589 83368838
-D58A 83368839
-D58B 83368930
-D58C 83368931
-D58D 83368932
-D58E 83368933
-D58F 83368934
-D590 83368935
-D591 83368936
-D592 83368937
-D593 83368938
-D594 83368939
-D595 83368A30
-D596 83368A31
-D597 83368A32
-D598 83368A33
-D599 83368A34
-D59A 83368A35
-D59B 83368A36
-D59C 83368A37
-D59D 83368A38
-D59E 83368A39
-D59F 83368B30
-D5A0 83368B31
-D5A1 83368B32
-D5A2 83368B33
-D5A3 83368B34
-D5A4 83368B35
-D5A5 83368B36
-D5A6 83368B37
-D5A7 83368B38
-D5A8 83368B39
-D5A9 83368C30
-D5AA 83368C31
-D5AB 83368C32
-D5AC 83368C33
-D5AD 83368C34
-D5AE 83368C35
-D5AF 83368C36
-D5B0 83368C37
-D5B1 83368C38
-D5B2 83368C39
-D5B3 83368D30
-D5B4 83368D31
-D5B5 83368D32
-D5B6 83368D33
-D5B7 83368D34
-D5B8 83368D35
-D5B9 83368D36
-D5BA 83368D37
-D5BB 83368D38
-D5BC 83368D39
-D5BD 83368E30
-D5BE 83368E31
-D5BF 83368E32
-D5C0 83368E33
-D5C1 83368E34
-D5C2 83368E35
-D5C3 83368E36
-D5C4 83368E37
-D5C5 83368E38
-D5C6 83368E39
-D5C7 83368F30
-D5C8 83368F31
-D5C9 83368F32
-D5CA 83368F33
-D5CB 83368F34
-D5CC 83368F35
-D5CD 83368F36
-D5CE 83368F37
-D5CF 83368F38
-D5D0 83368F39
-D5D1 83369030
-D5D2 83369031
-D5D3 83369032
-D5D4 83369033
-D5D5 83369034
-D5D6 83369035
-D5D7 83369036
-D5D8 83369037
-D5D9 83369038
-D5DA 83369039
-D5DB 83369130
-D5DC 83369131
-D5DD 83369132
-D5DE 83369133
-D5DF 83369134
-D5E0 83369135
-D5E1 83369136
-D5E2 83369137
-D5E3 83369138
-D5E4 83369139
-D5E5 83369230
-D5E6 83369231
-D5E7 83369232
-D5E8 83369233
-D5E9 83369234
-D5EA 83369235
-D5EB 83369236
-D5EC 83369237
-D5ED 83369238
-D5EE 83369239
-D5EF 83369330
-D5F0 83369331
-D5F1 83369332
-D5F2 83369333
-D5F3 83369334
-D5F4 83369335
-D5F5 83369336
-D5F6 83369337
-D5F7 83369338
-D5F8 83369339
-D5F9 83369430
-D5FA 83369431
-D5FB 83369432
-D5FC 83369433
-D5FD 83369434
-D5FE 83369435
-D5FF 83369436
-D600 83369437
-D601 83369438
-D602 83369439
-D603 83369530
-D604 83369531
-D605 83369532
-D606 83369533
-D607 83369534
-D608 83369535
-D609 83369536
-D60A 83369537
-D60B 83369538
-D60C 83369539
-D60D 83369630
-D60E 83369631
-D60F 83369632
-D610 83369633
-D611 83369634
-D612 83369635
-D613 83369636
-D614 83369637
-D615 83369638
-D616 83369639
-D617 83369730
-D618 83369731
-D619 83369732
-D61A 83369733
-D61B 83369734
-D61C 83369735
-D61D 83369736
-D61E 83369737
-D61F 83369738
-D620 83369739
-D621 83369830
-D622 83369831
-D623 83369832
-D624 83369833
-D625 83369834
-D626 83369835
-D627 83369836
-D628 83369837
-D629 83369838
-D62A 83369839
-D62B 83369930
-D62C 83369931
-D62D 83369932
-D62E 83369933
-D62F 83369934
-D630 83369935
-D631 83369936
-D632 83369937
-D633 83369938
-D634 83369939
-D635 83369A30
-D636 83369A31
-D637 83369A32
-D638 83369A33
-D639 83369A34
-D63A 83369A35
-D63B 83369A36
-D63C 83369A37
-D63D 83369A38
-D63E 83369A39
-D63F 83369B30
-D640 83369B31
-D641 83369B32
-D642 83369B33
-D643 83369B34
-D644 83369B35
-D645 83369B36
-D646 83369B37
-D647 83369B38
-D648 83369B39
-D649 83369C30
-D64A 83369C31
-D64B 83369C32
-D64C 83369C33
-D64D 83369C34
-D64E 83369C35
-D64F 83369C36
-D650 83369C37
-D651 83369C38
-D652 83369C39
-D653 83369D30
-D654 83369D31
-D655 83369D32
-D656 83369D33
-D657 83369D34
-D658 83369D35
-D659 83369D36
-D65A 83369D37
-D65B 83369D38
-D65C 83369D39
-D65D 83369E30
-D65E 83369E31
-D65F 83369E32
-D660 83369E33
-D661 83369E34
-D662 83369E35
-D663 83369E36
-D664 83369E37
-D665 83369E38
-D666 83369E39
-D667 83369F30
-D668 83369F31
-D669 83369F32
-D66A 83369F33
-D66B 83369F34
-D66C 83369F35
-D66D 83369F36
-D66E 83369F37
-D66F 83369F38
-D670 83369F39
-D671 8336A030
-D672 8336A031
-D673 8336A032
-D674 8336A033
-D675 8336A034
-D676 8336A035
-D677 8336A036
-D678 8336A037
-D679 8336A038
-D67A 8336A039
-D67B 8336A130
-D67C 8336A131
-D67D 8336A132
-D67E 8336A133
-D67F 8336A134
-D680 8336A135
-D681 8336A136
-D682 8336A137
-D683 8336A138
-D684 8336A139
-D685 8336A230
-D686 8336A231
-D687 8336A232
-D688 8336A233
-D689 8336A234
-D68A 8336A235
-D68B 8336A236
-D68C 8336A237
-D68D 8336A238
-D68E 8336A239
-D68F 8336A330
-D690 8336A331
-D691 8336A332
-D692 8336A333
-D693 8336A334
-D694 8336A335
-D695 8336A336
-D696 8336A337
-D697 8336A338
-D698 8336A339
-D699 8336A430
-D69A 8336A431
-D69B 8336A432
-D69C 8336A433
-D69D 8336A434
-D69E 8336A435
-D69F 8336A436
-D6A0 8336A437
-D6A1 8336A438
-D6A2 8336A439
-D6A3 8336A530
-D6A4 8336A531
-D6A5 8336A532
-D6A6 8336A533
-D6A7 8336A534
-D6A8 8336A535
-D6A9 8336A536
-D6AA 8336A537
-D6AB 8336A538
-D6AC 8336A539
-D6AD 8336A630
-D6AE 8336A631
-D6AF 8336A632
-D6B0 8336A633
-D6B1 8336A634
-D6B2 8336A635
-D6B3 8336A636
-D6B4 8336A637
-D6B5 8336A638
-D6B6 8336A639
-D6B7 8336A730
-D6B8 8336A731
-D6B9 8336A732
-D6BA 8336A733
-D6BB 8336A734
-D6BC 8336A735
-D6BD 8336A736
-D6BE 8336A737
-D6BF 8336A738
-D6C0 8336A739
-D6C1 8336A830
-D6C2 8336A831
-D6C3 8336A832
-D6C4 8336A833
-D6C5 8336A834
-D6C6 8336A835
-D6C7 8336A836
-D6C8 8336A837
-D6C9 8336A838
-D6CA 8336A839
-D6CB 8336A930
-D6CC 8336A931
-D6CD 8336A932
-D6CE 8336A933
-D6CF 8336A934
-D6D0 8336A935
-D6D1 8336A936
-D6D2 8336A937
-D6D3 8336A938
-D6D4 8336A939
-D6D5 8336AA30
-D6D6 8336AA31
-D6D7 8336AA32
-D6D8 8336AA33
-D6D9 8336AA34
-D6DA 8336AA35
-D6DB 8336AA36
-D6DC 8336AA37
-D6DD 8336AA38
-D6DE 8336AA39
-D6DF 8336AB30
-D6E0 8336AB31
-D6E1 8336AB32
-D6E2 8336AB33
-D6E3 8336AB34
-D6E4 8336AB35
-D6E5 8336AB36
-D6E6 8336AB37
-D6E7 8336AB38
-D6E8 8336AB39
-D6E9 8336AC30
-D6EA 8336AC31
-D6EB 8336AC32
-D6EC 8336AC33
-D6ED 8336AC34
-D6EE 8336AC35
-D6EF 8336AC36
-D6F0 8336AC37
-D6F1 8336AC38
-D6F2 8336AC39
-D6F3 8336AD30
-D6F4 8336AD31
-D6F5 8336AD32
-D6F6 8336AD33
-D6F7 8336AD34
-D6F8 8336AD35
-D6F9 8336AD36
-D6FA 8336AD37
-D6FB 8336AD38
-D6FC 8336AD39
-D6FD 8336AE30
-D6FE 8336AE31
-D6FF 8336AE32
-D700 8336AE33
-D701 8336AE34
-D702 8336AE35
-D703 8336AE36
-D704 8336AE37
-D705 8336AE38
-D706 8336AE39
-D707 8336AF30
-D708 8336AF31
-D709 8336AF32
-D70A 8336AF33
-D70B 8336AF34
-D70C 8336AF35
-D70D 8336AF36
-D70E 8336AF37
-D70F 8336AF38
-D710 8336AF39
-D711 8336B030
-D712 8336B031
-D713 8336B032
-D714 8336B033
-D715 8336B034
-D716 8336B035
-D717 8336B036
-D718 8336B037
-D719 8336B038
-D71A 8336B039
-D71B 8336B130
-D71C 8336B131
-D71D 8336B132
-D71E 8336B133
-D71F 8336B134
-D720 8336B135
-D721 8336B136
-D722 8336B137
-D723 8336B138
-D724 8336B139
-D725 8336B230
-D726 8336B231
-D727 8336B232
-D728 8336B233
-D729 8336B234
-D72A 8336B235
-D72B 8336B236
-D72C 8336B237
-D72D 8336B238
-D72E 8336B239
-D72F 8336B330
-D730 8336B331
-D731 8336B332
-D732 8336B333
-D733 8336B334
-D734 8336B335
-D735 8336B336
-D736 8336B337
-D737 8336B338
-D738 8336B339
-D739 8336B430
-D73A 8336B431
-D73B 8336B432
-D73C 8336B433
-D73D 8336B434
-D73E 8336B435
-D73F 8336B436
-D740 8336B437
-D741 8336B438
-D742 8336B439
-D743 8336B530
-D744 8336B531
-D745 8336B532
-D746 8336B533
-D747 8336B534
-D748 8336B535
-D749 8336B536
-D74A 8336B537
-D74B 8336B538
-D74C 8336B539
-D74D 8336B630
-D74E 8336B631
-D74F 8336B632
-D750 8336B633
-D751 8336B634
-D752 8336B635
-D753 8336B636
-D754 8336B637
-D755 8336B638
-D756 8336B639
-D757 8336B730
-D758 8336B731
-D759 8336B732
-D75A 8336B733
-D75B 8336B734
-D75C 8336B735
-D75D 8336B736
-D75E 8336B737
-D75F 8336B738
-D760 8336B739
-D761 8336B830
-D762 8336B831
-D763 8336B832
-D764 8336B833
-D765 8336B834
-D766 8336B835
-D767 8336B836
-D768 8336B837
-D769 8336B838
-D76A 8336B839
-D76B 8336B930
-D76C 8336B931
-D76D 8336B932
-D76E 8336B933
-D76F 8336B934
-D770 8336B935
-D771 8336B936
-D772 8336B937
-D773 8336B938
-D774 8336B939
-D775 8336BA30
-D776 8336BA31
-D777 8336BA32
-D778 8336BA33
-D779 8336BA34
-D77A 8336BA35
-D77B 8336BA36
-D77C 8336BA37
-D77D 8336BA38
-D77E 8336BA39
-D77F 8336BB30
-D780 8336BB31
-D781 8336BB32
-D782 8336BB33
-D783 8336BB34
-D784 8336BB35
-D785 8336BB36
-D786 8336BB37
-D787 8336BB38
-D788 8336BB39
-D789 8336BC30
-D78A 8336BC31
-D78B 8336BC32
-D78C 8336BC33
-D78D 8336BC34
-D78E 8336BC35
-D78F 8336BC36
-D790 8336BC37
-D791 8336BC38
-D792 8336BC39
-D793 8336BD30
-D794 8336BD31
-D795 8336BD32
-D796 8336BD33
-D797 8336BD34
-D798 8336BD35
-D799 8336BD36
-D79A 8336BD37
-D79B 8336BD38
-D79C 8336BD39
-D79D 8336BE30
-D79E 8336BE31
-D79F 8336BE32
-D7A0 8336BE33
-D7A1 8336BE34
-D7A2 8336BE35
-D7A3 8336BE36
-D7A4 8336BE37
-D7A5 8336BE38
-D7A6 8336BE39
-D7A7 8336BF30
-D7A8 8336BF31
-D7A9 8336BF32
-D7AA 8336BF33
-D7AB 8336BF34
-D7AC 8336BF35
-D7AD 8336BF36
-D7AE 8336BF37
-D7AF 8336BF38
-D7B0 8336BF39
-D7B1 8336C030
-D7B2 8336C031
-D7B3 8336C032
-D7B4 8336C033
-D7B5 8336C034
-D7B6 8336C035
-D7B7 8336C036
-D7B8 8336C037
-D7B9 8336C038
-D7BA 8336C039
-D7BB 8336C130
-D7BC 8336C131
-D7BD 8336C132
-D7BE 8336C133
-D7BF 8336C134
-D7C0 8336C135
-D7C1 8336C136
-D7C2 8336C137
-D7C3 8336C138
-D7C4 8336C139
-D7C5 8336C230
-D7C6 8336C231
-D7C7 8336C232
-D7C8 8336C233
-D7C9 8336C234
-D7CA 8336C235
-D7CB 8336C236
-D7CC 8336C237
-D7CD 8336C238
-D7CE 8336C239
-D7CF 8336C330
-D7D0 8336C331
-D7D1 8336C332
-D7D2 8336C333
-D7D3 8336C334
-D7D4 8336C335
-D7D5 8336C336
-D7D6 8336C337
-D7D7 8336C338
-D7D8 8336C339
-D7D9 8336C430
-D7DA 8336C431
-D7DB 8336C432
-D7DC 8336C433
-D7DD 8336C434
-D7DE 8336C435
-D7DF 8336C436
-D7E0 8336C437
-D7E1 8336C438
-D7E2 8336C439
-D7E3 8336C530
-D7E4 8336C531
-D7E5 8336C532
-D7E6 8336C533
-D7E7 8336C534
-D7E8 8336C535
-D7E9 8336C536
-D7EA 8336C537
-D7EB 8336C538
-D7EC 8336C539
-D7ED 8336C630
-D7EE 8336C631
-D7EF 8336C632
-D7F0 8336C633
-D7F1 8336C634
-D7F2 8336C635
-D7F3 8336C636
-D7F4 8336C637
-D7F5 8336C638
-D7F6 8336C639
-D7F7 8336C730
-D7F8 8336C731
-D7F9 8336C732
-D7FA 8336C733
-D7FB 8336C734
-D7FC 8336C735
-D7FD 8336C736
-D7FE 8336C737
-D7FF 8336C738
-E000 AAA1
-E001 AAA2
-E002 AAA3
-E003 AAA4
-E004 AAA5
-E005 AAA6
-E006 AAA7
-E007 AAA8
-E008 AAA9
-E009 AAAA
-E00A AAAB
-E00B AAAC
-E00C AAAD
-E00D AAAE
-E00E AAAF
-E00F AAB0
-E010 AAB1
-E011 AAB2
-E012 AAB3
-E013 AAB4
-E014 AAB5
-E015 AAB6
-E016 AAB7
-E017 AAB8
-E018 AAB9
-E019 AABA
-E01A AABB
-E01B AABC
-E01C AABD
-E01D AABE
-E01E AABF
-E01F AAC0
-E020 AAC1
-E021 AAC2
-E022 AAC3
-E023 AAC4
-E024 AAC5
-E025 AAC6
-E026 AAC7
-E027 AAC8
-E028 AAC9
-E029 AACA
-E02A AACB
-E02B AACC
-E02C AACD
-E02D AACE
-E02E AACF
-E02F AAD0
-E030 AAD1
-E031 AAD2
-E032 AAD3
-E033 AAD4
-E034 AAD5
-E035 AAD6
-E036 AAD7
-E037 AAD8
-E038 AAD9
-E039 AADA
-E03A AADB
-E03B AADC
-E03C AADD
-E03D AADE
-E03E AADF
-E03F AAE0
-E040 AAE1
-E041 AAE2
-E042 AAE3
-E043 AAE4
-E044 AAE5
-E045 AAE6
-E046 AAE7
-E047 AAE8
-E048 AAE9
-E049 AAEA
-E04A AAEB
-E04B AAEC
-E04C AAED
-E04D AAEE
-E04E AAEF
-E04F AAF0
-E050 AAF1
-E051 AAF2
-E052 AAF3
-E053 AAF4
-E054 AAF5
-E055 AAF6
-E056 AAF7
-E057 AAF8
-E058 AAF9
-E059 AAFA
-E05A AAFB
-E05B AAFC
-E05C AAFD
-E05D AAFE
-E05E ABA1
-E05F ABA2
-E060 ABA3
-E061 ABA4
-E062 ABA5
-E063 ABA6
-E064 ABA7
-E065 ABA8
-E066 ABA9
-E067 ABAA
-E068 ABAB
-E069 ABAC
-E06A ABAD
-E06B ABAE
-E06C ABAF
-E06D ABB0
-E06E ABB1
-E06F ABB2
-E070 ABB3
-E071 ABB4
-E072 ABB5
-E073 ABB6
-E074 ABB7
-E075 ABB8
-E076 ABB9
-E077 ABBA
-E078 ABBB
-E079 ABBC
-E07A ABBD
-E07B ABBE
-E07C ABBF
-E07D ABC0
-E07E ABC1
-E07F ABC2
-E080 ABC3
-E081 ABC4
-E082 ABC5
-E083 ABC6
-E084 ABC7
-E085 ABC8
-E086 ABC9
-E087 ABCA
-E088 ABCB
-E089 ABCC
-E08A ABCD
-E08B ABCE
-E08C ABCF
-E08D ABD0
-E08E ABD1
-E08F ABD2
-E090 ABD3
-E091 ABD4
-E092 ABD5
-E093 ABD6
-E094 ABD7
-E095 ABD8
-E096 ABD9
-E097 ABDA
-E098 ABDB
-E099 ABDC
-E09A ABDD
-E09B ABDE
-E09C ABDF
-E09D ABE0
-E09E ABE1
-E09F ABE2
-E0A0 ABE3
-E0A1 ABE4
-E0A2 ABE5
-E0A3 ABE6
-E0A4 ABE7
-E0A5 ABE8
-E0A6 ABE9
-E0A7 ABEA
-E0A8 ABEB
-E0A9 ABEC
-E0AA ABED
-E0AB ABEE
-E0AC ABEF
-E0AD ABF0
-E0AE ABF1
-E0AF ABF2
-E0B0 ABF3
-E0B1 ABF4
-E0B2 ABF5
-E0B3 ABF6
-E0B4 ABF7
-E0B5 ABF8
-E0B6 ABF9
-E0B7 ABFA
-E0B8 ABFB
-E0B9 ABFC
-E0BA ABFD
-E0BB ABFE
-E0BC ACA1
-E0BD ACA2
-E0BE ACA3
-E0BF ACA4
-E0C0 ACA5
-E0C1 ACA6
-E0C2 ACA7
-E0C3 ACA8
-E0C4 ACA9
-E0C5 ACAA
-E0C6 ACAB
-E0C7 ACAC
-E0C8 ACAD
-E0C9 ACAE
-E0CA ACAF
-E0CB ACB0
-E0CC ACB1
-E0CD ACB2
-E0CE ACB3
-E0CF ACB4
-E0D0 ACB5
-E0D1 ACB6
-E0D2 ACB7
-E0D3 ACB8
-E0D4 ACB9
-E0D5 ACBA
-E0D6 ACBB
-E0D7 ACBC
-E0D8 ACBD
-E0D9 ACBE
-E0DA ACBF
-E0DB ACC0
-E0DC ACC1
-E0DD ACC2
-E0DE ACC3
-E0DF ACC4
-E0E0 ACC5
-E0E1 ACC6
-E0E2 ACC7
-E0E3 ACC8
-E0E4 ACC9
-E0E5 ACCA
-E0E6 ACCB
-E0E7 ACCC
-E0E8 ACCD
-E0E9 ACCE
-E0EA ACCF
-E0EB ACD0
-E0EC ACD1
-E0ED ACD2
-E0EE ACD3
-E0EF ACD4
-E0F0 ACD5
-E0F1 ACD6
-E0F2 ACD7
-E0F3 ACD8
-E0F4 ACD9
-E0F5 ACDA
-E0F6 ACDB
-E0F7 ACDC
-E0F8 ACDD
-E0F9 ACDE
-E0FA ACDF
-E0FB ACE0
-E0FC ACE1
-E0FD ACE2
-E0FE ACE3
-E0FF ACE4
-E100 ACE5
-E101 ACE6
-E102 ACE7
-E103 ACE8
-E104 ACE9
-E105 ACEA
-E106 ACEB
-E107 ACEC
-E108 ACED
-E109 ACEE
-E10A ACEF
-E10B ACF0
-E10C ACF1
-E10D ACF2
-E10E ACF3
-E10F ACF4
-E110 ACF5
-E111 ACF6
-E112 ACF7
-E113 ACF8
-E114 ACF9
-E115 ACFA
-E116 ACFB
-E117 ACFC
-E118 ACFD
-E119 ACFE
-E11A ADA1
-E11B ADA2
-E11C ADA3
-E11D ADA4
-E11E ADA5
-E11F ADA6
-E120 ADA7
-E121 ADA8
-E122 ADA9
-E123 ADAA
-E124 ADAB
-E125 ADAC
-E126 ADAD
-E127 ADAE
-E128 ADAF
-E129 ADB0
-E12A ADB1
-E12B ADB2
-E12C ADB3
-E12D ADB4
-E12E ADB5
-E12F ADB6
-E130 ADB7
-E131 ADB8
-E132 ADB9
-E133 ADBA
-E134 ADBB
-E135 ADBC
-E136 ADBD
-E137 ADBE
-E138 ADBF
-E139 ADC0
-E13A ADC1
-E13B ADC2
-E13C ADC3
-E13D ADC4
-E13E ADC5
-E13F ADC6
-E140 ADC7
-E141 ADC8
-E142 ADC9
-E143 ADCA
-E144 ADCB
-E145 ADCC
-E146 ADCD
-E147 ADCE
-E148 ADCF
-E149 ADD0
-E14A ADD1
-E14B ADD2
-E14C ADD3
-E14D ADD4
-E14E ADD5
-E14F ADD6
-E150 ADD7
-E151 ADD8
-E152 ADD9
-E153 ADDA
-E154 ADDB
-E155 ADDC
-E156 ADDD
-E157 ADDE
-E158 ADDF
-E159 ADE0
-E15A ADE1
-E15B ADE2
-E15C ADE3
-E15D ADE4
-E15E ADE5
-E15F ADE6
-E160 ADE7
-E161 ADE8
-E162 ADE9
-E163 ADEA
-E164 ADEB
-E165 ADEC
-E166 ADED
-E167 ADEE
-E168 ADEF
-E169 ADF0
-E16A ADF1
-E16B ADF2
-E16C ADF3
-E16D ADF4
-E16E ADF5
-E16F ADF6
-E170 ADF7
-E171 ADF8
-E172 ADF9
-E173 ADFA
-E174 ADFB
-E175 ADFC
-E176 ADFD
-E177 ADFE
-E178 AEA1
-E179 AEA2
-E17A AEA3
-E17B AEA4
-E17C AEA5
-E17D AEA6
-E17E AEA7
-E17F AEA8
-E180 AEA9
-E181 AEAA
-E182 AEAB
-E183 AEAC
-E184 AEAD
-E185 AEAE
-E186 AEAF
-E187 AEB0
-E188 AEB1
-E189 AEB2
-E18A AEB3
-E18B AEB4
-E18C AEB5
-E18D AEB6
-E18E AEB7
-E18F AEB8
-E190 AEB9
-E191 AEBA
-E192 AEBB
-E193 AEBC
-E194 AEBD
-E195 AEBE
-E196 AEBF
-E197 AEC0
-E198 AEC1
-E199 AEC2
-E19A AEC3
-E19B AEC4
-E19C AEC5
-E19D AEC6
-E19E AEC7
-E19F AEC8
-E1A0 AEC9
-E1A1 AECA
-E1A2 AECB
-E1A3 AECC
-E1A4 AECD
-E1A5 AECE
-E1A6 AECF
-E1A7 AED0
-E1A8 AED1
-E1A9 AED2
-E1AA AED3
-E1AB AED4
-E1AC AED5
-E1AD AED6
-E1AE AED7
-E1AF AED8
-E1B0 AED9
-E1B1 AEDA
-E1B2 AEDB
-E1B3 AEDC
-E1B4 AEDD
-E1B5 AEDE
-E1B6 AEDF
-E1B7 AEE0
-E1B8 AEE1
-E1B9 AEE2
-E1BA AEE3
-E1BB AEE4
-E1BC AEE5
-E1BD AEE6
-E1BE AEE7
-E1BF AEE8
-E1C0 AEE9
-E1C1 AEEA
-E1C2 AEEB
-E1C3 AEEC
-E1C4 AEED
-E1C5 AEEE
-E1C6 AEEF
-E1C7 AEF0
-E1C8 AEF1
-E1C9 AEF2
-E1CA AEF3
-E1CB AEF4
-E1CC AEF5
-E1CD AEF6
-E1CE AEF7
-E1CF AEF8
-E1D0 AEF9
-E1D1 AEFA
-E1D2 AEFB
-E1D3 AEFC
-E1D4 AEFD
-E1D5 AEFE
-E1D6 AFA1
-E1D7 AFA2
-E1D8 AFA3
-E1D9 AFA4
-E1DA AFA5
-E1DB AFA6
-E1DC AFA7
-E1DD AFA8
-E1DE AFA9
-E1DF AFAA
-E1E0 AFAB
-E1E1 AFAC
-E1E2 AFAD
-E1E3 AFAE
-E1E4 AFAF
-E1E5 AFB0
-E1E6 AFB1
-E1E7 AFB2
-E1E8 AFB3
-E1E9 AFB4
-E1EA AFB5
-E1EB AFB6
-E1EC AFB7
-E1ED AFB8
-E1EE AFB9
-E1EF AFBA
-E1F0 AFBB
-E1F1 AFBC
-E1F2 AFBD
-E1F3 AFBE
-E1F4 AFBF
-E1F5 AFC0
-E1F6 AFC1
-E1F7 AFC2
-E1F8 AFC3
-E1F9 AFC4
-E1FA AFC5
-E1FB AFC6
-E1FC AFC7
-E1FD AFC8
-E1FE AFC9
-E1FF AFCA
-E200 AFCB
-E201 AFCC
-E202 AFCD
-E203 AFCE
-E204 AFCF
-E205 AFD0
-E206 AFD1
-E207 AFD2
-E208 AFD3
-E209 AFD4
-E20A AFD5
-E20B AFD6
-E20C AFD7
-E20D AFD8
-E20E AFD9
-E20F AFDA
-E210 AFDB
-E211 AFDC
-E212 AFDD
-E213 AFDE
-E214 AFDF
-E215 AFE0
-E216 AFE1
-E217 AFE2
-E218 AFE3
-E219 AFE4
-E21A AFE5
-E21B AFE6
-E21C AFE7
-E21D AFE8
-E21E AFE9
-E21F AFEA
-E220 AFEB
-E221 AFEC
-E222 AFED
-E223 AFEE
-E224 AFEF
-E225 AFF0
-E226 AFF1
-E227 AFF2
-E228 AFF3
-E229 AFF4
-E22A AFF5
-E22B AFF6
-E22C AFF7
-E22D AFF8
-E22E AFF9
-E22F AFFA
-E230 AFFB
-E231 AFFC
-E232 AFFD
-E233 AFFE
-E234 F8A1
-E235 F8A2
-E236 F8A3
-E237 F8A4
-E238 F8A5
-E239 F8A6
-E23A F8A7
-E23B F8A8
-E23C F8A9
-E23D F8AA
-E23E F8AB
-E23F F8AC
-E240 F8AD
-E241 F8AE
-E242 F8AF
-E243 F8B0
-E244 F8B1
-E245 F8B2
-E246 F8B3
-E247 F8B4
-E248 F8B5
-E249 F8B6
-E24A F8B7
-E24B F8B8
-E24C F8B9
-E24D F8BA
-E24E F8BB
-E24F F8BC
-E250 F8BD
-E251 F8BE
-E252 F8BF
-E253 F8C0
-E254 F8C1
-E255 F8C2
-E256 F8C3
-E257 F8C4
-E258 F8C5
-E259 F8C6
-E25A F8C7
-E25B F8C8
-E25C F8C9
-E25D F8CA
-E25E F8CB
-E25F F8CC
-E260 F8CD
-E261 F8CE
-E262 F8CF
-E263 F8D0
-E264 F8D1
-E265 F8D2
-E266 F8D3
-E267 F8D4
-E268 F8D5
-E269 F8D6
-E26A F8D7
-E26B F8D8
-E26C F8D9
-E26D F8DA
-E26E F8DB
-E26F F8DC
-E270 F8DD
-E271 F8DE
-E272 F8DF
-E273 F8E0
-E274 F8E1
-E275 F8E2
-E276 F8E3
-E277 F8E4
-E278 F8E5
-E279 F8E6
-E27A F8E7
-E27B F8E8
-E27C F8E9
-E27D F8EA
-E27E F8EB
-E27F F8EC
-E280 F8ED
-E281 F8EE
-E282 F8EF
-E283 F8F0
-E284 F8F1
-E285 F8F2
-E286 F8F3
-E287 F8F4
-E288 F8F5
-E289 F8F6
-E28A F8F7
-E28B F8F8
-E28C F8F9
-E28D F8FA
-E28E F8FB
-E28F F8FC
-E290 F8FD
-E291 F8FE
-E292 F9A1
-E293 F9A2
-E294 F9A3
-E295 F9A4
-E296 F9A5
-E297 F9A6
-E298 F9A7
-E299 F9A8
-E29A F9A9
-E29B F9AA
-E29C F9AB
-E29D F9AC
-E29E F9AD
-E29F F9AE
-E2A0 F9AF
-E2A1 F9B0
-E2A2 F9B1
-E2A3 F9B2
-E2A4 F9B3
-E2A5 F9B4
-E2A6 F9B5
-E2A7 F9B6
-E2A8 F9B7
-E2A9 F9B8
-E2AA F9B9
-E2AB F9BA
-E2AC F9BB
-E2AD F9BC
-E2AE F9BD
-E2AF F9BE
-E2B0 F9BF
-E2B1 F9C0
-E2B2 F9C1
-E2B3 F9C2
-E2B4 F9C3
-E2B5 F9C4
-E2B6 F9C5
-E2B7 F9C6
-E2B8 F9C7
-E2B9 F9C8
-E2BA F9C9
-E2BB F9CA
-E2BC F9CB
-E2BD F9CC
-E2BE F9CD
-E2BF F9CE
-E2C0 F9CF
-E2C1 F9D0
-E2C2 F9D1
-E2C3 F9D2
-E2C4 F9D3
-E2C5 F9D4
-E2C6 F9D5
-E2C7 F9D6
-E2C8 F9D7
-E2C9 F9D8
-E2CA F9D9
-E2CB F9DA
-E2CC F9DB
-E2CD F9DC
-E2CE F9DD
-E2CF F9DE
-E2D0 F9DF
-E2D1 F9E0
-E2D2 F9E1
-E2D3 F9E2
-E2D4 F9E3
-E2D5 F9E4
-E2D6 F9E5
-E2D7 F9E6
-E2D8 F9E7
-E2D9 F9E8
-E2DA F9E9
-E2DB F9EA
-E2DC F9EB
-E2DD F9EC
-E2DE F9ED
-E2DF F9EE
-E2E0 F9EF
-E2E1 F9F0
-E2E2 F9F1
-E2E3 F9F2
-E2E4 F9F3
-E2E5 F9F4
-E2E6 F9F5
-E2E7 F9F6
-E2E8 F9F7
-E2E9 F9F8
-E2EA F9F9
-E2EB F9FA
-E2EC F9FB
-E2ED F9FC
-E2EE F9FD
-E2EF F9FE
-E2F0 FAA1
-E2F1 FAA2
-E2F2 FAA3
-E2F3 FAA4
-E2F4 FAA5
-E2F5 FAA6
-E2F6 FAA7
-E2F7 FAA8
-E2F8 FAA9
-E2F9 FAAA
-E2FA FAAB
-E2FB FAAC
-E2FC FAAD
-E2FD FAAE
-E2FE FAAF
-E2FF FAB0
-E300 FAB1
-E301 FAB2
-E302 FAB3
-E303 FAB4
-E304 FAB5
-E305 FAB6
-E306 FAB7
-E307 FAB8
-E308 FAB9
-E309 FABA
-E30A FABB
-E30B FABC
-E30C FABD
-E30D FABE
-E30E FABF
-E30F FAC0
-E310 FAC1
-E311 FAC2
-E312 FAC3
-E313 FAC4
-E314 FAC5
-E315 FAC6
-E316 FAC7
-E317 FAC8
-E318 FAC9
-E319 FACA
-E31A FACB
-E31B FACC
-E31C FACD
-E31D FACE
-E31E FACF
-E31F FAD0
-E320 FAD1
-E321 FAD2
-E322 FAD3
-E323 FAD4
-E324 FAD5
-E325 FAD6
-E326 FAD7
-E327 FAD8
-E328 FAD9
-E329 FADA
-E32A FADB
-E32B FADC
-E32C FADD
-E32D FADE
-E32E FADF
-E32F FAE0
-E330 FAE1
-E331 FAE2
-E332 FAE3
-E333 FAE4
-E334 FAE5
-E335 FAE6
-E336 FAE7
-E337 FAE8
-E338 FAE9
-E339 FAEA
-E33A FAEB
-E33B FAEC
-E33C FAED
-E33D FAEE
-E33E FAEF
-E33F FAF0
-E340 FAF1
-E341 FAF2
-E342 FAF3
-E343 FAF4
-E344 FAF5
-E345 FAF6
-E346 FAF7
-E347 FAF8
-E348 FAF9
-E349 FAFA
-E34A FAFB
-E34B FAFC
-E34C FAFD
-E34D FAFE
-E34E FBA1
-E34F FBA2
-E350 FBA3
-E351 FBA4
-E352 FBA5
-E353 FBA6
-E354 FBA7
-E355 FBA8
-E356 FBA9
-E357 FBAA
-E358 FBAB
-E359 FBAC
-E35A FBAD
-E35B FBAE
-E35C FBAF
-E35D FBB0
-E35E FBB1
-E35F FBB2
-E360 FBB3
-E361 FBB4
-E362 FBB5
-E363 FBB6
-E364 FBB7
-E365 FBB8
-E366 FBB9
-E367 FBBA
-E368 FBBB
-E369 FBBC
-E36A FBBD
-E36B FBBE
-E36C FBBF
-E36D FBC0
-E36E FBC1
-E36F FBC2
-E370 FBC3
-E371 FBC4
-E372 FBC5
-E373 FBC6
-E374 FBC7
-E375 FBC8
-E376 FBC9
-E377 FBCA
-E378 FBCB
-E379 FBCC
-E37A FBCD
-E37B FBCE
-E37C FBCF
-E37D FBD0
-E37E FBD1
-E37F FBD2
-E380 FBD3
-E381 FBD4
-E382 FBD5
-E383 FBD6
-E384 FBD7
-E385 FBD8
-E386 FBD9
-E387 FBDA
-E388 FBDB
-E389 FBDC
-E38A FBDD
-E38B FBDE
-E38C FBDF
-E38D FBE0
-E38E FBE1
-E38F FBE2
-E390 FBE3
-E391 FBE4
-E392 FBE5
-E393 FBE6
-E394 FBE7
-E395 FBE8
-E396 FBE9
-E397 FBEA
-E398 FBEB
-E399 FBEC
-E39A FBED
-E39B FBEE
-E39C FBEF
-E39D FBF0
-E39E FBF1
-E39F FBF2
-E3A0 FBF3
-E3A1 FBF4
-E3A2 FBF5
-E3A3 FBF6
-E3A4 FBF7
-E3A5 FBF8
-E3A6 FBF9
-E3A7 FBFA
-E3A8 FBFB
-E3A9 FBFC
-E3AA FBFD
-E3AB FBFE
-E3AC FCA1
-E3AD FCA2
-E3AE FCA3
-E3AF FCA4
-E3B0 FCA5
-E3B1 FCA6
-E3B2 FCA7
-E3B3 FCA8
-E3B4 FCA9
-E3B5 FCAA
-E3B6 FCAB
-E3B7 FCAC
-E3B8 FCAD
-E3B9 FCAE
-E3BA FCAF
-E3BB FCB0
-E3BC FCB1
-E3BD FCB2
-E3BE FCB3
-E3BF FCB4
-E3C0 FCB5
-E3C1 FCB6
-E3C2 FCB7
-E3C3 FCB8
-E3C4 FCB9
-E3C5 FCBA
-E3C6 FCBB
-E3C7 FCBC
-E3C8 FCBD
-E3C9 FCBE
-E3CA FCBF
-E3CB FCC0
-E3CC FCC1
-E3CD FCC2
-E3CE FCC3
-E3CF FCC4
-E3D0 FCC5
-E3D1 FCC6
-E3D2 FCC7
-E3D3 FCC8
-E3D4 FCC9
-E3D5 FCCA
-E3D6 FCCB
-E3D7 FCCC
-E3D8 FCCD
-E3D9 FCCE
-E3DA FCCF
-E3DB FCD0
-E3DC FCD1
-E3DD FCD2
-E3DE FCD3
-E3DF FCD4
-E3E0 FCD5
-E3E1 FCD6
-E3E2 FCD7
-E3E3 FCD8
-E3E4 FCD9
-E3E5 FCDA
-E3E6 FCDB
-E3E7 FCDC
-E3E8 FCDD
-E3E9 FCDE
-E3EA FCDF
-E3EB FCE0
-E3EC FCE1
-E3ED FCE2
-E3EE FCE3
-E3EF FCE4
-E3F0 FCE5
-E3F1 FCE6
-E3F2 FCE7
-E3F3 FCE8
-E3F4 FCE9
-E3F5 FCEA
-E3F6 FCEB
-E3F7 FCEC
-E3F8 FCED
-E3F9 FCEE
-E3FA FCEF
-E3FB FCF0
-E3FC FCF1
-E3FD FCF2
-E3FE FCF3
-E3FF FCF4
-E400 FCF5
-E401 FCF6
-E402 FCF7
-E403 FCF8
-E404 FCF9
-E405 FCFA
-E406 FCFB
-E407 FCFC
-E408 FCFD
-E409 FCFE
-E40A FDA1
-E40B FDA2
-E40C FDA3
-E40D FDA4
-E40E FDA5
-E40F FDA6
-E410 FDA7
-E411 FDA8
-E412 FDA9
-E413 FDAA
-E414 FDAB
-E415 FDAC
-E416 FDAD
-E417 FDAE
-E418 FDAF
-E419 FDB0
-E41A FDB1
-E41B FDB2
-E41C FDB3
-E41D FDB4
-E41E FDB5
-E41F FDB6
-E420 FDB7
-E421 FDB8
-E422 FDB9
-E423 FDBA
-E424 FDBB
-E425 FDBC
-E426 FDBD
-E427 FDBE
-E428 FDBF
-E429 FDC0
-E42A FDC1
-E42B FDC2
-E42C FDC3
-E42D FDC4
-E42E FDC5
-E42F FDC6
-E430 FDC7
-E431 FDC8
-E432 FDC9
-E433 FDCA
-E434 FDCB
-E435 FDCC
-E436 FDCD
-E437 FDCE
-E438 FDCF
-E439 FDD0
-E43A FDD1
-E43B FDD2
-E43C FDD3
-E43D FDD4
-E43E FDD5
-E43F FDD6
-E440 FDD7
-E441 FDD8
-E442 FDD9
-E443 FDDA
-E444 FDDB
-E445 FDDC
-E446 FDDD
-E447 FDDE
-E448 FDDF
-E449 FDE0
-E44A FDE1
-E44B FDE2
-E44C FDE3
-E44D FDE4
-E44E FDE5
-E44F FDE6
-E450 FDE7
-E451 FDE8
-E452 FDE9
-E453 FDEA
-E454 FDEB
-E455 FDEC
-E456 FDED
-E457 FDEE
-E458 FDEF
-E459 FDF0
-E45A FDF1
-E45B FDF2
-E45C FDF3
-E45D FDF4
-E45E FDF5
-E45F FDF6
-E460 FDF7
-E461 FDF8
-E462 FDF9
-E463 FDFA
-E464 FDFB
-E465 FDFC
-E466 FDFD
-E467 FDFE
-E468 FEA1
-E469 FEA2
-E46A FEA3
-E46B FEA4
-E46C FEA5
-E46D FEA6
-E46E FEA7
-E46F FEA8
-E470 FEA9
-E471 FEAA
-E472 FEAB
-E473 FEAC
-E474 FEAD
-E475 FEAE
-E476 FEAF
-E477 FEB0
-E478 FEB1
-E479 FEB2
-E47A FEB3
-E47B FEB4
-E47C FEB5
-E47D FEB6
-E47E FEB7
-E47F FEB8
-E480 FEB9
-E481 FEBA
-E482 FEBB
-E483 FEBC
-E484 FEBD
-E485 FEBE
-E486 FEBF
-E487 FEC0
-E488 FEC1
-E489 FEC2
-E48A FEC3
-E48B FEC4
-E48C FEC5
-E48D FEC6
-E48E FEC7
-E48F FEC8
-E490 FEC9
-E491 FECA
-E492 FECB
-E493 FECC
-E494 FECD
-E495 FECE
-E496 FECF
-E497 FED0
-E498 FED1
-E499 FED2
-E49A FED3
-E49B FED4
-E49C FED5
-E49D FED6
-E49E FED7
-E49F FED8
-E4A0 FED9
-E4A1 FEDA
-E4A2 FEDB
-E4A3 FEDC
-E4A4 FEDD
-E4A5 FEDE
-E4A6 FEDF
-E4A7 FEE0
-E4A8 FEE1
-E4A9 FEE2
-E4AA FEE3
-E4AB FEE4
-E4AC FEE5
-E4AD FEE6
-E4AE FEE7
-E4AF FEE8
-E4B0 FEE9
-E4B1 FEEA
-E4B2 FEEB
-E4B3 FEEC
-E4B4 FEED
-E4B5 FEEE
-E4B6 FEEF
-E4B7 FEF0
-E4B8 FEF1
-E4B9 FEF2
-E4BA FEF3
-E4BB FEF4
-E4BC FEF5
-E4BD FEF6
-E4BE FEF7
-E4BF FEF8
-E4C0 FEF9
-E4C1 FEFA
-E4C2 FEFB
-E4C3 FEFC
-E4C4 FEFD
-E4C5 FEFE
-E4C6 A140
-E4C7 A141
-E4C8 A142
-E4C9 A143
-E4CA A144
-E4CB A145
-E4CC A146
-E4CD A147
-E4CE A148
-E4CF A149
-E4D0 A14A
-E4D1 A14B
-E4D2 A14C
-E4D3 A14D
-E4D4 A14E
-E4D5 A14F
-E4D6 A150
-E4D7 A151
-E4D8 A152
-E4D9 A153
-E4DA A154
-E4DB A155
-E4DC A156
-E4DD A157
-E4DE A158
-E4DF A159
-E4E0 A15A
-E4E1 A15B
-E4E2 A15C
-E4E3 A15D
-E4E4 A15E
-E4E5 A15F
-E4E6 A160
-E4E7 A161
-E4E8 A162
-E4E9 A163
-E4EA A164
-E4EB A165
-E4EC A166
-E4ED A167
-E4EE A168
-E4EF A169
-E4F0 A16A
-E4F1 A16B
-E4F2 A16C
-E4F3 A16D
-E4F4 A16E
-E4F5 A16F
-E4F6 A170
-E4F7 A171
-E4F8 A172
-E4F9 A173
-E4FA A174
-E4FB A175
-E4FC A176
-E4FD A177
-E4FE A178
-E4FF A179
-E500 A17A
-E501 A17B
-E502 A17C
-E503 A17D
-E504 A17E
-E505 A180
-E506 A181
-E507 A182
-E508 A183
-E509 A184
-E50A A185
-E50B A186
-E50C A187
-E50D A188
-E50E A189
-E50F A18A
-E510 A18B
-E511 A18C
-E512 A18D
-E513 A18E
-E514 A18F
-E515 A190
-E516 A191
-E517 A192
-E518 A193
-E519 A194
-E51A A195
-E51B A196
-E51C A197
-E51D A198
-E51E A199
-E51F A19A
-E520 A19B
-E521 A19C
-E522 A19D
-E523 A19E
-E524 A19F
-E525 A1A0
-E526 A240
-E527 A241
-E528 A242
-E529 A243
-E52A A244
-E52B A245
-E52C A246
-E52D A247
-E52E A248
-E52F A249
-E530 A24A
-E531 A24B
-E532 A24C
-E533 A24D
-E534 A24E
-E535 A24F
-E536 A250
-E537 A251
-E538 A252
-E539 A253
-E53A A254
-E53B A255
-E53C A256
-E53D A257
-E53E A258
-E53F A259
-E540 A25A
-E541 A25B
-E542 A25C
-E543 A25D
-E544 A25E
-E545 A25F
-E546 A260
-E547 A261
-E548 A262
-E549 A263
-E54A A264
-E54B A265
-E54C A266
-E54D A267
-E54E A268
-E54F A269
-E550 A26A
-E551 A26B
-E552 A26C
-E553 A26D
-E554 A26E
-E555 A26F
-E556 A270
-E557 A271
-E558 A272
-E559 A273
-E55A A274
-E55B A275
-E55C A276
-E55D A277
-E55E A278
-E55F A279
-E560 A27A
-E561 A27B
-E562 A27C
-E563 A27D
-E564 A27E
-E565 A280
-E566 A281
-E567 A282
-E568 A283
-E569 A284
-E56A A285
-E56B A286
-E56C A287
-E56D A288
-E56E A289
-E56F A28A
-E570 A28B
-E571 A28C
-E572 A28D
-E573 A28E
-E574 A28F
-E575 A290
-E576 A291
-E577 A292
-E578 A293
-E579 A294
-E57A A295
-E57B A296
-E57C A297
-E57D A298
-E57E A299
-E57F A29A
-E580 A29B
-E581 A29C
-E582 A29D
-E583 A29E
-E584 A29F
-E585 A2A0
-E586 A340
-E587 A341
-E588 A342
-E589 A343
-E58A A344
-E58B A345
-E58C A346
-E58D A347
-E58E A348
-E58F A349
-E590 A34A
-E591 A34B
-E592 A34C
-E593 A34D
-E594 A34E
-E595 A34F
-E596 A350
-E597 A351
-E598 A352
-E599 A353
-E59A A354
-E59B A355
-E59C A356
-E59D A357
-E59E A358
-E59F A359
-E5A0 A35A
-E5A1 A35B
-E5A2 A35C
-E5A3 A35D
-E5A4 A35E
-E5A5 A35F
-E5A6 A360
-E5A7 A361
-E5A8 A362
-E5A9 A363
-E5AA A364
-E5AB A365
-E5AC A366
-E5AD A367
-E5AE A368
-E5AF A369
-E5B0 A36A
-E5B1 A36B
-E5B2 A36C
-E5B3 A36D
-E5B4 A36E
-E5B5 A36F
-E5B6 A370
-E5B7 A371
-E5B8 A372
-E5B9 A373
-E5BA A374
-E5BB A375
-E5BC A376
-E5BD A377
-E5BE A378
-E5BF A379
-E5C0 A37A
-E5C1 A37B
-E5C2 A37C
-E5C3 A37D
-E5C4 A37E
-E5C5 A380
-E5C6 A381
-E5C7 A382
-E5C8 A383
-E5C9 A384
-E5CA A385
-E5CB A386
-E5CC A387
-E5CD A388
-E5CE A389
-E5CF A38A
-E5D0 A38B
-E5D1 A38C
-E5D2 A38D
-E5D3 A38E
-E5D4 A38F
-E5D5 A390
-E5D6 A391
-E5D7 A392
-E5D8 A393
-E5D9 A394
-E5DA A395
-E5DB A396
-E5DC A397
-E5DD A398
-E5DE A399
-E5DF A39A
-E5E0 A39B
-E5E1 A39C
-E5E2 A39D
-E5E3 A39E
-E5E4 A39F
-E5E5 A3A0
-E5E6 A440
-E5E7 A441
-E5E8 A442
-E5E9 A443
-E5EA A444
-E5EB A445
-E5EC A446
-E5ED A447
-E5EE A448
-E5EF A449
-E5F0 A44A
-E5F1 A44B
-E5F2 A44C
-E5F3 A44D
-E5F4 A44E
-E5F5 A44F
-E5F6 A450
-E5F7 A451
-E5F8 A452
-E5F9 A453
-E5FA A454
-E5FB A455
-E5FC A456
-E5FD A457
-E5FE A458
-E5FF A459
-E600 A45A
-E601 A45B
-E602 A45C
-E603 A45D
-E604 A45E
-E605 A45F
-E606 A460
-E607 A461
-E608 A462
-E609 A463
-E60A A464
-E60B A465
-E60C A466
-E60D A467
-E60E A468
-E60F A469
-E610 A46A
-E611 A46B
-E612 A46C
-E613 A46D
-E614 A46E
-E615 A46F
-E616 A470
-E617 A471
-E618 A472
-E619 A473
-E61A A474
-E61B A475
-E61C A476
-E61D A477
-E61E A478
-E61F A479
-E620 A47A
-E621 A47B
-E622 A47C
-E623 A47D
-E624 A47E
-E625 A480
-E626 A481
-E627 A482
-E628 A483
-E629 A484
-E62A A485
-E62B A486
-E62C A487
-E62D A488
-E62E A489
-E62F A48A
-E630 A48B
-E631 A48C
-E632 A48D
-E633 A48E
-E634 A48F
-E635 A490
-E636 A491
-E637 A492
-E638 A493
-E639 A494
-E63A A495
-E63B A496
-E63C A497
-E63D A498
-E63E A499
-E63F A49A
-E640 A49B
-E641 A49C
-E642 A49D
-E643 A49E
-E644 A49F
-E645 A4A0
-E646 A540
-E647 A541
-E648 A542
-E649 A543
-E64A A544
-E64B A545
-E64C A546
-E64D A547
-E64E A548
-E64F A549
-E650 A54A
-E651 A54B
-E652 A54C
-E653 A54D
-E654 A54E
-E655 A54F
-E656 A550
-E657 A551
-E658 A552
-E659 A553
-E65A A554
-E65B A555
-E65C A556
-E65D A557
-E65E A558
-E65F A559
-E660 A55A
-E661 A55B
-E662 A55C
-E663 A55D
-E664 A55E
-E665 A55F
-E666 A560
-E667 A561
-E668 A562
-E669 A563
-E66A A564
-E66B A565
-E66C A566
-E66D A567
-E66E A568
-E66F A569
-E670 A56A
-E671 A56B
-E672 A56C
-E673 A56D
-E674 A56E
-E675 A56F
-E676 A570
-E677 A571
-E678 A572
-E679 A573
-E67A A574
-E67B A575
-E67C A576
-E67D A577
-E67E A578
-E67F A579
-E680 A57A
-E681 A57B
-E682 A57C
-E683 A57D
-E684 A57E
-E685 A580
-E686 A581
-E687 A582
-E688 A583
-E689 A584
-E68A A585
-E68B A586
-E68C A587
-E68D A588
-E68E A589
-E68F A58A
-E690 A58B
-E691 A58C
-E692 A58D
-E693 A58E
-E694 A58F
-E695 A590
-E696 A591
-E697 A592
-E698 A593
-E699 A594
-E69A A595
-E69B A596
-E69C A597
-E69D A598
-E69E A599
-E69F A59A
-E6A0 A59B
-E6A1 A59C
-E6A2 A59D
-E6A3 A59E
-E6A4 A59F
-E6A5 A5A0
-E6A6 A640
-E6A7 A641
-E6A8 A642
-E6A9 A643
-E6AA A644
-E6AB A645
-E6AC A646
-E6AD A647
-E6AE A648
-E6AF A649
-E6B0 A64A
-E6B1 A64B
-E6B2 A64C
-E6B3 A64D
-E6B4 A64E
-E6B5 A64F
-E6B6 A650
-E6B7 A651
-E6B8 A652
-E6B9 A653
-E6BA A654
-E6BB A655
-E6BC A656
-E6BD A657
-E6BE A658
-E6BF A659
-E6C0 A65A
-E6C1 A65B
-E6C2 A65C
-E6C3 A65D
-E6C4 A65E
-E6C5 A65F
-E6C6 A660
-E6C7 A661
-E6C8 A662
-E6C9 A663
-E6CA A664
-E6CB A665
-E6CC A666
-E6CD A667
-E6CE A668
-E6CF A669
-E6D0 A66A
-E6D1 A66B
-E6D2 A66C
-E6D3 A66D
-E6D4 A66E
-E6D5 A66F
-E6D6 A670
-E6D7 A671
-E6D8 A672
-E6D9 A673
-E6DA A674
-E6DB A675
-E6DC A676
-E6DD A677
-E6DE A678
-E6DF A679
-E6E0 A67A
-E6E1 A67B
-E6E2 A67C
-E6E3 A67D
-E6E4 A67E
-E6E5 A680
-E6E6 A681
-E6E7 A682
-E6E8 A683
-E6E9 A684
-E6EA A685
-E6EB A686
-E6EC A687
-E6ED A688
-E6EE A689
-E6EF A68A
-E6F0 A68B
-E6F1 A68C
-E6F2 A68D
-E6F3 A68E
-E6F4 A68F
-E6F5 A690
-E6F6 A691
-E6F7 A692
-E6F8 A693
-E6F9 A694
-E6FA A695
-E6FB A696
-E6FC A697
-E6FD A698
-E6FE A699
-E6FF A69A
-E700 A69B
-E701 A69C
-E702 A69D
-E703 A69E
-E704 A69F
-E705 A6A0
-E706 A740
-E707 A741
-E708 A742
-E709 A743
-E70A A744
-E70B A745
-E70C A746
-E70D A747
-E70E A748
-E70F A749
-E710 A74A
-E711 A74B
-E712 A74C
-E713 A74D
-E714 A74E
-E715 A74F
-E716 A750
-E717 A751
-E718 A752
-E719 A753
-E71A A754
-E71B A755
-E71C A756
-E71D A757
-E71E A758
-E71F A759
-E720 A75A
-E721 A75B
-E722 A75C
-E723 A75D
-E724 A75E
-E725 A75F
-E726 A760
-E727 A761
-E728 A762
-E729 A763
-E72A A764
-E72B A765
-E72C A766
-E72D A767
-E72E A768
-E72F A769
-E730 A76A
-E731 A76B
-E732 A76C
-E733 A76D
-E734 A76E
-E735 A76F
-E736 A770
-E737 A771
-E738 A772
-E739 A773
-E73A A774
-E73B A775
-E73C A776
-E73D A777
-E73E A778
-E73F A779
-E740 A77A
-E741 A77B
-E742 A77C
-E743 A77D
-E744 A77E
-E745 A780
-E746 A781
-E747 A782
-E748 A783
-E749 A784
-E74A A785
-E74B A786
-E74C A787
-E74D A788
-E74E A789
-E74F A78A
-E750 A78B
-E751 A78C
-E752 A78D
-E753 A78E
-E754 A78F
-E755 A790
-E756 A791
-E757 A792
-E758 A793
-E759 A794
-E75A A795
-E75B A796
-E75C A797
-E75D A798
-E75E A799
-E75F A79A
-E760 A79B
-E761 A79C
-E762 A79D
-E763 A79E
-E764 A79F
-E765 A7A0
-E766 A2AB
-E767 A2AC
-E768 A2AD
-E769 A2AE
-E76A A2AF
-E76B A2B0
-E76C 8336C739
-E76D A2E4
-E76E A2EF
-E76F A2F0
-E770 A2FD
-E771 A2FE
-E772 A4F4
-E773 A4F5
-E774 A4F6
-E775 A4F7
-E776 A4F8
-E777 A4F9
-E778 A4FA
-E779 A4FB
-E77A A4FC
-E77B A4FD
-E77C A4FE
-E77D A5F7
-E77E A5F8
-E77F A5F9
-E780 A5FA
-E781 A5FB
-E782 A5FC
-E783 A5FD
-E784 A5FE
-E785 A6B9
-E786 A6BA
-E787 A6BB
-E788 A6BC
-E789 A6BD
-E78A A6BE
-E78B A6BF
-E78C A6C0
-E78D A6D9
-E78E A6DA
-E78F A6DB
-E790 A6DC
-E791 A6DD
-E792 A6DE
-E793 A6DF
-E794 A6EC
-E795 A6ED
-E796 A6F3
-E797 A6F6
-E798 A6F7
-E799 A6F8
-E79A A6F9
-E79B A6FA
-E79C A6FB
-E79D A6FC
-E79E A6FD
-E79F A6FE
-E7A0 A7C2
-E7A1 A7C3
-E7A2 A7C4
-E7A3 A7C5
-E7A4 A7C6
-E7A5 A7C7
-E7A6 A7C8
-E7A7 A7C9
-E7A8 A7CA
-E7A9 A7CB
-E7AA A7CC
-E7AB A7CD
-E7AC A7CE
-E7AD A7CF
-E7AE A7D0
-E7AF A7F2
-E7B0 A7F3
-E7B1 A7F4
-E7B2 A7F5
-E7B3 A7F6
-E7B4 A7F7
-E7B5 A7F8
-E7B6 A7F9
-E7B7 A7FA
-E7B8 A7FB
-E7B9 A7FC
-E7BA A7FD
-E7BB A7FE
-E7BC A896
-E7BD A897
-E7BE A898
-E7BF A899
-E7C0 A89A
-E7C1 A89B
-E7C2 A89C
-E7C3 A89D
-E7C4 A89E
-E7C5 A89F
-E7C6 A8A0
-E7C7 A8BC
-E7C8 8336C830
-E7C9 A8C1
-E7CA A8C2
-E7CB A8C3
-E7CC A8C4
-E7CD A8EA
-E7CE A8EB
-E7CF A8EC
-E7D0 A8ED
-E7D1 A8EE
-E7D2 A8EF
-E7D3 A8F0
-E7D4 A8F1
-E7D5 A8F2
-E7D6 A8F3
-E7D7 A8F4
-E7D8 A8F5
-E7D9 A8F6
-E7DA A8F7
-E7DB A8F8
-E7DC A8F9
-E7DD A8FA
-E7DE A8FB
-E7DF A8FC
-E7E0 A8FD
-E7E1 A8FE
-E7E2 A958
-E7E3 A95B
-E7E4 A95D
-E7E5 A95E
-E7E6 A95F
-E7E7 8336C831
-E7E8 8336C832
-E7E9 8336C833
-E7EA 8336C834
-E7EB 8336C835
-E7EC 8336C836
-E7ED 8336C837
-E7EE 8336C838
-E7EF 8336C839
-E7F0 8336C930
-E7F1 8336C931
-E7F2 8336C932
-E7F3 8336C933
-E7F4 A997
-E7F5 A998
-E7F6 A999
-E7F7 A99A
-E7F8 A99B
-E7F9 A99C
-E7FA A99D
-E7FB A99E
-E7FC A99F
-E7FD A9A0
-E7FE A9A1
-E7FF A9A2
-E800 A9A3
-E801 A9F0
-E802 A9F1
-E803 A9F2
-E804 A9F3
-E805 A9F4
-E806 A9F5
-E807 A9F6
-E808 A9F7
-E809 A9F8
-E80A A9F9
-E80B A9FA
-E80C A9FB
-E80D A9FC
-E80E A9FD
-E80F A9FE
-E810 D7FA
-E811 D7FB
-E812 D7FC
-E813 D7FD
-E814 D7FE
-E815 8336C934
-E816 FE51
-E817 FE52
-E818 FE53
-E819 8336C935
-E81A 8336C936
-E81B 8336C937
-E81C 8336C938
-E81D 8336C939
-E81E FE59
-E81F 8336CA30
-E820 8336CA31
-E821 8336CA32
-E822 8336CA33
-E823 8336CA34
-E824 8336CA35
-E825 8336CA36
-E826 FE61
-E827 8336CA37
-E828 8336CA38
-E829 8336CA39
-E82A 8336CB30
-E82B FE66
-E82C FE67
-E82D 8336CB31
-E82E 8336CB32
-E82F 8336CB33
-E830 8336CB34
-E831 FE6C
-E832 FE6D
-E833 8336CB35
-E834 8336CB36
-E835 8336CB37
-E836 8336CB38
-E837 8336CB39
-E838 8336CC30
-E839 8336CC31
-E83A 8336CC32
-E83B FE76
-E83C 8336CC33
-E83D 8336CC34
-E83E 8336CC35
-E83F 8336CC36
-E840 8336CC37
-E841 8336CC38
-E842 8336CC39
-E843 FE7E
-E844 8336CD30
-E845 8336CD31
-E846 8336CD32
-E847 8336CD33
-E848 8336CD34
-E849 8336CD35
-E84A 8336CD36
-E84B 8336CD37
-E84C 8336CD38
-E84D 8336CD39
-E84E 8336CE30
-E84F 8336CE31
-E850 8336CE32
-E851 8336CE33
-E852 8336CE34
-E853 8336CE35
-E854 FE90
-E855 FE91
-E856 8336CE36
-E857 8336CE37
-E858 8336CE38
-E859 8336CE39
-E85A 8336CF30
-E85B 8336CF31
-E85C 8336CF32
-E85D 8336CF33
-E85E 8336CF34
-E85F 8336CF35
-E860 8336CF36
-E861 8336CF37
-E862 8336CF38
-E863 8336CF39
-E864 FEA0
-E865 8336D030
-E866 8336D031
-E867 8336D032
-E868 8336D033
-E869 8336D034
-E86A 8336D035
-E86B 8336D036
-E86C 8336D037
-E86D 8336D038
-E86E 8336D039
-E86F 8336D130
-E870 8336D131
-E871 8336D132
-E872 8336D133
-E873 8336D134
-E874 8336D135
-E875 8336D136
-E876 8336D137
-E877 8336D138
-E878 8336D139
-E879 8336D230
-E87A 8336D231
-E87B 8336D232
-E87C 8336D233
-E87D 8336D234
-E87E 8336D235
-E87F 8336D236
-E880 8336D237
-E881 8336D238
-E882 8336D239
-E883 8336D330
-E884 8336D331
-E885 8336D332
-E886 8336D333
-E887 8336D334
-E888 8336D335
-E889 8336D336
-E88A 8336D337
-E88B 8336D338
-E88C 8336D339
-E88D 8336D430
-E88E 8336D431
-E88F 8336D432
-E890 8336D433
-E891 8336D434
-E892 8336D435
-E893 8336D436
-E894 8336D437
-E895 8336D438
-E896 8336D439
-E897 8336D530
-E898 8336D531
-E899 8336D532
-E89A 8336D533
-E89B 8336D534
-E89C 8336D535
-E89D 8336D536
-E89E 8336D537
-E89F 8336D538
-E8A0 8336D539
-E8A1 8336D630
-E8A2 8336D631
-E8A3 8336D632
-E8A4 8336D633
-E8A5 8336D634
-E8A6 8336D635
-E8A7 8336D636
-E8A8 8336D637
-E8A9 8336D638
-E8AA 8336D639
-E8AB 8336D730
-E8AC 8336D731
-E8AD 8336D732
-E8AE 8336D733
-E8AF 8336D734
-E8B0 8336D735
-E8B1 8336D736
-E8B2 8336D737
-E8B3 8336D738
-E8B4 8336D739
-E8B5 8336D830
-E8B6 8336D831
-E8B7 8336D832
-E8B8 8336D833
-E8B9 8336D834
-E8BA 8336D835
-E8BB 8336D836
-E8BC 8336D837
-E8BD 8336D838
-E8BE 8336D839
-E8BF 8336D930
-E8C0 8336D931
-E8C1 8336D932
-E8C2 8336D933
-E8C3 8336D934
-E8C4 8336D935
-E8C5 8336D936
-E8C6 8336D937
-E8C7 8336D938
-E8C8 8336D939
-E8C9 8336DA30
-E8CA 8336DA31
-E8CB 8336DA32
-E8CC 8336DA33
-E8CD 8336DA34
-E8CE 8336DA35
-E8CF 8336DA36
-E8D0 8336DA37
-E8D1 8336DA38
-E8D2 8336DA39
-E8D3 8336DB30
-E8D4 8336DB31
-E8D5 8336DB32
-E8D6 8336DB33
-E8D7 8336DB34
-E8D8 8336DB35
-E8D9 8336DB36
-E8DA 8336DB37
-E8DB 8336DB38
-E8DC 8336DB39
-E8DD 8336DC30
-E8DE 8336DC31
-E8DF 8336DC32
-E8E0 8336DC33
-E8E1 8336DC34
-E8E2 8336DC35
-E8E3 8336DC36
-E8E4 8336DC37
-E8E5 8336DC38
-E8E6 8336DC39
-E8E7 8336DD30
-E8E8 8336DD31
-E8E9 8336DD32
-E8EA 8336DD33
-E8EB 8336DD34
-E8EC 8336DD35
-E8ED 8336DD36
-E8EE 8336DD37
-E8EF 8336DD38
-E8F0 8336DD39
-E8F1 8336DE30
-E8F2 8336DE31
-E8F3 8336DE32
-E8F4 8336DE33
-E8F5 8336DE34
-E8F6 8336DE35
-E8F7 8336DE36
-E8F8 8336DE37
-E8F9 8336DE38
-E8FA 8336DE39
-E8FB 8336DF30
-E8FC 8336DF31
-E8FD 8336DF32
-E8FE 8336DF33
-E8FF 8336DF34
-E900 8336DF35
-E901 8336DF36
-E902 8336DF37
-E903 8336DF38
-E904 8336DF39
-E905 8336E030
-E906 8336E031
-E907 8336E032
-E908 8336E033
-E909 8336E034
-E90A 8336E035
-E90B 8336E036
-E90C 8336E037
-E90D 8336E038
-E90E 8336E039
-E90F 8336E130
-E910 8336E131
-E911 8336E132
-E912 8336E133
-E913 8336E134
-E914 8336E135
-E915 8336E136
-E916 8336E137
-E917 8336E138
-E918 8336E139
-E919 8336E230
-E91A 8336E231
-E91B 8336E232
-E91C 8336E233
-E91D 8336E234
-E91E 8336E235
-E91F 8336E236
-E920 8336E237
-E921 8336E238
-E922 8336E239
-E923 8336E330
-E924 8336E331
-E925 8336E332
-E926 8336E333
-E927 8336E334
-E928 8336E335
-E929 8336E336
-E92A 8336E337
-E92B 8336E338
-E92C 8336E339
-E92D 8336E430
-E92E 8336E431
-E92F 8336E432
-E930 8336E433
-E931 8336E434
-E932 8336E435
-E933 8336E436
-E934 8336E437
-E935 8336E438
-E936 8336E439
-E937 8336E530
-E938 8336E531
-E939 8336E532
-E93A 8336E533
-E93B 8336E534
-E93C 8336E535
-E93D 8336E536
-E93E 8336E537
-E93F 8336E538
-E940 8336E539
-E941 8336E630
-E942 8336E631
-E943 8336E632
-E944 8336E633
-E945 8336E634
-E946 8336E635
-E947 8336E636
-E948 8336E637
-E949 8336E638
-E94A 8336E639
-E94B 8336E730
-E94C 8336E731
-E94D 8336E732
-E94E 8336E733
-E94F 8336E734
-E950 8336E735
-E951 8336E736
-E952 8336E737
-E953 8336E738
-E954 8336E739
-E955 8336E830
-E956 8336E831
-E957 8336E832
-E958 8336E833
-E959 8336E834
-E95A 8336E835
-E95B 8336E836
-E95C 8336E837
-E95D 8336E838
-E95E 8336E839
-E95F 8336E930
-E960 8336E931
-E961 8336E932
-E962 8336E933
-E963 8336E934
-E964 8336E935
-E965 8336E936
-E966 8336E937
-E967 8336E938
-E968 8336E939
-E969 8336EA30
-E96A 8336EA31
-E96B 8336EA32
-E96C 8336EA33
-E96D 8336EA34
-E96E 8336EA35
-E96F 8336EA36
-E970 8336EA37
-E971 8336EA38
-E972 8336EA39
-E973 8336EB30
-E974 8336EB31
-E975 8336EB32
-E976 8336EB33
-E977 8336EB34
-E978 8336EB35
-E979 8336EB36
-E97A 8336EB37
-E97B 8336EB38
-E97C 8336EB39
-E97D 8336EC30
-E97E 8336EC31
-E97F 8336EC32
-E980 8336EC33
-E981 8336EC34
-E982 8336EC35
-E983 8336EC36
-E984 8336EC37
-E985 8336EC38
-E986 8336EC39
-E987 8336ED30
-E988 8336ED31
-E989 8336ED32
-E98A 8336ED33
-E98B 8336ED34
-E98C 8336ED35
-E98D 8336ED36
-E98E 8336ED37
-E98F 8336ED38
-E990 8336ED39
-E991 8336EE30
-E992 8336EE31
-E993 8336EE32
-E994 8336EE33
-E995 8336EE34
-E996 8336EE35
-E997 8336EE36
-E998 8336EE37
-E999 8336EE38
-E99A 8336EE39
-E99B 8336EF30
-E99C 8336EF31
-E99D 8336EF32
-E99E 8336EF33
-E99F 8336EF34
-E9A0 8336EF35
-E9A1 8336EF36
-E9A2 8336EF37
-E9A3 8336EF38
-E9A4 8336EF39
-E9A5 8336F030
-E9A6 8336F031
-E9A7 8336F032
-E9A8 8336F033
-E9A9 8336F034
-E9AA 8336F035
-E9AB 8336F036
-E9AC 8336F037
-E9AD 8336F038
-E9AE 8336F039
-E9AF 8336F130
-E9B0 8336F131
-E9B1 8336F132
-E9B2 8336F133
-E9B3 8336F134
-E9B4 8336F135
-E9B5 8336F136
-E9B6 8336F137
-E9B7 8336F138
-E9B8 8336F139
-E9B9 8336F230
-E9BA 8336F231
-E9BB 8336F232
-E9BC 8336F233
-E9BD 8336F234
-E9BE 8336F235
-E9BF 8336F236
-E9C0 8336F237
-E9C1 8336F238
-E9C2 8336F239
-E9C3 8336F330
-E9C4 8336F331
-E9C5 8336F332
-E9C6 8336F333
-E9C7 8336F334
-E9C8 8336F335
-E9C9 8336F336
-E9CA 8336F337
-E9CB 8336F338
-E9CC 8336F339
-E9CD 8336F430
-E9CE 8336F431
-E9CF 8336F432
-E9D0 8336F433
-E9D1 8336F434
-E9D2 8336F435
-E9D3 8336F436
-E9D4 8336F437
-E9D5 8336F438
-E9D6 8336F439
-E9D7 8336F530
-E9D8 8336F531
-E9D9 8336F532
-E9DA 8336F533
-E9DB 8336F534
-E9DC 8336F535
-E9DD 8336F536
-E9DE 8336F537
-E9DF 8336F538
-E9E0 8336F539
-E9E1 8336F630
-E9E2 8336F631
-E9E3 8336F632
-E9E4 8336F633
-E9E5 8336F634
-E9E6 8336F635
-E9E7 8336F636
-E9E8 8336F637
-E9E9 8336F638
-E9EA 8336F639
-E9EB 8336F730
-E9EC 8336F731
-E9ED 8336F732
-E9EE 8336F733
-E9EF 8336F734
-E9F0 8336F735
-E9F1 8336F736
-E9F2 8336F737
-E9F3 8336F738
-E9F4 8336F739
-E9F5 8336F830
-E9F6 8336F831
-E9F7 8336F832
-E9F8 8336F833
-E9F9 8336F834
-E9FA 8336F835
-E9FB 8336F836
-E9FC 8336F837
-E9FD 8336F838
-E9FE 8336F839
-E9FF 8336F930
-EA00 8336F931
-EA01 8336F932
-EA02 8336F933
-EA03 8336F934
-EA04 8336F935
-EA05 8336F936
-EA06 8336F937
-EA07 8336F938
-EA08 8336F939
-EA09 8336FA30
-EA0A 8336FA31
-EA0B 8336FA32
-EA0C 8336FA33
-EA0D 8336FA34
-EA0E 8336FA35
-EA0F 8336FA36
-EA10 8336FA37
-EA11 8336FA38
-EA12 8336FA39
-EA13 8336FB30
-EA14 8336FB31
-EA15 8336FB32
-EA16 8336FB33
-EA17 8336FB34
-EA18 8336FB35
-EA19 8336FB36
-EA1A 8336FB37
-EA1B 8336FB38
-EA1C 8336FB39
-EA1D 8336FC30
-EA1E 8336FC31
-EA1F 8336FC32
-EA20 8336FC33
-EA21 8336FC34
-EA22 8336FC35
-EA23 8336FC36
-EA24 8336FC37
-EA25 8336FC38
-EA26 8336FC39
-EA27 8336FD30
-EA28 8336FD31
-EA29 8336FD32
-EA2A 8336FD33
-EA2B 8336FD34
-EA2C 8336FD35
-EA2D 8336FD36
-EA2E 8336FD37
-EA2F 8336FD38
-EA30 8336FD39
-EA31 8336FE30
-EA32 8336FE31
-EA33 8336FE32
-EA34 8336FE33
-EA35 8336FE34
-EA36 8336FE35
-EA37 8336FE36
-EA38 8336FE37
-EA39 8336FE38
-EA3A 8336FE39
-EA3B 83378130
-EA3C 83378131
-EA3D 83378132
-EA3E 83378133
-EA3F 83378134
-EA40 83378135
-EA41 83378136
-EA42 83378137
-EA43 83378138
-EA44 83378139
-EA45 83378230
-EA46 83378231
-EA47 83378232
-EA48 83378233
-EA49 83378234
-EA4A 83378235
-EA4B 83378236
-EA4C 83378237
-EA4D 83378238
-EA4E 83378239
-EA4F 83378330
-EA50 83378331
-EA51 83378332
-EA52 83378333
-EA53 83378334
-EA54 83378335
-EA55 83378336
-EA56 83378337
-EA57 83378338
-EA58 83378339
-EA59 83378430
-EA5A 83378431
-EA5B 83378432
-EA5C 83378433
-EA5D 83378434
-EA5E 83378435
-EA5F 83378436
-EA60 83378437
-EA61 83378438
-EA62 83378439
-EA63 83378530
-EA64 83378531
-EA65 83378532
-EA66 83378533
-EA67 83378534
-EA68 83378535
-EA69 83378536
-EA6A 83378537
-EA6B 83378538
-EA6C 83378539
-EA6D 83378630
-EA6E 83378631
-EA6F 83378632
-EA70 83378633
-EA71 83378634
-EA72 83378635
-EA73 83378636
-EA74 83378637
-EA75 83378638
-EA76 83378639
-EA77 83378730
-EA78 83378731
-EA79 83378732
-EA7A 83378733
-EA7B 83378734
-EA7C 83378735
-EA7D 83378736
-EA7E 83378737
-EA7F 83378738
-EA80 83378739
-EA81 83378830
-EA82 83378831
-EA83 83378832
-EA84 83378833
-EA85 83378834
-EA86 83378835
-EA87 83378836
-EA88 83378837
-EA89 83378838
-EA8A 83378839
-EA8B 83378930
-EA8C 83378931
-EA8D 83378932
-EA8E 83378933
-EA8F 83378934
-EA90 83378935
-EA91 83378936
-EA92 83378937
-EA93 83378938
-EA94 83378939
-EA95 83378A30
-EA96 83378A31
-EA97 83378A32
-EA98 83378A33
-EA99 83378A34
-EA9A 83378A35
-EA9B 83378A36
-EA9C 83378A37
-EA9D 83378A38
-EA9E 83378A39
-EA9F 83378B30
-EAA0 83378B31
-EAA1 83378B32
-EAA2 83378B33
-EAA3 83378B34
-EAA4 83378B35
-EAA5 83378B36
-EAA6 83378B37
-EAA7 83378B38
-EAA8 83378B39
-EAA9 83378C30
-EAAA 83378C31
-EAAB 83378C32
-EAAC 83378C33
-EAAD 83378C34
-EAAE 83378C35
-EAAF 83378C36
-EAB0 83378C37
-EAB1 83378C38
-EAB2 83378C39
-EAB3 83378D30
-EAB4 83378D31
-EAB5 83378D32
-EAB6 83378D33
-EAB7 83378D34
-EAB8 83378D35
-EAB9 83378D36
-EABA 83378D37
-EABB 83378D38
-EABC 83378D39
-EABD 83378E30
-EABE 83378E31
-EABF 83378E32
-EAC0 83378E33
-EAC1 83378E34
-EAC2 83378E35
-EAC3 83378E36
-EAC4 83378E37
-EAC5 83378E38
-EAC6 83378E39
-EAC7 83378F30
-EAC8 83378F31
-EAC9 83378F32
-EACA 83378F33
-EACB 83378F34
-EACC 83378F35
-EACD 83378F36
-EACE 83378F37
-EACF 83378F38
-EAD0 83378F39
-EAD1 83379030
-EAD2 83379031
-EAD3 83379032
-EAD4 83379033
-EAD5 83379034
-EAD6 83379035
-EAD7 83379036
-EAD8 83379037
-EAD9 83379038
-EADA 83379039
-EADB 83379130
-EADC 83379131
-EADD 83379132
-EADE 83379133
-EADF 83379134
-EAE0 83379135
-EAE1 83379136
-EAE2 83379137
-EAE3 83379138
-EAE4 83379139
-EAE5 83379230
-EAE6 83379231
-EAE7 83379232
-EAE8 83379233
-EAE9 83379234
-EAEA 83379235
-EAEB 83379236
-EAEC 83379237
-EAED 83379238
-EAEE 83379239
-EAEF 83379330
-EAF0 83379331
-EAF1 83379332
-EAF2 83379333
-EAF3 83379334
-EAF4 83379335
-EAF5 83379336
-EAF6 83379337
-EAF7 83379338
-EAF8 83379339
-EAF9 83379430
-EAFA 83379431
-EAFB 83379432
-EAFC 83379433
-EAFD 83379434
-EAFE 83379435
-EAFF 83379436
-EB00 83379437
-EB01 83379438
-EB02 83379439
-EB03 83379530
-EB04 83379531
-EB05 83379532
-EB06 83379533
-EB07 83379534
-EB08 83379535
-EB09 83379536
-EB0A 83379537
-EB0B 83379538
-EB0C 83379539
-EB0D 83379630
-EB0E 83379631
-EB0F 83379632
-EB10 83379633
-EB11 83379634
-EB12 83379635
-EB13 83379636
-EB14 83379637
-EB15 83379638
-EB16 83379639
-EB17 83379730
-EB18 83379731
-EB19 83379732
-EB1A 83379733
-EB1B 83379734
-EB1C 83379735
-EB1D 83379736
-EB1E 83379737
-EB1F 83379738
-EB20 83379739
-EB21 83379830
-EB22 83379831
-EB23 83379832
-EB24 83379833
-EB25 83379834
-EB26 83379835
-EB27 83379836
-EB28 83379837
-EB29 83379838
-EB2A 83379839
-EB2B 83379930
-EB2C 83379931
-EB2D 83379932
-EB2E 83379933
-EB2F 83379934
-EB30 83379935
-EB31 83379936
-EB32 83379937
-EB33 83379938
-EB34 83379939
-EB35 83379A30
-EB36 83379A31
-EB37 83379A32
-EB38 83379A33
-EB39 83379A34
-EB3A 83379A35
-EB3B 83379A36
-EB3C 83379A37
-EB3D 83379A38
-EB3E 83379A39
-EB3F 83379B30
-EB40 83379B31
-EB41 83379B32
-EB42 83379B33
-EB43 83379B34
-EB44 83379B35
-EB45 83379B36
-EB46 83379B37
-EB47 83379B38
-EB48 83379B39
-EB49 83379C30
-EB4A 83379C31
-EB4B 83379C32
-EB4C 83379C33
-EB4D 83379C34
-EB4E 83379C35
-EB4F 83379C36
-EB50 83379C37
-EB51 83379C38
-EB52 83379C39
-EB53 83379D30
-EB54 83379D31
-EB55 83379D32
-EB56 83379D33
-EB57 83379D34
-EB58 83379D35
-EB59 83379D36
-EB5A 83379D37
-EB5B 83379D38
-EB5C 83379D39
-EB5D 83379E30
-EB5E 83379E31
-EB5F 83379E32
-EB60 83379E33
-EB61 83379E34
-EB62 83379E35
-EB63 83379E36
-EB64 83379E37
-EB65 83379E38
-EB66 83379E39
-EB67 83379F30
-EB68 83379F31
-EB69 83379F32
-EB6A 83379F33
-EB6B 83379F34
-EB6C 83379F35
-EB6D 83379F36
-EB6E 83379F37
-EB6F 83379F38
-EB70 83379F39
-EB71 8337A030
-EB72 8337A031
-EB73 8337A032
-EB74 8337A033
-EB75 8337A034
-EB76 8337A035
-EB77 8337A036
-EB78 8337A037
-EB79 8337A038
-EB7A 8337A039
-EB7B 8337A130
-EB7C 8337A131
-EB7D 8337A132
-EB7E 8337A133
-EB7F 8337A134
-EB80 8337A135
-EB81 8337A136
-EB82 8337A137
-EB83 8337A138
-EB84 8337A139
-EB85 8337A230
-EB86 8337A231
-EB87 8337A232
-EB88 8337A233
-EB89 8337A234
-EB8A 8337A235
-EB8B 8337A236
-EB8C 8337A237
-EB8D 8337A238
-EB8E 8337A239
-EB8F 8337A330
-EB90 8337A331
-EB91 8337A332
-EB92 8337A333
-EB93 8337A334
-EB94 8337A335
-EB95 8337A336
-EB96 8337A337
-EB97 8337A338
-EB98 8337A339
-EB99 8337A430
-EB9A 8337A431
-EB9B 8337A432
-EB9C 8337A433
-EB9D 8337A434
-EB9E 8337A435
-EB9F 8337A436
-EBA0 8337A437
-EBA1 8337A438
-EBA2 8337A439
-EBA3 8337A530
-EBA4 8337A531
-EBA5 8337A532
-EBA6 8337A533
-EBA7 8337A534
-EBA8 8337A535
-EBA9 8337A536
-EBAA 8337A537
-EBAB 8337A538
-EBAC 8337A539
-EBAD 8337A630
-EBAE 8337A631
-EBAF 8337A632
-EBB0 8337A633
-EBB1 8337A634
-EBB2 8337A635
-EBB3 8337A636
-EBB4 8337A637
-EBB5 8337A638
-EBB6 8337A639
-EBB7 8337A730
-EBB8 8337A731
-EBB9 8337A732
-EBBA 8337A733
-EBBB 8337A734
-EBBC 8337A735
-EBBD 8337A736
-EBBE 8337A737
-EBBF 8337A738
-EBC0 8337A739
-EBC1 8337A830
-EBC2 8337A831
-EBC3 8337A832
-EBC4 8337A833
-EBC5 8337A834
-EBC6 8337A835
-EBC7 8337A836
-EBC8 8337A837
-EBC9 8337A838
-EBCA 8337A839
-EBCB 8337A930
-EBCC 8337A931
-EBCD 8337A932
-EBCE 8337A933
-EBCF 8337A934
-EBD0 8337A935
-EBD1 8337A936
-EBD2 8337A937
-EBD3 8337A938
-EBD4 8337A939
-EBD5 8337AA30
-EBD6 8337AA31
-EBD7 8337AA32
-EBD8 8337AA33
-EBD9 8337AA34
-EBDA 8337AA35
-EBDB 8337AA36
-EBDC 8337AA37
-EBDD 8337AA38
-EBDE 8337AA39
-EBDF 8337AB30
-EBE0 8337AB31
-EBE1 8337AB32
-EBE2 8337AB33
-EBE3 8337AB34
-EBE4 8337AB35
-EBE5 8337AB36
-EBE6 8337AB37
-EBE7 8337AB38
-EBE8 8337AB39
-EBE9 8337AC30
-EBEA 8337AC31
-EBEB 8337AC32
-EBEC 8337AC33
-EBED 8337AC34
-EBEE 8337AC35
-EBEF 8337AC36
-EBF0 8337AC37
-EBF1 8337AC38
-EBF2 8337AC39
-EBF3 8337AD30
-EBF4 8337AD31
-EBF5 8337AD32
-EBF6 8337AD33
-EBF7 8337AD34
-EBF8 8337AD35
-EBF9 8337AD36
-EBFA 8337AD37
-EBFB 8337AD38
-EBFC 8337AD39
-EBFD 8337AE30
-EBFE 8337AE31
-EBFF 8337AE32
-EC00 8337AE33
-EC01 8337AE34
-EC02 8337AE35
-EC03 8337AE36
-EC04 8337AE37
-EC05 8337AE38
-EC06 8337AE39
-EC07 8337AF30
-EC08 8337AF31
-EC09 8337AF32
-EC0A 8337AF33
-EC0B 8337AF34
-EC0C 8337AF35
-EC0D 8337AF36
-EC0E 8337AF37
-EC0F 8337AF38
-EC10 8337AF39
-EC11 8337B030
-EC12 8337B031
-EC13 8337B032
-EC14 8337B033
-EC15 8337B034
-EC16 8337B035
-EC17 8337B036
-EC18 8337B037
-EC19 8337B038
-EC1A 8337B039
-EC1B 8337B130
-EC1C 8337B131
-EC1D 8337B132
-EC1E 8337B133
-EC1F 8337B134
-EC20 8337B135
-EC21 8337B136
-EC22 8337B137
-EC23 8337B138
-EC24 8337B139
-EC25 8337B230
-EC26 8337B231
-EC27 8337B232
-EC28 8337B233
-EC29 8337B234
-EC2A 8337B235
-EC2B 8337B236
-EC2C 8337B237
-EC2D 8337B238
-EC2E 8337B239
-EC2F 8337B330
-EC30 8337B331
-EC31 8337B332
-EC32 8337B333
-EC33 8337B334
-EC34 8337B335
-EC35 8337B336
-EC36 8337B337
-EC37 8337B338
-EC38 8337B339
-EC39 8337B430
-EC3A 8337B431
-EC3B 8337B432
-EC3C 8337B433
-EC3D 8337B434
-EC3E 8337B435
-EC3F 8337B436
-EC40 8337B437
-EC41 8337B438
-EC42 8337B439
-EC43 8337B530
-EC44 8337B531
-EC45 8337B532
-EC46 8337B533
-EC47 8337B534
-EC48 8337B535
-EC49 8337B536
-EC4A 8337B537
-EC4B 8337B538
-EC4C 8337B539
-EC4D 8337B630
-EC4E 8337B631
-EC4F 8337B632
-EC50 8337B633
-EC51 8337B634
-EC52 8337B635
-EC53 8337B636
-EC54 8337B637
-EC55 8337B638
-EC56 8337B639
-EC57 8337B730
-EC58 8337B731
-EC59 8337B732
-EC5A 8337B733
-EC5B 8337B734
-EC5C 8337B735
-EC5D 8337B736
-EC5E 8337B737
-EC5F 8337B738
-EC60 8337B739
-EC61 8337B830
-EC62 8337B831
-EC63 8337B832
-EC64 8337B833
-EC65 8337B834
-EC66 8337B835
-EC67 8337B836
-EC68 8337B837
-EC69 8337B838
-EC6A 8337B839
-EC6B 8337B930
-EC6C 8337B931
-EC6D 8337B932
-EC6E 8337B933
-EC6F 8337B934
-EC70 8337B935
-EC71 8337B936
-EC72 8337B937
-EC73 8337B938
-EC74 8337B939
-EC75 8337BA30
-EC76 8337BA31
-EC77 8337BA32
-EC78 8337BA33
-EC79 8337BA34
-EC7A 8337BA35
-EC7B 8337BA36
-EC7C 8337BA37
-EC7D 8337BA38
-EC7E 8337BA39
-EC7F 8337BB30
-EC80 8337BB31
-EC81 8337BB32
-EC82 8337BB33
-EC83 8337BB34
-EC84 8337BB35
-EC85 8337BB36
-EC86 8337BB37
-EC87 8337BB38
-EC88 8337BB39
-EC89 8337BC30
-EC8A 8337BC31
-EC8B 8337BC32
-EC8C 8337BC33
-EC8D 8337BC34
-EC8E 8337BC35
-EC8F 8337BC36
-EC90 8337BC37
-EC91 8337BC38
-EC92 8337BC39
-EC93 8337BD30
-EC94 8337BD31
-EC95 8337BD32
-EC96 8337BD33
-EC97 8337BD34
-EC98 8337BD35
-EC99 8337BD36
-EC9A 8337BD37
-EC9B 8337BD38
-EC9C 8337BD39
-EC9D 8337BE30
-EC9E 8337BE31
-EC9F 8337BE32
-ECA0 8337BE33
-ECA1 8337BE34
-ECA2 8337BE35
-ECA3 8337BE36
-ECA4 8337BE37
-ECA5 8337BE38
-ECA6 8337BE39
-ECA7 8337BF30
-ECA8 8337BF31
-ECA9 8337BF32
-ECAA 8337BF33
-ECAB 8337BF34
-ECAC 8337BF35
-ECAD 8337BF36
-ECAE 8337BF37
-ECAF 8337BF38
-ECB0 8337BF39
-ECB1 8337C030
-ECB2 8337C031
-ECB3 8337C032
-ECB4 8337C033
-ECB5 8337C034
-ECB6 8337C035
-ECB7 8337C036
-ECB8 8337C037
-ECB9 8337C038
-ECBA 8337C039
-ECBB 8337C130
-ECBC 8337C131
-ECBD 8337C132
-ECBE 8337C133
-ECBF 8337C134
-ECC0 8337C135
-ECC1 8337C136
-ECC2 8337C137
-ECC3 8337C138
-ECC4 8337C139
-ECC5 8337C230
-ECC6 8337C231
-ECC7 8337C232
-ECC8 8337C233
-ECC9 8337C234
-ECCA 8337C235
-ECCB 8337C236
-ECCC 8337C237
-ECCD 8337C238
-ECCE 8337C239
-ECCF 8337C330
-ECD0 8337C331
-ECD1 8337C332
-ECD2 8337C333
-ECD3 8337C334
-ECD4 8337C335
-ECD5 8337C336
-ECD6 8337C337
-ECD7 8337C338
-ECD8 8337C339
-ECD9 8337C430
-ECDA 8337C431
-ECDB 8337C432
-ECDC 8337C433
-ECDD 8337C434
-ECDE 8337C435
-ECDF 8337C436
-ECE0 8337C437
-ECE1 8337C438
-ECE2 8337C439
-ECE3 8337C530
-ECE4 8337C531
-ECE5 8337C532
-ECE6 8337C533
-ECE7 8337C534
-ECE8 8337C535
-ECE9 8337C536
-ECEA 8337C537
-ECEB 8337C538
-ECEC 8337C539
-ECED 8337C630
-ECEE 8337C631
-ECEF 8337C632
-ECF0 8337C633
-ECF1 8337C634
-ECF2 8337C635
-ECF3 8337C636
-ECF4 8337C637
-ECF5 8337C638
-ECF6 8337C639
-ECF7 8337C730
-ECF8 8337C731
-ECF9 8337C732
-ECFA 8337C733
-ECFB 8337C734
-ECFC 8337C735
-ECFD 8337C736
-ECFE 8337C737
-ECFF 8337C738
-ED00 8337C739
-ED01 8337C830
-ED02 8337C831
-ED03 8337C832
-ED04 8337C833
-ED05 8337C834
-ED06 8337C835
-ED07 8337C836
-ED08 8337C837
-ED09 8337C838
-ED0A 8337C839
-ED0B 8337C930
-ED0C 8337C931
-ED0D 8337C932
-ED0E 8337C933
-ED0F 8337C934
-ED10 8337C935
-ED11 8337C936
-ED12 8337C937
-ED13 8337C938
-ED14 8337C939
-ED15 8337CA30
-ED16 8337CA31
-ED17 8337CA32
-ED18 8337CA33
-ED19 8337CA34
-ED1A 8337CA35
-ED1B 8337CA36
-ED1C 8337CA37
-ED1D 8337CA38
-ED1E 8337CA39
-ED1F 8337CB30
-ED20 8337CB31
-ED21 8337CB32
-ED22 8337CB33
-ED23 8337CB34
-ED24 8337CB35
-ED25 8337CB36
-ED26 8337CB37
-ED27 8337CB38
-ED28 8337CB39
-ED29 8337CC30
-ED2A 8337CC31
-ED2B 8337CC32
-ED2C 8337CC33
-ED2D 8337CC34
-ED2E 8337CC35
-ED2F 8337CC36
-ED30 8337CC37
-ED31 8337CC38
-ED32 8337CC39
-ED33 8337CD30
-ED34 8337CD31
-ED35 8337CD32
-ED36 8337CD33
-ED37 8337CD34
-ED38 8337CD35
-ED39 8337CD36
-ED3A 8337CD37
-ED3B 8337CD38
-ED3C 8337CD39
-ED3D 8337CE30
-ED3E 8337CE31
-ED3F 8337CE32
-ED40 8337CE33
-ED41 8337CE34
-ED42 8337CE35
-ED43 8337CE36
-ED44 8337CE37
-ED45 8337CE38
-ED46 8337CE39
-ED47 8337CF30
-ED48 8337CF31
-ED49 8337CF32
-ED4A 8337CF33
-ED4B 8337CF34
-ED4C 8337CF35
-ED4D 8337CF36
-ED4E 8337CF37
-ED4F 8337CF38
-ED50 8337CF39
-ED51 8337D030
-ED52 8337D031
-ED53 8337D032
-ED54 8337D033
-ED55 8337D034
-ED56 8337D035
-ED57 8337D036
-ED58 8337D037
-ED59 8337D038
-ED5A 8337D039
-ED5B 8337D130
-ED5C 8337D131
-ED5D 8337D132
-ED5E 8337D133
-ED5F 8337D134
-ED60 8337D135
-ED61 8337D136
-ED62 8337D137
-ED63 8337D138
-ED64 8337D139
-ED65 8337D230
-ED66 8337D231
-ED67 8337D232
-ED68 8337D233
-ED69 8337D234
-ED6A 8337D235
-ED6B 8337D236
-ED6C 8337D237
-ED6D 8337D238
-ED6E 8337D239
-ED6F 8337D330
-ED70 8337D331
-ED71 8337D332
-ED72 8337D333
-ED73 8337D334
-ED74 8337D335
-ED75 8337D336
-ED76 8337D337
-ED77 8337D338
-ED78 8337D339
-ED79 8337D430
-ED7A 8337D431
-ED7B 8337D432
-ED7C 8337D433
-ED7D 8337D434
-ED7E 8337D435
-ED7F 8337D436
-ED80 8337D437
-ED81 8337D438
-ED82 8337D439
-ED83 8337D530
-ED84 8337D531
-ED85 8337D532
-ED86 8337D533
-ED87 8337D534
-ED88 8337D535
-ED89 8337D536
-ED8A 8337D537
-ED8B 8337D538
-ED8C 8337D539
-ED8D 8337D630
-ED8E 8337D631
-ED8F 8337D632
-ED90 8337D633
-ED91 8337D634
-ED92 8337D635
-ED93 8337D636
-ED94 8337D637
-ED95 8337D638
-ED96 8337D639
-ED97 8337D730
-ED98 8337D731
-ED99 8337D732
-ED9A 8337D733
-ED9B 8337D734
-ED9C 8337D735
-ED9D 8337D736
-ED9E 8337D737
-ED9F 8337D738
-EDA0 8337D739
-EDA1 8337D830
-EDA2 8337D831
-EDA3 8337D832
-EDA4 8337D833
-EDA5 8337D834
-EDA6 8337D835
-EDA7 8337D836
-EDA8 8337D837
-EDA9 8337D838
-EDAA 8337D839
-EDAB 8337D930
-EDAC 8337D931
-EDAD 8337D932
-EDAE 8337D933
-EDAF 8337D934
-EDB0 8337D935
-EDB1 8337D936
-EDB2 8337D937
-EDB3 8337D938
-EDB4 8337D939
-EDB5 8337DA30
-EDB6 8337DA31
-EDB7 8337DA32
-EDB8 8337DA33
-EDB9 8337DA34
-EDBA 8337DA35
-EDBB 8337DA36
-EDBC 8337DA37
-EDBD 8337DA38
-EDBE 8337DA39
-EDBF 8337DB30
-EDC0 8337DB31
-EDC1 8337DB32
-EDC2 8337DB33
-EDC3 8337DB34
-EDC4 8337DB35
-EDC5 8337DB36
-EDC6 8337DB37
-EDC7 8337DB38
-EDC8 8337DB39
-EDC9 8337DC30
-EDCA 8337DC31
-EDCB 8337DC32
-EDCC 8337DC33
-EDCD 8337DC34
-EDCE 8337DC35
-EDCF 8337DC36
-EDD0 8337DC37
-EDD1 8337DC38
-EDD2 8337DC39
-EDD3 8337DD30
-EDD4 8337DD31
-EDD5 8337DD32
-EDD6 8337DD33
-EDD7 8337DD34
-EDD8 8337DD35
-EDD9 8337DD36
-EDDA 8337DD37
-EDDB 8337DD38
-EDDC 8337DD39
-EDDD 8337DE30
-EDDE 8337DE31
-EDDF 8337DE32
-EDE0 8337DE33
-EDE1 8337DE34
-EDE2 8337DE35
-EDE3 8337DE36
-EDE4 8337DE37
-EDE5 8337DE38
-EDE6 8337DE39
-EDE7 8337DF30
-EDE8 8337DF31
-EDE9 8337DF32
-EDEA 8337DF33
-EDEB 8337DF34
-EDEC 8337DF35
-EDED 8337DF36
-EDEE 8337DF37
-EDEF 8337DF38
-EDF0 8337DF39
-EDF1 8337E030
-EDF2 8337E031
-EDF3 8337E032
-EDF4 8337E033
-EDF5 8337E034
-EDF6 8337E035
-EDF7 8337E036
-EDF8 8337E037
-EDF9 8337E038
-EDFA 8337E039
-EDFB 8337E130
-EDFC 8337E131
-EDFD 8337E132
-EDFE 8337E133
-EDFF 8337E134
-EE00 8337E135
-EE01 8337E136
-EE02 8337E137
-EE03 8337E138
-EE04 8337E139
-EE05 8337E230
-EE06 8337E231
-EE07 8337E232
-EE08 8337E233
-EE09 8337E234
-EE0A 8337E235
-EE0B 8337E236
-EE0C 8337E237
-EE0D 8337E238
-EE0E 8337E239
-EE0F 8337E330
-EE10 8337E331
-EE11 8337E332
-EE12 8337E333
-EE13 8337E334
-EE14 8337E335
-EE15 8337E336
-EE16 8337E337
-EE17 8337E338
-EE18 8337E339
-EE19 8337E430
-EE1A 8337E431
-EE1B 8337E432
-EE1C 8337E433
-EE1D 8337E434
-EE1E 8337E435
-EE1F 8337E436
-EE20 8337E437
-EE21 8337E438
-EE22 8337E439
-EE23 8337E530
-EE24 8337E531
-EE25 8337E532
-EE26 8337E533
-EE27 8337E534
-EE28 8337E535
-EE29 8337E536
-EE2A 8337E537
-EE2B 8337E538
-EE2C 8337E539
-EE2D 8337E630
-EE2E 8337E631
-EE2F 8337E632
-EE30 8337E633
-EE31 8337E634
-EE32 8337E635
-EE33 8337E636
-EE34 8337E637
-EE35 8337E638
-EE36 8337E639
-EE37 8337E730
-EE38 8337E731
-EE39 8337E732
-EE3A 8337E733
-EE3B 8337E734
-EE3C 8337E735
-EE3D 8337E736
-EE3E 8337E737
-EE3F 8337E738
-EE40 8337E739
-EE41 8337E830
-EE42 8337E831
-EE43 8337E832
-EE44 8337E833
-EE45 8337E834
-EE46 8337E835
-EE47 8337E836
-EE48 8337E837
-EE49 8337E838
-EE4A 8337E839
-EE4B 8337E930
-EE4C 8337E931
-EE4D 8337E932
-EE4E 8337E933
-EE4F 8337E934
-EE50 8337E935
-EE51 8337E936
-EE52 8337E937
-EE53 8337E938
-EE54 8337E939
-EE55 8337EA30
-EE56 8337EA31
-EE57 8337EA32
-EE58 8337EA33
-EE59 8337EA34
-EE5A 8337EA35
-EE5B 8337EA36
-EE5C 8337EA37
-EE5D 8337EA38
-EE5E 8337EA39
-EE5F 8337EB30
-EE60 8337EB31
-EE61 8337EB32
-EE62 8337EB33
-EE63 8337EB34
-EE64 8337EB35
-EE65 8337EB36
-EE66 8337EB37
-EE67 8337EB38
-EE68 8337EB39
-EE69 8337EC30
-EE6A 8337EC31
-EE6B 8337EC32
-EE6C 8337EC33
-EE6D 8337EC34
-EE6E 8337EC35
-EE6F 8337EC36
-EE70 8337EC37
-EE71 8337EC38
-EE72 8337EC39
-EE73 8337ED30
-EE74 8337ED31
-EE75 8337ED32
-EE76 8337ED33
-EE77 8337ED34
-EE78 8337ED35
-EE79 8337ED36
-EE7A 8337ED37
-EE7B 8337ED38
-EE7C 8337ED39
-EE7D 8337EE30
-EE7E 8337EE31
-EE7F 8337EE32
-EE80 8337EE33
-EE81 8337EE34
-EE82 8337EE35
-EE83 8337EE36
-EE84 8337EE37
-EE85 8337EE38
-EE86 8337EE39
-EE87 8337EF30
-EE88 8337EF31
-EE89 8337EF32
-EE8A 8337EF33
-EE8B 8337EF34
-EE8C 8337EF35
-EE8D 8337EF36
-EE8E 8337EF37
-EE8F 8337EF38
-EE90 8337EF39
-EE91 8337F030
-EE92 8337F031
-EE93 8337F032
-EE94 8337F033
-EE95 8337F034
-EE96 8337F035
-EE97 8337F036
-EE98 8337F037
-EE99 8337F038
-EE9A 8337F039
-EE9B 8337F130
-EE9C 8337F131
-EE9D 8337F132
-EE9E 8337F133
-EE9F 8337F134
-EEA0 8337F135
-EEA1 8337F136
-EEA2 8337F137
-EEA3 8337F138
-EEA4 8337F139
-EEA5 8337F230
-EEA6 8337F231
-EEA7 8337F232
-EEA8 8337F233
-EEA9 8337F234
-EEAA 8337F235
-EEAB 8337F236
-EEAC 8337F237
-EEAD 8337F238
-EEAE 8337F239
-EEAF 8337F330
-EEB0 8337F331
-EEB1 8337F332
-EEB2 8337F333
-EEB3 8337F334
-EEB4 8337F335
-EEB5 8337F336
-EEB6 8337F337
-EEB7 8337F338
-EEB8 8337F339
-EEB9 8337F430
-EEBA 8337F431
-EEBB 8337F432
-EEBC 8337F433
-EEBD 8337F434
-EEBE 8337F435
-EEBF 8337F436
-EEC0 8337F437
-EEC1 8337F438
-EEC2 8337F439
-EEC3 8337F530
-EEC4 8337F531
-EEC5 8337F532
-EEC6 8337F533
-EEC7 8337F534
-EEC8 8337F535
-EEC9 8337F536
-EECA 8337F537
-EECB 8337F538
-EECC 8337F539
-EECD 8337F630
-EECE 8337F631
-EECF 8337F632
-EED0 8337F633
-EED1 8337F634
-EED2 8337F635
-EED3 8337F636
-EED4 8337F637
-EED5 8337F638
-EED6 8337F639
-EED7 8337F730
-EED8 8337F731
-EED9 8337F732
-EEDA 8337F733
-EEDB 8337F734
-EEDC 8337F735
-EEDD 8337F736
-EEDE 8337F737
-EEDF 8337F738
-EEE0 8337F739
-EEE1 8337F830
-EEE2 8337F831
-EEE3 8337F832
-EEE4 8337F833
-EEE5 8337F834
-EEE6 8337F835
-EEE7 8337F836
-EEE8 8337F837
-EEE9 8337F838
-EEEA 8337F839
-EEEB 8337F930
-EEEC 8337F931
-EEED 8337F932
-EEEE 8337F933
-EEEF 8337F934
-EEF0 8337F935
-EEF1 8337F936
-EEF2 8337F937
-EEF3 8337F938
-EEF4 8337F939
-EEF5 8337FA30
-EEF6 8337FA31
-EEF7 8337FA32
-EEF8 8337FA33
-EEF9 8337FA34
-EEFA 8337FA35
-EEFB 8337FA36
-EEFC 8337FA37
-EEFD 8337FA38
-EEFE 8337FA39
-EEFF 8337FB30
-EF00 8337FB31
-EF01 8337FB32
-EF02 8337FB33
-EF03 8337FB34
-EF04 8337FB35
-EF05 8337FB36
-EF06 8337FB37
-EF07 8337FB38
-EF08 8337FB39
-EF09 8337FC30
-EF0A 8337FC31
-EF0B 8337FC32
-EF0C 8337FC33
-EF0D 8337FC34
-EF0E 8337FC35
-EF0F 8337FC36
-EF10 8337FC37
-EF11 8337FC38
-EF12 8337FC39
-EF13 8337FD30
-EF14 8337FD31
-EF15 8337FD32
-EF16 8337FD33
-EF17 8337FD34
-EF18 8337FD35
-EF19 8337FD36
-EF1A 8337FD37
-EF1B 8337FD38
-EF1C 8337FD39
-EF1D 8337FE30
-EF1E 8337FE31
-EF1F 8337FE32
-EF20 8337FE33
-EF21 8337FE34
-EF22 8337FE35
-EF23 8337FE36
-EF24 8337FE37
-EF25 8337FE38
-EF26 8337FE39
-EF27 83388130
-EF28 83388131
-EF29 83388132
-EF2A 83388133
-EF2B 83388134
-EF2C 83388135
-EF2D 83388136
-EF2E 83388137
-EF2F 83388138
-EF30 83388139
-EF31 83388230
-EF32 83388231
-EF33 83388232
-EF34 83388233
-EF35 83388234
-EF36 83388235
-EF37 83388236
-EF38 83388237
-EF39 83388238
-EF3A 83388239
-EF3B 83388330
-EF3C 83388331
-EF3D 83388332
-EF3E 83388333
-EF3F 83388334
-EF40 83388335
-EF41 83388336
-EF42 83388337
-EF43 83388338
-EF44 83388339
-EF45 83388430
-EF46 83388431
-EF47 83388432
-EF48 83388433
-EF49 83388434
-EF4A 83388435
-EF4B 83388436
-EF4C 83388437
-EF4D 83388438
-EF4E 83388439
-EF4F 83388530
-EF50 83388531
-EF51 83388532
-EF52 83388533
-EF53 83388534
-EF54 83388535
-EF55 83388536
-EF56 83388537
-EF57 83388538
-EF58 83388539
-EF59 83388630
-EF5A 83388631
-EF5B 83388632
-EF5C 83388633
-EF5D 83388634
-EF5E 83388635
-EF5F 83388636
-EF60 83388637
-EF61 83388638
-EF62 83388639
-EF63 83388730
-EF64 83388731
-EF65 83388732
-EF66 83388733
-EF67 83388734
-EF68 83388735
-EF69 83388736
-EF6A 83388737
-EF6B 83388738
-EF6C 83388739
-EF6D 83388830
-EF6E 83388831
-EF6F 83388832
-EF70 83388833
-EF71 83388834
-EF72 83388835
-EF73 83388836
-EF74 83388837
-EF75 83388838
-EF76 83388839
-EF77 83388930
-EF78 83388931
-EF79 83388932
-EF7A 83388933
-EF7B 83388934
-EF7C 83388935
-EF7D 83388936
-EF7E 83388937
-EF7F 83388938
-EF80 83388939
-EF81 83388A30
-EF82 83388A31
-EF83 83388A32
-EF84 83388A33
-EF85 83388A34
-EF86 83388A35
-EF87 83388A36
-EF88 83388A37
-EF89 83388A38
-EF8A 83388A39
-EF8B 83388B30
-EF8C 83388B31
-EF8D 83388B32
-EF8E 83388B33
-EF8F 83388B34
-EF90 83388B35
-EF91 83388B36
-EF92 83388B37
-EF93 83388B38
-EF94 83388B39
-EF95 83388C30
-EF96 83388C31
-EF97 83388C32
-EF98 83388C33
-EF99 83388C34
-EF9A 83388C35
-EF9B 83388C36
-EF9C 83388C37
-EF9D 83388C38
-EF9E 83388C39
-EF9F 83388D30
-EFA0 83388D31
-EFA1 83388D32
-EFA2 83388D33
-EFA3 83388D34
-EFA4 83388D35
-EFA5 83388D36
-EFA6 83388D37
-EFA7 83388D38
-EFA8 83388D39
-EFA9 83388E30
-EFAA 83388E31
-EFAB 83388E32
-EFAC 83388E33
-EFAD 83388E34
-EFAE 83388E35
-EFAF 83388E36
-EFB0 83388E37
-EFB1 83388E38
-EFB2 83388E39
-EFB3 83388F30
-EFB4 83388F31
-EFB5 83388F32
-EFB6 83388F33
-EFB7 83388F34
-EFB8 83388F35
-EFB9 83388F36
-EFBA 83388F37
-EFBB 83388F38
-EFBC 83388F39
-EFBD 83389030
-EFBE 83389031
-EFBF 83389032
-EFC0 83389033
-EFC1 83389034
-EFC2 83389035
-EFC3 83389036
-EFC4 83389037
-EFC5 83389038
-EFC6 83389039
-EFC7 83389130
-EFC8 83389131
-EFC9 83389132
-EFCA 83389133
-EFCB 83389134
-EFCC 83389135
-EFCD 83389136
-EFCE 83389137
-EFCF 83389138
-EFD0 83389139
-EFD1 83389230
-EFD2 83389231
-EFD3 83389232
-EFD4 83389233
-EFD5 83389234
-EFD6 83389235
-EFD7 83389236
-EFD8 83389237
-EFD9 83389238
-EFDA 83389239
-EFDB 83389330
-EFDC 83389331
-EFDD 83389332
-EFDE 83389333
-EFDF 83389334
-EFE0 83389335
-EFE1 83389336
-EFE2 83389337
-EFE3 83389338
-EFE4 83389339
-EFE5 83389430
-EFE6 83389431
-EFE7 83389432
-EFE8 83389433
-EFE9 83389434
-EFEA 83389435
-EFEB 83389436
-EFEC 83389437
-EFED 83389438
-EFEE 83389439
-EFEF 83389530
-EFF0 83389531
-EFF1 83389532
-EFF2 83389533
-EFF3 83389534
-EFF4 83389535
-EFF5 83389536
-EFF6 83389537
-EFF7 83389538
-EFF8 83389539
-EFF9 83389630
-EFFA 83389631
-EFFB 83389632
-EFFC 83389633
-EFFD 83389634
-EFFE 83389635
-EFFF 83389636
-F000 83389637
-F001 83389638
-F002 83389639
-F003 83389730
-F004 83389731
-F005 83389732
-F006 83389733
-F007 83389734
-F008 83389735
-F009 83389736
-F00A 83389737
-F00B 83389738
-F00C 83389739
-F00D 83389830
-F00E 83389831
-F00F 83389832
-F010 83389833
-F011 83389834
-F012 83389835
-F013 83389836
-F014 83389837
-F015 83389838
-F016 83389839
-F017 83389930
-F018 83389931
-F019 83389932
-F01A 83389933
-F01B 83389934
-F01C 83389935
-F01D 83389936
-F01E 83389937
-F01F 83389938
-F020 83389939
-F021 83389A30
-F022 83389A31
-F023 83389A32
-F024 83389A33
-F025 83389A34
-F026 83389A35
-F027 83389A36
-F028 83389A37
-F029 83389A38
-F02A 83389A39
-F02B 83389B30
-F02C 83389B31
-F02D 83389B32
-F02E 83389B33
-F02F 83389B34
-F030 83389B35
-F031 83389B36
-F032 83389B37
-F033 83389B38
-F034 83389B39
-F035 83389C30
-F036 83389C31
-F037 83389C32
-F038 83389C33
-F039 83389C34
-F03A 83389C35
-F03B 83389C36
-F03C 83389C37
-F03D 83389C38
-F03E 83389C39
-F03F 83389D30
-F040 83389D31
-F041 83389D32
-F042 83389D33
-F043 83389D34
-F044 83389D35
-F045 83389D36
-F046 83389D37
-F047 83389D38
-F048 83389D39
-F049 83389E30
-F04A 83389E31
-F04B 83389E32
-F04C 83389E33
-F04D 83389E34
-F04E 83389E35
-F04F 83389E36
-F050 83389E37
-F051 83389E38
-F052 83389E39
-F053 83389F30
-F054 83389F31
-F055 83389F32
-F056 83389F33
-F057 83389F34
-F058 83389F35
-F059 83389F36
-F05A 83389F37
-F05B 83389F38
-F05C 83389F39
-F05D 8338A030
-F05E 8338A031
-F05F 8338A032
-F060 8338A033
-F061 8338A034
-F062 8338A035
-F063 8338A036
-F064 8338A037
-F065 8338A038
-F066 8338A039
-F067 8338A130
-F068 8338A131
-F069 8338A132
-F06A 8338A133
-F06B 8338A134
-F06C 8338A135
-F06D 8338A136
-F06E 8338A137
-F06F 8338A138
-F070 8338A139
-F071 8338A230
-F072 8338A231
-F073 8338A232
-F074 8338A233
-F075 8338A234
-F076 8338A235
-F077 8338A236
-F078 8338A237
-F079 8338A238
-F07A 8338A239
-F07B 8338A330
-F07C 8338A331
-F07D 8338A332
-F07E 8338A333
-F07F 8338A334
-F080 8338A335
-F081 8338A336
-F082 8338A337
-F083 8338A338
-F084 8338A339
-F085 8338A430
-F086 8338A431
-F087 8338A432
-F088 8338A433
-F089 8338A434
-F08A 8338A435
-F08B 8338A436
-F08C 8338A437
-F08D 8338A438
-F08E 8338A439
-F08F 8338A530
-F090 8338A531
-F091 8338A532
-F092 8338A533
-F093 8338A534
-F094 8338A535
-F095 8338A536
-F096 8338A537
-F097 8338A538
-F098 8338A539
-F099 8338A630
-F09A 8338A631
-F09B 8338A632
-F09C 8338A633
-F09D 8338A634
-F09E 8338A635
-F09F 8338A636
-F0A0 8338A637
-F0A1 8338A638
-F0A2 8338A639
-F0A3 8338A730
-F0A4 8338A731
-F0A5 8338A732
-F0A6 8338A733
-F0A7 8338A734
-F0A8 8338A735
-F0A9 8338A736
-F0AA 8338A737
-F0AB 8338A738
-F0AC 8338A739
-F0AD 8338A830
-F0AE 8338A831
-F0AF 8338A832
-F0B0 8338A833
-F0B1 8338A834
-F0B2 8338A835
-F0B3 8338A836
-F0B4 8338A837
-F0B5 8338A838
-F0B6 8338A839
-F0B7 8338A930
-F0B8 8338A931
-F0B9 8338A932
-F0BA 8338A933
-F0BB 8338A934
-F0BC 8338A935
-F0BD 8338A936
-F0BE 8338A937
-F0BF 8338A938
-F0C0 8338A939
-F0C1 8338AA30
-F0C2 8338AA31
-F0C3 8338AA32
-F0C4 8338AA33
-F0C5 8338AA34
-F0C6 8338AA35
-F0C7 8338AA36
-F0C8 8338AA37
-F0C9 8338AA38
-F0CA 8338AA39
-F0CB 8338AB30
-F0CC 8338AB31
-F0CD 8338AB32
-F0CE 8338AB33
-F0CF 8338AB34
-F0D0 8338AB35
-F0D1 8338AB36
-F0D2 8338AB37
-F0D3 8338AB38
-F0D4 8338AB39
-F0D5 8338AC30
-F0D6 8338AC31
-F0D7 8338AC32
-F0D8 8338AC33
-F0D9 8338AC34
-F0DA 8338AC35
-F0DB 8338AC36
-F0DC 8338AC37
-F0DD 8338AC38
-F0DE 8338AC39
-F0DF 8338AD30
-F0E0 8338AD31
-F0E1 8338AD32
-F0E2 8338AD33
-F0E3 8338AD34
-F0E4 8338AD35
-F0E5 8338AD36
-F0E6 8338AD37
-F0E7 8338AD38
-F0E8 8338AD39
-F0E9 8338AE30
-F0EA 8338AE31
-F0EB 8338AE32
-F0EC 8338AE33
-F0ED 8338AE34
-F0EE 8338AE35
-F0EF 8338AE36
-F0F0 8338AE37
-F0F1 8338AE38
-F0F2 8338AE39
-F0F3 8338AF30
-F0F4 8338AF31
-F0F5 8338AF32
-F0F6 8338AF33
-F0F7 8338AF34
-F0F8 8338AF35
-F0F9 8338AF36
-F0FA 8338AF37
-F0FB 8338AF38
-F0FC 8338AF39
-F0FD 8338B030
-F0FE 8338B031
-F0FF 8338B032
-F100 8338B033
-F101 8338B034
-F102 8338B035
-F103 8338B036
-F104 8338B037
-F105 8338B038
-F106 8338B039
-F107 8338B130
-F108 8338B131
-F109 8338B132
-F10A 8338B133
-F10B 8338B134
-F10C 8338B135
-F10D 8338B136
-F10E 8338B137
-F10F 8338B138
-F110 8338B139
-F111 8338B230
-F112 8338B231
-F113 8338B232
-F114 8338B233
-F115 8338B234
-F116 8338B235
-F117 8338B236
-F118 8338B237
-F119 8338B238
-F11A 8338B239
-F11B 8338B330
-F11C 8338B331
-F11D 8338B332
-F11E 8338B333
-F11F 8338B334
-F120 8338B335
-F121 8338B336
-F122 8338B337
-F123 8338B338
-F124 8338B339
-F125 8338B430
-F126 8338B431
-F127 8338B432
-F128 8338B433
-F129 8338B434
-F12A 8338B435
-F12B 8338B436
-F12C 8338B437
-F12D 8338B438
-F12E 8338B439
-F12F 8338B530
-F130 8338B531
-F131 8338B532
-F132 8338B533
-F133 8338B534
-F134 8338B535
-F135 8338B536
-F136 8338B537
-F137 8338B538
-F138 8338B539
-F139 8338B630
-F13A 8338B631
-F13B 8338B632
-F13C 8338B633
-F13D 8338B634
-F13E 8338B635
-F13F 8338B636
-F140 8338B637
-F141 8338B638
-F142 8338B639
-F143 8338B730
-F144 8338B731
-F145 8338B732
-F146 8338B733
-F147 8338B734
-F148 8338B735
-F149 8338B736
-F14A 8338B737
-F14B 8338B738
-F14C 8338B739
-F14D 8338B830
-F14E 8338B831
-F14F 8338B832
-F150 8338B833
-F151 8338B834
-F152 8338B835
-F153 8338B836
-F154 8338B837
-F155 8338B838
-F156 8338B839
-F157 8338B930
-F158 8338B931
-F159 8338B932
-F15A 8338B933
-F15B 8338B934
-F15C 8338B935
-F15D 8338B936
-F15E 8338B937
-F15F 8338B938
-F160 8338B939
-F161 8338BA30
-F162 8338BA31
-F163 8338BA32
-F164 8338BA33
-F165 8338BA34
-F166 8338BA35
-F167 8338BA36
-F168 8338BA37
-F169 8338BA38
-F16A 8338BA39
-F16B 8338BB30
-F16C 8338BB31
-F16D 8338BB32
-F16E 8338BB33
-F16F 8338BB34
-F170 8338BB35
-F171 8338BB36
-F172 8338BB37
-F173 8338BB38
-F174 8338BB39
-F175 8338BC30
-F176 8338BC31
-F177 8338BC32
-F178 8338BC33
-F179 8338BC34
-F17A 8338BC35
-F17B 8338BC36
-F17C 8338BC37
-F17D 8338BC38
-F17E 8338BC39
-F17F 8338BD30
-F180 8338BD31
-F181 8338BD32
-F182 8338BD33
-F183 8338BD34
-F184 8338BD35
-F185 8338BD36
-F186 8338BD37
-F187 8338BD38
-F188 8338BD39
-F189 8338BE30
-F18A 8338BE31
-F18B 8338BE32
-F18C 8338BE33
-F18D 8338BE34
-F18E 8338BE35
-F18F 8338BE36
-F190 8338BE37
-F191 8338BE38
-F192 8338BE39
-F193 8338BF30
-F194 8338BF31
-F195 8338BF32
-F196 8338BF33
-F197 8338BF34
-F198 8338BF35
-F199 8338BF36
-F19A 8338BF37
-F19B 8338BF38
-F19C 8338BF39
-F19D 8338C030
-F19E 8338C031
-F19F 8338C032
-F1A0 8338C033
-F1A1 8338C034
-F1A2 8338C035
-F1A3 8338C036
-F1A4 8338C037
-F1A5 8338C038
-F1A6 8338C039
-F1A7 8338C130
-F1A8 8338C131
-F1A9 8338C132
-F1AA 8338C133
-F1AB 8338C134
-F1AC 8338C135
-F1AD 8338C136
-F1AE 8338C137
-F1AF 8338C138
-F1B0 8338C139
-F1B1 8338C230
-F1B2 8338C231
-F1B3 8338C232
-F1B4 8338C233
-F1B5 8338C234
-F1B6 8338C235
-F1B7 8338C236
-F1B8 8338C237
-F1B9 8338C238
-F1BA 8338C239
-F1BB 8338C330
-F1BC 8338C331
-F1BD 8338C332
-F1BE 8338C333
-F1BF 8338C334
-F1C0 8338C335
-F1C1 8338C336
-F1C2 8338C337
-F1C3 8338C338
-F1C4 8338C339
-F1C5 8338C430
-F1C6 8338C431
-F1C7 8338C432
-F1C8 8338C433
-F1C9 8338C434
-F1CA 8338C435
-F1CB 8338C436
-F1CC 8338C437
-F1CD 8338C438
-F1CE 8338C439
-F1CF 8338C530
-F1D0 8338C531
-F1D1 8338C532
-F1D2 8338C533
-F1D3 8338C534
-F1D4 8338C535
-F1D5 8338C536
-F1D6 8338C537
-F1D7 8338C538
-F1D8 8338C539
-F1D9 8338C630
-F1DA 8338C631
-F1DB 8338C632
-F1DC 8338C633
-F1DD 8338C634
-F1DE 8338C635
-F1DF 8338C636
-F1E0 8338C637
-F1E1 8338C638
-F1E2 8338C639
-F1E3 8338C730
-F1E4 8338C731
-F1E5 8338C732
-F1E6 8338C733
-F1E7 8338C734
-F1E8 8338C735
-F1E9 8338C736
-F1EA 8338C737
-F1EB 8338C738
-F1EC 8338C739
-F1ED 8338C830
-F1EE 8338C831
-F1EF 8338C832
-F1F0 8338C833
-F1F1 8338C834
-F1F2 8338C835
-F1F3 8338C836
-F1F4 8338C837
-F1F5 8338C838
-F1F6 8338C839
-F1F7 8338C930
-F1F8 8338C931
-F1F9 8338C932
-F1FA 8338C933
-F1FB 8338C934
-F1FC 8338C935
-F1FD 8338C936
-F1FE 8338C937
-F1FF 8338C938
-F200 8338C939
-F201 8338CA30
-F202 8338CA31
-F203 8338CA32
-F204 8338CA33
-F205 8338CA34
-F206 8338CA35
-F207 8338CA36
-F208 8338CA37
-F209 8338CA38
-F20A 8338CA39
-F20B 8338CB30
-F20C 8338CB31
-F20D 8338CB32
-F20E 8338CB33
-F20F 8338CB34
-F210 8338CB35
-F211 8338CB36
-F212 8338CB37
-F213 8338CB38
-F214 8338CB39
-F215 8338CC30
-F216 8338CC31
-F217 8338CC32
-F218 8338CC33
-F219 8338CC34
-F21A 8338CC35
-F21B 8338CC36
-F21C 8338CC37
-F21D 8338CC38
-F21E 8338CC39
-F21F 8338CD30
-F220 8338CD31
-F221 8338CD32
-F222 8338CD33
-F223 8338CD34
-F224 8338CD35
-F225 8338CD36
-F226 8338CD37
-F227 8338CD38
-F228 8338CD39
-F229 8338CE30
-F22A 8338CE31
-F22B 8338CE32
-F22C 8338CE33
-F22D 8338CE34
-F22E 8338CE35
-F22F 8338CE36
-F230 8338CE37
-F231 8338CE38
-F232 8338CE39
-F233 8338CF30
-F234 8338CF31
-F235 8338CF32
-F236 8338CF33
-F237 8338CF34
-F238 8338CF35
-F239 8338CF36
-F23A 8338CF37
-F23B 8338CF38
-F23C 8338CF39
-F23D 8338D030
-F23E 8338D031
-F23F 8338D032
-F240 8338D033
-F241 8338D034
-F242 8338D035
-F243 8338D036
-F244 8338D037
-F245 8338D038
-F246 8338D039
-F247 8338D130
-F248 8338D131
-F249 8338D132
-F24A 8338D133
-F24B 8338D134
-F24C 8338D135
-F24D 8338D136
-F24E 8338D137
-F24F 8338D138
-F250 8338D139
-F251 8338D230
-F252 8338D231
-F253 8338D232
-F254 8338D233
-F255 8338D234
-F256 8338D235
-F257 8338D236
-F258 8338D237
-F259 8338D238
-F25A 8338D239
-F25B 8338D330
-F25C 8338D331
-F25D 8338D332
-F25E 8338D333
-F25F 8338D334
-F260 8338D335
-F261 8338D336
-F262 8338D337
-F263 8338D338
-F264 8338D339
-F265 8338D430
-F266 8338D431
-F267 8338D432
-F268 8338D433
-F269 8338D434
-F26A 8338D435
-F26B 8338D436
-F26C 8338D437
-F26D 8338D438
-F26E 8338D439
-F26F 8338D530
-F270 8338D531
-F271 8338D532
-F272 8338D533
-F273 8338D534
-F274 8338D535
-F275 8338D536
-F276 8338D537
-F277 8338D538
-F278 8338D539
-F279 8338D630
-F27A 8338D631
-F27B 8338D632
-F27C 8338D633
-F27D 8338D634
-F27E 8338D635
-F27F 8338D636
-F280 8338D637
-F281 8338D638
-F282 8338D639
-F283 8338D730
-F284 8338D731
-F285 8338D732
-F286 8338D733
-F287 8338D734
-F288 8338D735
-F289 8338D736
-F28A 8338D737
-F28B 8338D738
-F28C 8338D739
-F28D 8338D830
-F28E 8338D831
-F28F 8338D832
-F290 8338D833
-F291 8338D834
-F292 8338D835
-F293 8338D836
-F294 8338D837
-F295 8338D838
-F296 8338D839
-F297 8338D930
-F298 8338D931
-F299 8338D932
-F29A 8338D933
-F29B 8338D934
-F29C 8338D935
-F29D 8338D936
-F29E 8338D937
-F29F 8338D938
-F2A0 8338D939
-F2A1 8338DA30
-F2A2 8338DA31
-F2A3 8338DA32
-F2A4 8338DA33
-F2A5 8338DA34
-F2A6 8338DA35
-F2A7 8338DA36
-F2A8 8338DA37
-F2A9 8338DA38
-F2AA 8338DA39
-F2AB 8338DB30
-F2AC 8338DB31
-F2AD 8338DB32
-F2AE 8338DB33
-F2AF 8338DB34
-F2B0 8338DB35
-F2B1 8338DB36
-F2B2 8338DB37
-F2B3 8338DB38
-F2B4 8338DB39
-F2B5 8338DC30
-F2B6 8338DC31
-F2B7 8338DC32
-F2B8 8338DC33
-F2B9 8338DC34
-F2BA 8338DC35
-F2BB 8338DC36
-F2BC 8338DC37
-F2BD 8338DC38
-F2BE 8338DC39
-F2BF 8338DD30
-F2C0 8338DD31
-F2C1 8338DD32
-F2C2 8338DD33
-F2C3 8338DD34
-F2C4 8338DD35
-F2C5 8338DD36
-F2C6 8338DD37
-F2C7 8338DD38
-F2C8 8338DD39
-F2C9 8338DE30
-F2CA 8338DE31
-F2CB 8338DE32
-F2CC 8338DE33
-F2CD 8338DE34
-F2CE 8338DE35
-F2CF 8338DE36
-F2D0 8338DE37
-F2D1 8338DE38
-F2D2 8338DE39
-F2D3 8338DF30
-F2D4 8338DF31
-F2D5 8338DF32
-F2D6 8338DF33
-F2D7 8338DF34
-F2D8 8338DF35
-F2D9 8338DF36
-F2DA 8338DF37
-F2DB 8338DF38
-F2DC 8338DF39
-F2DD 8338E030
-F2DE 8338E031
-F2DF 8338E032
-F2E0 8338E033
-F2E1 8338E034
-F2E2 8338E035
-F2E3 8338E036
-F2E4 8338E037
-F2E5 8338E038
-F2E6 8338E039
-F2E7 8338E130
-F2E8 8338E131
-F2E9 8338E132
-F2EA 8338E133
-F2EB 8338E134
-F2EC 8338E135
-F2ED 8338E136
-F2EE 8338E137
-F2EF 8338E138
-F2F0 8338E139
-F2F1 8338E230
-F2F2 8338E231
-F2F3 8338E232
-F2F4 8338E233
-F2F5 8338E234
-F2F6 8338E235
-F2F7 8338E236
-F2F8 8338E237
-F2F9 8338E238
-F2FA 8338E239
-F2FB 8338E330
-F2FC 8338E331
-F2FD 8338E332
-F2FE 8338E333
-F2FF 8338E334
-F300 8338E335
-F301 8338E336
-F302 8338E337
-F303 8338E338
-F304 8338E339
-F305 8338E430
-F306 8338E431
-F307 8338E432
-F308 8338E433
-F309 8338E434
-F30A 8338E435
-F30B 8338E436
-F30C 8338E437
-F30D 8338E438
-F30E 8338E439
-F30F 8338E530
-F310 8338E531
-F311 8338E532
-F312 8338E533
-F313 8338E534
-F314 8338E535
-F315 8338E536
-F316 8338E537
-F317 8338E538
-F318 8338E539
-F319 8338E630
-F31A 8338E631
-F31B 8338E632
-F31C 8338E633
-F31D 8338E634
-F31E 8338E635
-F31F 8338E636
-F320 8338E637
-F321 8338E638
-F322 8338E639
-F323 8338E730
-F324 8338E731
-F325 8338E732
-F326 8338E733
-F327 8338E734
-F328 8338E735
-F329 8338E736
-F32A 8338E737
-F32B 8338E738
-F32C 8338E739
-F32D 8338E830
-F32E 8338E831
-F32F 8338E832
-F330 8338E833
-F331 8338E834
-F332 8338E835
-F333 8338E836
-F334 8338E837
-F335 8338E838
-F336 8338E839
-F337 8338E930
-F338 8338E931
-F339 8338E932
-F33A 8338E933
-F33B 8338E934
-F33C 8338E935
-F33D 8338E936
-F33E 8338E937
-F33F 8338E938
-F340 8338E939
-F341 8338EA30
-F342 8338EA31
-F343 8338EA32
-F344 8338EA33
-F345 8338EA34
-F346 8338EA35
-F347 8338EA36
-F348 8338EA37
-F349 8338EA38
-F34A 8338EA39
-F34B 8338EB30
-F34C 8338EB31
-F34D 8338EB32
-F34E 8338EB33
-F34F 8338EB34
-F350 8338EB35
-F351 8338EB36
-F352 8338EB37
-F353 8338EB38
-F354 8338EB39
-F355 8338EC30
-F356 8338EC31
-F357 8338EC32
-F358 8338EC33
-F359 8338EC34
-F35A 8338EC35
-F35B 8338EC36
-F35C 8338EC37
-F35D 8338EC38
-F35E 8338EC39
-F35F 8338ED30
-F360 8338ED31
-F361 8338ED32
-F362 8338ED33
-F363 8338ED34
-F364 8338ED35
-F365 8338ED36
-F366 8338ED37
-F367 8338ED38
-F368 8338ED39
-F369 8338EE30
-F36A 8338EE31
-F36B 8338EE32
-F36C 8338EE33
-F36D 8338EE34
-F36E 8338EE35
-F36F 8338EE36
-F370 8338EE37
-F371 8338EE38
-F372 8338EE39
-F373 8338EF30
-F374 8338EF31
-F375 8338EF32
-F376 8338EF33
-F377 8338EF34
-F378 8338EF35
-F379 8338EF36
-F37A 8338EF37
-F37B 8338EF38
-F37C 8338EF39
-F37D 8338F030
-F37E 8338F031
-F37F 8338F032
-F380 8338F033
-F381 8338F034
-F382 8338F035
-F383 8338F036
-F384 8338F037
-F385 8338F038
-F386 8338F039
-F387 8338F130
-F388 8338F131
-F389 8338F132
-F38A 8338F133
-F38B 8338F134
-F38C 8338F135
-F38D 8338F136
-F38E 8338F137
-F38F 8338F138
-F390 8338F139
-F391 8338F230
-F392 8338F231
-F393 8338F232
-F394 8338F233
-F395 8338F234
-F396 8338F235
-F397 8338F236
-F398 8338F237
-F399 8338F238
-F39A 8338F239
-F39B 8338F330
-F39C 8338F331
-F39D 8338F332
-F39E 8338F333
-F39F 8338F334
-F3A0 8338F335
-F3A1 8338F336
-F3A2 8338F337
-F3A3 8338F338
-F3A4 8338F339
-F3A5 8338F430
-F3A6 8338F431
-F3A7 8338F432
-F3A8 8338F433
-F3A9 8338F434
-F3AA 8338F435
-F3AB 8338F436
-F3AC 8338F437
-F3AD 8338F438
-F3AE 8338F439
-F3AF 8338F530
-F3B0 8338F531
-F3B1 8338F532
-F3B2 8338F533
-F3B3 8338F534
-F3B4 8338F535
-F3B5 8338F536
-F3B6 8338F537
-F3B7 8338F538
-F3B8 8338F539
-F3B9 8338F630
-F3BA 8338F631
-F3BB 8338F632
-F3BC 8338F633
-F3BD 8338F634
-F3BE 8338F635
-F3BF 8338F636
-F3C0 8338F637
-F3C1 8338F638
-F3C2 8338F639
-F3C3 8338F730
-F3C4 8338F731
-F3C5 8338F732
-F3C6 8338F733
-F3C7 8338F734
-F3C8 8338F735
-F3C9 8338F736
-F3CA 8338F737
-F3CB 8338F738
-F3CC 8338F739
-F3CD 8338F830
-F3CE 8338F831
-F3CF 8338F832
-F3D0 8338F833
-F3D1 8338F834
-F3D2 8338F835
-F3D3 8338F836
-F3D4 8338F837
-F3D5 8338F838
-F3D6 8338F839
-F3D7 8338F930
-F3D8 8338F931
-F3D9 8338F932
-F3DA 8338F933
-F3DB 8338F934
-F3DC 8338F935
-F3DD 8338F936
-F3DE 8338F937
-F3DF 8338F938
-F3E0 8338F939
-F3E1 8338FA30
-F3E2 8338FA31
-F3E3 8338FA32
-F3E4 8338FA33
-F3E5 8338FA34
-F3E6 8338FA35
-F3E7 8338FA36
-F3E8 8338FA37
-F3E9 8338FA38
-F3EA 8338FA39
-F3EB 8338FB30
-F3EC 8338FB31
-F3ED 8338FB32
-F3EE 8338FB33
-F3EF 8338FB34
-F3F0 8338FB35
-F3F1 8338FB36
-F3F2 8338FB37
-F3F3 8338FB38
-F3F4 8338FB39
-F3F5 8338FC30
-F3F6 8338FC31
-F3F7 8338FC32
-F3F8 8338FC33
-F3F9 8338FC34
-F3FA 8338FC35
-F3FB 8338FC36
-F3FC 8338FC37
-F3FD 8338FC38
-F3FE 8338FC39
-F3FF 8338FD30
-F400 8338FD31
-F401 8338FD32
-F402 8338FD33
-F403 8338FD34
-F404 8338FD35
-F405 8338FD36
-F406 8338FD37
-F407 8338FD38
-F408 8338FD39
-F409 8338FE30
-F40A 8338FE31
-F40B 8338FE32
-F40C 8338FE33
-F40D 8338FE34
-F40E 8338FE35
-F40F 8338FE36
-F410 8338FE37
-F411 8338FE38
-F412 8338FE39
-F413 83398130
-F414 83398131
-F415 83398132
-F416 83398133
-F417 83398134
-F418 83398135
-F419 83398136
-F41A 83398137
-F41B 83398138
-F41C 83398139
-F41D 83398230
-F41E 83398231
-F41F 83398232
-F420 83398233
-F421 83398234
-F422 83398235
-F423 83398236
-F424 83398237
-F425 83398238
-F426 83398239
-F427 83398330
-F428 83398331
-F429 83398332
-F42A 83398333
-F42B 83398334
-F42C 83398335
-F42D 83398336
-F42E 83398337
-F42F 83398338
-F430 83398339
-F431 83398430
-F432 83398431
-F433 83398432
-F434 83398433
-F435 83398434
-F436 83398435
-F437 83398436
-F438 83398437
-F439 83398438
-F43A 83398439
-F43B 83398530
-F43C 83398531
-F43D 83398532
-F43E 83398533
-F43F 83398534
-F440 83398535
-F441 83398536
-F442 83398537
-F443 83398538
-F444 83398539
-F445 83398630
-F446 83398631
-F447 83398632
-F448 83398633
-F449 83398634
-F44A 83398635
-F44B 83398636
-F44C 83398637
-F44D 83398638
-F44E 83398639
-F44F 83398730
-F450 83398731
-F451 83398732
-F452 83398733
-F453 83398734
-F454 83398735
-F455 83398736
-F456 83398737
-F457 83398738
-F458 83398739
-F459 83398830
-F45A 83398831
-F45B 83398832
-F45C 83398833
-F45D 83398834
-F45E 83398835
-F45F 83398836
-F460 83398837
-F461 83398838
-F462 83398839
-F463 83398930
-F464 83398931
-F465 83398932
-F466 83398933
-F467 83398934
-F468 83398935
-F469 83398936
-F46A 83398937
-F46B 83398938
-F46C 83398939
-F46D 83398A30
-F46E 83398A31
-F46F 83398A32
-F470 83398A33
-F471 83398A34
-F472 83398A35
-F473 83398A36
-F474 83398A37
-F475 83398A38
-F476 83398A39
-F477 83398B30
-F478 83398B31
-F479 83398B32
-F47A 83398B33
-F47B 83398B34
-F47C 83398B35
-F47D 83398B36
-F47E 83398B37
-F47F 83398B38
-F480 83398B39
-F481 83398C30
-F482 83398C31
-F483 83398C32
-F484 83398C33
-F485 83398C34
-F486 83398C35
-F487 83398C36
-F488 83398C37
-F489 83398C38
-F48A 83398C39
-F48B 83398D30
-F48C 83398D31
-F48D 83398D32
-F48E 83398D33
-F48F 83398D34
-F490 83398D35
-F491 83398D36
-F492 83398D37
-F493 83398D38
-F494 83398D39
-F495 83398E30
-F496 83398E31
-F497 83398E32
-F498 83398E33
-F499 83398E34
-F49A 83398E35
-F49B 83398E36
-F49C 83398E37
-F49D 83398E38
-F49E 83398E39
-F49F 83398F30
-F4A0 83398F31
-F4A1 83398F32
-F4A2 83398F33
-F4A3 83398F34
-F4A4 83398F35
-F4A5 83398F36
-F4A6 83398F37
-F4A7 83398F38
-F4A8 83398F39
-F4A9 83399030
-F4AA 83399031
-F4AB 83399032
-F4AC 83399033
-F4AD 83399034
-F4AE 83399035
-F4AF 83399036
-F4B0 83399037
-F4B1 83399038
-F4B2 83399039
-F4B3 83399130
-F4B4 83399131
-F4B5 83399132
-F4B6 83399133
-F4B7 83399134
-F4B8 83399135
-F4B9 83399136
-F4BA 83399137
-F4BB 83399138
-F4BC 83399139
-F4BD 83399230
-F4BE 83399231
-F4BF 83399232
-F4C0 83399233
-F4C1 83399234
-F4C2 83399235
-F4C3 83399236
-F4C4 83399237
-F4C5 83399238
-F4C6 83399239
-F4C7 83399330
-F4C8 83399331
-F4C9 83399332
-F4CA 83399333
-F4CB 83399334
-F4CC 83399335
-F4CD 83399336
-F4CE 83399337
-F4CF 83399338
-F4D0 83399339
-F4D1 83399430
-F4D2 83399431
-F4D3 83399432
-F4D4 83399433
-F4D5 83399434
-F4D6 83399435
-F4D7 83399436
-F4D8 83399437
-F4D9 83399438
-F4DA 83399439
-F4DB 83399530
-F4DC 83399531
-F4DD 83399532
-F4DE 83399533
-F4DF 83399534
-F4E0 83399535
-F4E1 83399536
-F4E2 83399537
-F4E3 83399538
-F4E4 83399539
-F4E5 83399630
-F4E6 83399631
-F4E7 83399632
-F4E8 83399633
-F4E9 83399634
-F4EA 83399635
-F4EB 83399636
-F4EC 83399637
-F4ED 83399638
-F4EE 83399639
-F4EF 83399730
-F4F0 83399731
-F4F1 83399732
-F4F2 83399733
-F4F3 83399734
-F4F4 83399735
-F4F5 83399736
-F4F6 83399737
-F4F7 83399738
-F4F8 83399739
-F4F9 83399830
-F4FA 83399831
-F4FB 83399832
-F4FC 83399833
-F4FD 83399834
-F4FE 83399835
-F4FF 83399836
-F500 83399837
-F501 83399838
-F502 83399839
-F503 83399930
-F504 83399931
-F505 83399932
-F506 83399933
-F507 83399934
-F508 83399935
-F509 83399936
-F50A 83399937
-F50B 83399938
-F50C 83399939
-F50D 83399A30
-F50E 83399A31
-F50F 83399A32
-F510 83399A33
-F511 83399A34
-F512 83399A35
-F513 83399A36
-F514 83399A37
-F515 83399A38
-F516 83399A39
-F517 83399B30
-F518 83399B31
-F519 83399B32
-F51A 83399B33
-F51B 83399B34
-F51C 83399B35
-F51D 83399B36
-F51E 83399B37
-F51F 83399B38
-F520 83399B39
-F521 83399C30
-F522 83399C31
-F523 83399C32
-F524 83399C33
-F525 83399C34
-F526 83399C35
-F527 83399C36
-F528 83399C37
-F529 83399C38
-F52A 83399C39
-F52B 83399D30
-F52C 83399D31
-F52D 83399D32
-F52E 83399D33
-F52F 83399D34
-F530 83399D35
-F531 83399D36
-F532 83399D37
-F533 83399D38
-F534 83399D39
-F535 83399E30
-F536 83399E31
-F537 83399E32
-F538 83399E33
-F539 83399E34
-F53A 83399E35
-F53B 83399E36
-F53C 83399E37
-F53D 83399E38
-F53E 83399E39
-F53F 83399F30
-F540 83399F31
-F541 83399F32
-F542 83399F33
-F543 83399F34
-F544 83399F35
-F545 83399F36
-F546 83399F37
-F547 83399F38
-F548 83399F39
-F549 8339A030
-F54A 8339A031
-F54B 8339A032
-F54C 8339A033
-F54D 8339A034
-F54E 8339A035
-F54F 8339A036
-F550 8339A037
-F551 8339A038
-F552 8339A039
-F553 8339A130
-F554 8339A131
-F555 8339A132
-F556 8339A133
-F557 8339A134
-F558 8339A135
-F559 8339A136
-F55A 8339A137
-F55B 8339A138
-F55C 8339A139
-F55D 8339A230
-F55E 8339A231
-F55F 8339A232
-F560 8339A233
-F561 8339A234
-F562 8339A235
-F563 8339A236
-F564 8339A237
-F565 8339A238
-F566 8339A239
-F567 8339A330
-F568 8339A331
-F569 8339A332
-F56A 8339A333
-F56B 8339A334
-F56C 8339A335
-F56D 8339A336
-F56E 8339A337
-F56F 8339A338
-F570 8339A339
-F571 8339A430
-F572 8339A431
-F573 8339A432
-F574 8339A433
-F575 8339A434
-F576 8339A435
-F577 8339A436
-F578 8339A437
-F579 8339A438
-F57A 8339A439
-F57B 8339A530
-F57C 8339A531
-F57D 8339A532
-F57E 8339A533
-F57F 8339A534
-F580 8339A535
-F581 8339A536
-F582 8339A537
-F583 8339A538
-F584 8339A539
-F585 8339A630
-F586 8339A631
-F587 8339A632
-F588 8339A633
-F589 8339A634
-F58A 8339A635
-F58B 8339A636
-F58C 8339A637
-F58D 8339A638
-F58E 8339A639
-F58F 8339A730
-F590 8339A731
-F591 8339A732
-F592 8339A733
-F593 8339A734
-F594 8339A735
-F595 8339A736
-F596 8339A737
-F597 8339A738
-F598 8339A739
-F599 8339A830
-F59A 8339A831
-F59B 8339A832
-F59C 8339A833
-F59D 8339A834
-F59E 8339A835
-F59F 8339A836
-F5A0 8339A837
-F5A1 8339A838
-F5A2 8339A839
-F5A3 8339A930
-F5A4 8339A931
-F5A5 8339A932
-F5A6 8339A933
-F5A7 8339A934
-F5A8 8339A935
-F5A9 8339A936
-F5AA 8339A937
-F5AB 8339A938
-F5AC 8339A939
-F5AD 8339AA30
-F5AE 8339AA31
-F5AF 8339AA32
-F5B0 8339AA33
-F5B1 8339AA34
-F5B2 8339AA35
-F5B3 8339AA36
-F5B4 8339AA37
-F5B5 8339AA38
-F5B6 8339AA39
-F5B7 8339AB30
-F5B8 8339AB31
-F5B9 8339AB32
-F5BA 8339AB33
-F5BB 8339AB34
-F5BC 8339AB35
-F5BD 8339AB36
-F5BE 8339AB37
-F5BF 8339AB38
-F5C0 8339AB39
-F5C1 8339AC30
-F5C2 8339AC31
-F5C3 8339AC32
-F5C4 8339AC33
-F5C5 8339AC34
-F5C6 8339AC35
-F5C7 8339AC36
-F5C8 8339AC37
-F5C9 8339AC38
-F5CA 8339AC39
-F5CB 8339AD30
-F5CC 8339AD31
-F5CD 8339AD32
-F5CE 8339AD33
-F5CF 8339AD34
-F5D0 8339AD35
-F5D1 8339AD36
-F5D2 8339AD37
-F5D3 8339AD38
-F5D4 8339AD39
-F5D5 8339AE30
-F5D6 8339AE31
-F5D7 8339AE32
-F5D8 8339AE33
-F5D9 8339AE34
-F5DA 8339AE35
-F5DB 8339AE36
-F5DC 8339AE37
-F5DD 8339AE38
-F5DE 8339AE39
-F5DF 8339AF30
-F5E0 8339AF31
-F5E1 8339AF32
-F5E2 8339AF33
-F5E3 8339AF34
-F5E4 8339AF35
-F5E5 8339AF36
-F5E6 8339AF37
-F5E7 8339AF38
-F5E8 8339AF39
-F5E9 8339B030
-F5EA 8339B031
-F5EB 8339B032
-F5EC 8339B033
-F5ED 8339B034
-F5EE 8339B035
-F5EF 8339B036
-F5F0 8339B037
-F5F1 8339B038
-F5F2 8339B039
-F5F3 8339B130
-F5F4 8339B131
-F5F5 8339B132
-F5F6 8339B133
-F5F7 8339B134
-F5F8 8339B135
-F5F9 8339B136
-F5FA 8339B137
-F5FB 8339B138
-F5FC 8339B139
-F5FD 8339B230
-F5FE 8339B231
-F5FF 8339B232
-F600 8339B233
-F601 8339B234
-F602 8339B235
-F603 8339B236
-F604 8339B237
-F605 8339B238
-F606 8339B239
-F607 8339B330
-F608 8339B331
-F609 8339B332
-F60A 8339B333
-F60B 8339B334
-F60C 8339B335
-F60D 8339B336
-F60E 8339B337
-F60F 8339B338
-F610 8339B339
-F611 8339B430
-F612 8339B431
-F613 8339B432
-F614 8339B433
-F615 8339B434
-F616 8339B435
-F617 8339B436
-F618 8339B437
-F619 8339B438
-F61A 8339B439
-F61B 8339B530
-F61C 8339B531
-F61D 8339B532
-F61E 8339B533
-F61F 8339B534
-F620 8339B535
-F621 8339B536
-F622 8339B537
-F623 8339B538
-F624 8339B539
-F625 8339B630
-F626 8339B631
-F627 8339B632
-F628 8339B633
-F629 8339B634
-F62A 8339B635
-F62B 8339B636
-F62C 8339B637
-F62D 8339B638
-F62E 8339B639
-F62F 8339B730
-F630 8339B731
-F631 8339B732
-F632 8339B733
-F633 8339B734
-F634 8339B735
-F635 8339B736
-F636 8339B737
-F637 8339B738
-F638 8339B739
-F639 8339B830
-F63A 8339B831
-F63B 8339B832
-F63C 8339B833
-F63D 8339B834
-F63E 8339B835
-F63F 8339B836
-F640 8339B837
-F641 8339B838
-F642 8339B839
-F643 8339B930
-F644 8339B931
-F645 8339B932
-F646 8339B933
-F647 8339B934
-F648 8339B935
-F649 8339B936
-F64A 8339B937
-F64B 8339B938
-F64C 8339B939
-F64D 8339BA30
-F64E 8339BA31
-F64F 8339BA32
-F650 8339BA33
-F651 8339BA34
-F652 8339BA35
-F653 8339BA36
-F654 8339BA37
-F655 8339BA38
-F656 8339BA39
-F657 8339BB30
-F658 8339BB31
-F659 8339BB32
-F65A 8339BB33
-F65B 8339BB34
-F65C 8339BB35
-F65D 8339BB36
-F65E 8339BB37
-F65F 8339BB38
-F660 8339BB39
-F661 8339BC30
-F662 8339BC31
-F663 8339BC32
-F664 8339BC33
-F665 8339BC34
-F666 8339BC35
-F667 8339BC36
-F668 8339BC37
-F669 8339BC38
-F66A 8339BC39
-F66B 8339BD30
-F66C 8339BD31
-F66D 8339BD32
-F66E 8339BD33
-F66F 8339BD34
-F670 8339BD35
-F671 8339BD36
-F672 8339BD37
-F673 8339BD38
-F674 8339BD39
-F675 8339BE30
-F676 8339BE31
-F677 8339BE32
-F678 8339BE33
-F679 8339BE34
-F67A 8339BE35
-F67B 8339BE36
-F67C 8339BE37
-F67D 8339BE38
-F67E 8339BE39
-F67F 8339BF30
-F680 8339BF31
-F681 8339BF32
-F682 8339BF33
-F683 8339BF34
-F684 8339BF35
-F685 8339BF36
-F686 8339BF37
-F687 8339BF38
-F688 8339BF39
-F689 8339C030
-F68A 8339C031
-F68B 8339C032
-F68C 8339C033
-F68D 8339C034
-F68E 8339C035
-F68F 8339C036
-F690 8339C037
-F691 8339C038
-F692 8339C039
-F693 8339C130
-F694 8339C131
-F695 8339C132
-F696 8339C133
-F697 8339C134
-F698 8339C135
-F699 8339C136
-F69A 8339C137
-F69B 8339C138
-F69C 8339C139
-F69D 8339C230
-F69E 8339C231
-F69F 8339C232
-F6A0 8339C233
-F6A1 8339C234
-F6A2 8339C235
-F6A3 8339C236
-F6A4 8339C237
-F6A5 8339C238
-F6A6 8339C239
-F6A7 8339C330
-F6A8 8339C331
-F6A9 8339C332
-F6AA 8339C333
-F6AB 8339C334
-F6AC 8339C335
-F6AD 8339C336
-F6AE 8339C337
-F6AF 8339C338
-F6B0 8339C339
-F6B1 8339C430
-F6B2 8339C431
-F6B3 8339C432
-F6B4 8339C433
-F6B5 8339C434
-F6B6 8339C435
-F6B7 8339C436
-F6B8 8339C437
-F6B9 8339C438
-F6BA 8339C439
-F6BB 8339C530
-F6BC 8339C531
-F6BD 8339C532
-F6BE 8339C533
-F6BF 8339C534
-F6C0 8339C535
-F6C1 8339C536
-F6C2 8339C537
-F6C3 8339C538
-F6C4 8339C539
-F6C5 8339C630
-F6C6 8339C631
-F6C7 8339C632
-F6C8 8339C633
-F6C9 8339C634
-F6CA 8339C635
-F6CB 8339C636
-F6CC 8339C637
-F6CD 8339C638
-F6CE 8339C639
-F6CF 8339C730
-F6D0 8339C731
-F6D1 8339C732
-F6D2 8339C733
-F6D3 8339C734
-F6D4 8339C735
-F6D5 8339C736
-F6D6 8339C737
-F6D7 8339C738
-F6D8 8339C739
-F6D9 8339C830
-F6DA 8339C831
-F6DB 8339C832
-F6DC 8339C833
-F6DD 8339C834
-F6DE 8339C835
-F6DF 8339C836
-F6E0 8339C837
-F6E1 8339C838
-F6E2 8339C839
-F6E3 8339C930
-F6E4 8339C931
-F6E5 8339C932
-F6E6 8339C933
-F6E7 8339C934
-F6E8 8339C935
-F6E9 8339C936
-F6EA 8339C937
-F6EB 8339C938
-F6EC 8339C939
-F6ED 8339CA30
-F6EE 8339CA31
-F6EF 8339CA32
-F6F0 8339CA33
-F6F1 8339CA34
-F6F2 8339CA35
-F6F3 8339CA36
-F6F4 8339CA37
-F6F5 8339CA38
-F6F6 8339CA39
-F6F7 8339CB30
-F6F8 8339CB31
-F6F9 8339CB32
-F6FA 8339CB33
-F6FB 8339CB34
-F6FC 8339CB35
-F6FD 8339CB36
-F6FE 8339CB37
-F6FF 8339CB38
-F700 8339CB39
-F701 8339CC30
-F702 8339CC31
-F703 8339CC32
-F704 8339CC33
-F705 8339CC34
-F706 8339CC35
-F707 8339CC36
-F708 8339CC37
-F709 8339CC38
-F70A 8339CC39
-F70B 8339CD30
-F70C 8339CD31
-F70D 8339CD32
-F70E 8339CD33
-F70F 8339CD34
-F710 8339CD35
-F711 8339CD36
-F712 8339CD37
-F713 8339CD38
-F714 8339CD39
-F715 8339CE30
-F716 8339CE31
-F717 8339CE32
-F718 8339CE33
-F719 8339CE34
-F71A 8339CE35
-F71B 8339CE36
-F71C 8339CE37
-F71D 8339CE38
-F71E 8339CE39
-F71F 8339CF30
-F720 8339CF31
-F721 8339CF32
-F722 8339CF33
-F723 8339CF34
-F724 8339CF35
-F725 8339CF36
-F726 8339CF37
-F727 8339CF38
-F728 8339CF39
-F729 8339D030
-F72A 8339D031
-F72B 8339D032
-F72C 8339D033
-F72D 8339D034
-F72E 8339D035
-F72F 8339D036
-F730 8339D037
-F731 8339D038
-F732 8339D039
-F733 8339D130
-F734 8339D131
-F735 8339D132
-F736 8339D133
-F737 8339D134
-F738 8339D135
-F739 8339D136
-F73A 8339D137
-F73B 8339D138
-F73C 8339D139
-F73D 8339D230
-F73E 8339D231
-F73F 8339D232
-F740 8339D233
-F741 8339D234
-F742 8339D235
-F743 8339D236
-F744 8339D237
-F745 8339D238
-F746 8339D239
-F747 8339D330
-F748 8339D331
-F749 8339D332
-F74A 8339D333
-F74B 8339D334
-F74C 8339D335
-F74D 8339D336
-F74E 8339D337
-F74F 8339D338
-F750 8339D339
-F751 8339D430
-F752 8339D431
-F753 8339D432
-F754 8339D433
-F755 8339D434
-F756 8339D435
-F757 8339D436
-F758 8339D437
-F759 8339D438
-F75A 8339D439
-F75B 8339D530
-F75C 8339D531
-F75D 8339D532
-F75E 8339D533
-F75F 8339D534
-F760 8339D535
-F761 8339D536
-F762 8339D537
-F763 8339D538
-F764 8339D539
-F765 8339D630
-F766 8339D631
-F767 8339D632
-F768 8339D633
-F769 8339D634
-F76A 8339D635
-F76B 8339D636
-F76C 8339D637
-F76D 8339D638
-F76E 8339D639
-F76F 8339D730
-F770 8339D731
-F771 8339D732
-F772 8339D733
-F773 8339D734
-F774 8339D735
-F775 8339D736
-F776 8339D737
-F777 8339D738
-F778 8339D739
-F779 8339D830
-F77A 8339D831
-F77B 8339D832
-F77C 8339D833
-F77D 8339D834
-F77E 8339D835
-F77F 8339D836
-F780 8339D837
-F781 8339D838
-F782 8339D839
-F783 8339D930
-F784 8339D931
-F785 8339D932
-F786 8339D933
-F787 8339D934
-F788 8339D935
-F789 8339D936
-F78A 8339D937
-F78B 8339D938
-F78C 8339D939
-F78D 8339DA30
-F78E 8339DA31
-F78F 8339DA32
-F790 8339DA33
-F791 8339DA34
-F792 8339DA35
-F793 8339DA36
-F794 8339DA37
-F795 8339DA38
-F796 8339DA39
-F797 8339DB30
-F798 8339DB31
-F799 8339DB32
-F79A 8339DB33
-F79B 8339DB34
-F79C 8339DB35
-F79D 8339DB36
-F79E 8339DB37
-F79F 8339DB38
-F7A0 8339DB39
-F7A1 8339DC30
-F7A2 8339DC31
-F7A3 8339DC32
-F7A4 8339DC33
-F7A5 8339DC34
-F7A6 8339DC35
-F7A7 8339DC36
-F7A8 8339DC37
-F7A9 8339DC38
-F7AA 8339DC39
-F7AB 8339DD30
-F7AC 8339DD31
-F7AD 8339DD32
-F7AE 8339DD33
-F7AF 8339DD34
-F7B0 8339DD35
-F7B1 8339DD36
-F7B2 8339DD37
-F7B3 8339DD38
-F7B4 8339DD39
-F7B5 8339DE30
-F7B6 8339DE31
-F7B7 8339DE32
-F7B8 8339DE33
-F7B9 8339DE34
-F7BA 8339DE35
-F7BB 8339DE36
-F7BC 8339DE37
-F7BD 8339DE38
-F7BE 8339DE39
-F7BF 8339DF30
-F7C0 8339DF31
-F7C1 8339DF32
-F7C2 8339DF33
-F7C3 8339DF34
-F7C4 8339DF35
-F7C5 8339DF36
-F7C6 8339DF37
-F7C7 8339DF38
-F7C8 8339DF39
-F7C9 8339E030
-F7CA 8339E031
-F7CB 8339E032
-F7CC 8339E033
-F7CD 8339E034
-F7CE 8339E035
-F7CF 8339E036
-F7D0 8339E037
-F7D1 8339E038
-F7D2 8339E039
-F7D3 8339E130
-F7D4 8339E131
-F7D5 8339E132
-F7D6 8339E133
-F7D7 8339E134
-F7D8 8339E135
-F7D9 8339E136
-F7DA 8339E137
-F7DB 8339E138
-F7DC 8339E139
-F7DD 8339E230
-F7DE 8339E231
-F7DF 8339E232
-F7E0 8339E233
-F7E1 8339E234
-F7E2 8339E235
-F7E3 8339E236
-F7E4 8339E237
-F7E5 8339E238
-F7E6 8339E239
-F7E7 8339E330
-F7E8 8339E331
-F7E9 8339E332
-F7EA 8339E333
-F7EB 8339E334
-F7EC 8339E335
-F7ED 8339E336
-F7EE 8339E337
-F7EF 8339E338
-F7F0 8339E339
-F7F1 8339E430
-F7F2 8339E431
-F7F3 8339E432
-F7F4 8339E433
-F7F5 8339E434
-F7F6 8339E435
-F7F7 8339E436
-F7F8 8339E437
-F7F9 8339E438
-F7FA 8339E439
-F7FB 8339E530
-F7FC 8339E531
-F7FD 8339E532
-F7FE 8339E533
-F7FF 8339E534
-F800 8339E535
-F801 8339E536
-F802 8339E537
-F803 8339E538
-F804 8339E539
-F805 8339E630
-F806 8339E631
-F807 8339E632
-F808 8339E633
-F809 8339E634
-F80A 8339E635
-F80B 8339E636
-F80C 8339E637
-F80D 8339E638
-F80E 8339E639
-F80F 8339E730
-F810 8339E731
-F811 8339E732
-F812 8339E733
-F813 8339E734
-F814 8339E735
-F815 8339E736
-F816 8339E737
-F817 8339E738
-F818 8339E739
-F819 8339E830
-F81A 8339E831
-F81B 8339E832
-F81C 8339E833
-F81D 8339E834
-F81E 8339E835
-F81F 8339E836
-F820 8339E837
-F821 8339E838
-F822 8339E839
-F823 8339E930
-F824 8339E931
-F825 8339E932
-F826 8339E933
-F827 8339E934
-F828 8339E935
-F829 8339E936
-F82A 8339E937
-F82B 8339E938
-F82C 8339E939
-F82D 8339EA30
-F82E 8339EA31
-F82F 8339EA32
-F830 8339EA33
-F831 8339EA34
-F832 8339EA35
-F833 8339EA36
-F834 8339EA37
-F835 8339EA38
-F836 8339EA39
-F837 8339EB30
-F838 8339EB31
-F839 8339EB32
-F83A 8339EB33
-F83B 8339EB34
-F83C 8339EB35
-F83D 8339EB36
-F83E 8339EB37
-F83F 8339EB38
-F840 8339EB39
-F841 8339EC30
-F842 8339EC31
-F843 8339EC32
-F844 8339EC33
-F845 8339EC34
-F846 8339EC35
-F847 8339EC36
-F848 8339EC37
-F849 8339EC38
-F84A 8339EC39
-F84B 8339ED30
-F84C 8339ED31
-F84D 8339ED32
-F84E 8339ED33
-F84F 8339ED34
-F850 8339ED35
-F851 8339ED36
-F852 8339ED37
-F853 8339ED38
-F854 8339ED39
-F855 8339EE30
-F856 8339EE31
-F857 8339EE32
-F858 8339EE33
-F859 8339EE34
-F85A 8339EE35
-F85B 8339EE36
-F85C 8339EE37
-F85D 8339EE38
-F85E 8339EE39
-F85F 8339EF30
-F860 8339EF31
-F861 8339EF32
-F862 8339EF33
-F863 8339EF34
-F864 8339EF35
-F865 8339EF36
-F866 8339EF37
-F867 8339EF38
-F868 8339EF39
-F869 8339F030
-F86A 8339F031
-F86B 8339F032
-F86C 8339F033
-F86D 8339F034
-F86E 8339F035
-F86F 8339F036
-F870 8339F037
-F871 8339F038
-F872 8339F039
-F873 8339F130
-F874 8339F131
-F875 8339F132
-F876 8339F133
-F877 8339F134
-F878 8339F135
-F879 8339F136
-F87A 8339F137
-F87B 8339F138
-F87C 8339F139
-F87D 8339F230
-F87E 8339F231
-F87F 8339F232
-F880 8339F233
-F881 8339F234
-F882 8339F235
-F883 8339F236
-F884 8339F237
-F885 8339F238
-F886 8339F239
-F887 8339F330
-F888 8339F331
-F889 8339F332
-F88A 8339F333
-F88B 8339F334
-F88C 8339F335
-F88D 8339F336
-F88E 8339F337
-F88F 8339F338
-F890 8339F339
-F891 8339F430
-F892 8339F431
-F893 8339F432
-F894 8339F433
-F895 8339F434
-F896 8339F435
-F897 8339F436
-F898 8339F437
-F899 8339F438
-F89A 8339F439
-F89B 8339F530
-F89C 8339F531
-F89D 8339F532
-F89E 8339F533
-F89F 8339F534
-F8A0 8339F535
-F8A1 8339F536
-F8A2 8339F537
-F8A3 8339F538
-F8A4 8339F539
-F8A5 8339F630
-F8A6 8339F631
-F8A7 8339F632
-F8A8 8339F633
-F8A9 8339F634
-F8AA 8339F635
-F8AB 8339F636
-F8AC 8339F637
-F8AD 8339F638
-F8AE 8339F639
-F8AF 8339F730
-F8B0 8339F731
-F8B1 8339F732
-F8B2 8339F733
-F8B3 8339F734
-F8B4 8339F735
-F8B5 8339F736
-F8B6 8339F737
-F8B7 8339F738
-F8B8 8339F739
-F8B9 8339F830
-F8BA 8339F831
-F8BB 8339F832
-F8BC 8339F833
-F8BD 8339F834
-F8BE 8339F835
-F8BF 8339F836
-F8C0 8339F837
-F8C1 8339F838
-F8C2 8339F839
-F8C3 8339F930
-F8C4 8339F931
-F8C5 8339F932
-F8C6 8339F933
-F8C7 8339F934
-F8C8 8339F935
-F8C9 8339F936
-F8CA 8339F937
-F8CB 8339F938
-F8CC 8339F939
-F8CD 8339FA30
-F8CE 8339FA31
-F8CF 8339FA32
-F8D0 8339FA33
-F8D1 8339FA34
-F8D2 8339FA35
-F8D3 8339FA36
-F8D4 8339FA37
-F8D5 8339FA38
-F8D6 8339FA39
-F8D7 8339FB30
-F8D8 8339FB31
-F8D9 8339FB32
-F8DA 8339FB33
-F8DB 8339FB34
-F8DC 8339FB35
-F8DD 8339FB36
-F8DE 8339FB37
-F8DF 8339FB38
-F8E0 8339FB39
-F8E1 8339FC30
-F8E2 8339FC31
-F8E3 8339FC32
-F8E4 8339FC33
-F8E5 8339FC34
-F8E6 8339FC35
-F8E7 8339FC36
-F8E8 8339FC37
-F8E9 8339FC38
-F8EA 8339FC39
-F8EB 8339FD30
-F8EC 8339FD31
-F8ED 8339FD32
-F8EE 8339FD33
-F8EF 8339FD34
-F8F0 8339FD35
-F8F1 8339FD36
-F8F2 8339FD37
-F8F3 8339FD38
-F8F4 8339FD39
-F8F5 8339FE30
-F8F6 8339FE31
-F8F7 8339FE32
-F8F8 8339FE33
-F8F9 8339FE34
-F8FA 8339FE35
-F8FB 8339FE36
-F8FC 8339FE37
-F8FD 8339FE38
-F8FE 8339FE39
-F8FF 84308130
-F900 84308131
-F901 84308132
-F902 84308133
-F903 84308134
-F904 84308135
-F905 84308136
-F906 84308137
-F907 84308138
-F908 84308139
-F909 84308230
-F90A 84308231
-F90B 84308232
-F90C 84308233
-F90D 84308234
-F90E 84308235
-F90F 84308236
-F910 84308237
-F911 84308238
-F912 84308239
-F913 84308330
-F914 84308331
-F915 84308332
-F916 84308333
-F917 84308334
-F918 84308335
-F919 84308336
-F91A 84308337
-F91B 84308338
-F91C 84308339
-F91D 84308430
-F91E 84308431
-F91F 84308432
-F920 84308433
-F921 84308434
-F922 84308435
-F923 84308436
-F924 84308437
-F925 84308438
-F926 84308439
-F927 84308530
-F928 84308531
-F929 84308532
-F92A 84308533
-F92B 84308534
-F92C FD9C
-F92D 84308535
-F92E 84308536
-F92F 84308537
-F930 84308538
-F931 84308539
-F932 84308630
-F933 84308631
-F934 84308632
-F935 84308633
-F936 84308634
-F937 84308635
-F938 84308636
-F939 84308637
-F93A 84308638
-F93B 84308639
-F93C 84308730
-F93D 84308731
-F93E 84308732
-F93F 84308733
-F940 84308734
-F941 84308735
-F942 84308736
-F943 84308737
-F944 84308738
-F945 84308739
-F946 84308830
-F947 84308831
-F948 84308832
-F949 84308833
-F94A 84308834
-F94B 84308835
-F94C 84308836
-F94D 84308837
-F94E 84308838
-F94F 84308839
-F950 84308930
-F951 84308931
-F952 84308932
-F953 84308933
-F954 84308934
-F955 84308935
-F956 84308936
-F957 84308937
-F958 84308938
-F959 84308939
-F95A 84308A30
-F95B 84308A31
-F95C 84308A32
-F95D 84308A33
-F95E 84308A34
-F95F 84308A35
-F960 84308A36
-F961 84308A37
-F962 84308A38
-F963 84308A39
-F964 84308B30
-F965 84308B31
-F966 84308B32
-F967 84308B33
-F968 84308B34
-F969 84308B35
-F96A 84308B36
-F96B 84308B37
-F96C 84308B38
-F96D 84308B39
-F96E 84308C30
-F96F 84308C31
-F970 84308C32
-F971 84308C33
-F972 84308C34
-F973 84308C35
-F974 84308C36
-F975 84308C37
-F976 84308C38
-F977 84308C39
-F978 84308D30
-F979 FD9D
-F97A 84308D31
-F97B 84308D32
-F97C 84308D33
-F97D 84308D34
-F97E 84308D35
-F97F 84308D36
-F980 84308D37
-F981 84308D38
-F982 84308D39
-F983 84308E30
-F984 84308E31
-F985 84308E32
-F986 84308E33
-F987 84308E34
-F988 84308E35
-F989 84308E36
-F98A 84308E37
-F98B 84308E38
-F98C 84308E39
-F98D 84308F30
-F98E 84308F31
-F98F 84308F32
-F990 84308F33
-F991 84308F34
-F992 84308F35
-F993 84308F36
-F994 84308F37
-F995 FD9E
-F996 84308F38
-F997 84308F39
-F998 84309030
-F999 84309031
-F99A 84309032
-F99B 84309033
-F99C 84309034
-F99D 84309035
-F99E 84309036
-F99F 84309037
-F9A0 84309038
-F9A1 84309039
-F9A2 84309130
-F9A3 84309131
-F9A4 84309132
-F9A5 84309133
-F9A6 84309134
-F9A7 84309135
-F9A8 84309136
-F9A9 84309137
-F9AA 84309138
-F9AB 84309139
-F9AC 84309230
-F9AD 84309231
-F9AE 84309232
-F9AF 84309233
-F9B0 84309234
-F9B1 84309235
-F9B2 84309236
-F9B3 84309237
-F9B4 84309238
-F9B5 84309239
-F9B6 84309330
-F9B7 84309331
-F9B8 84309332
-F9B9 84309333
-F9BA 84309334
-F9BB 84309335
-F9BC 84309336
-F9BD 84309337
-F9BE 84309338
-F9BF 84309339
-F9C0 84309430
-F9C1 84309431
-F9C2 84309432
-F9C3 84309433
-F9C4 84309434
-F9C5 84309435
-F9C6 84309436
-F9C7 84309437
-F9C8 84309438
-F9C9 84309439
-F9CA 84309530
-F9CB 84309531
-F9CC 84309532
-F9CD 84309533
-F9CE 84309534
-F9CF 84309535
-F9D0 84309536
-F9D1 84309537
-F9D2 84309538
-F9D3 84309539
-F9D4 84309630
-F9D5 84309631
-F9D6 84309632
-F9D7 84309633
-F9D8 84309634
-F9D9 84309635
-F9DA 84309636
-F9DB 84309637
-F9DC 84309638
-F9DD 84309639
-F9DE 84309730
-F9DF 84309731
-F9E0 84309732
-F9E1 84309733
-F9E2 84309734
-F9E3 84309735
-F9E4 84309736
-F9E5 84309737
-F9E6 84309738
-F9E7 FD9F
-F9E8 84309739
-F9E9 84309830
-F9EA 84309831
-F9EB 84309832
-F9EC 84309833
-F9ED 84309834
-F9EE 84309835
-F9EF 84309836
-F9F0 84309837
-F9F1 FDA0
-F9F2 84309838
-F9F3 84309839
-F9F4 84309930
-F9F5 84309931
-F9F6 84309932
-F9F7 84309933
-F9F8 84309934
-F9F9 84309935
-F9FA 84309936
-F9FB 84309937
-F9FC 84309938
-F9FD 84309939
-F9FE 84309A30
-F9FF 84309A31
-FA00 84309A32
-FA01 84309A33
-FA02 84309A34
-FA03 84309A35
-FA04 84309A36
-FA05 84309A37
-FA06 84309A38
-FA07 84309A39
-FA08 84309B30
-FA09 84309B31
-FA0A 84309B32
-FA0B 84309B33
-FA0C FE40
-FA0D FE41
-FA0E FE42
-FA0F FE43
-FA10 84309B34
-FA11 FE44
-FA12 84309B35
-FA13 FE45
-FA14 FE46
-FA15 84309B36
-FA16 84309B37
-FA17 84309B38
-FA18 FE47
-FA19 84309B39
-FA1A 84309C30
-FA1B 84309C31
-FA1C 84309C32
-FA1D 84309C33
-FA1E 84309C34
-FA1F FE48
-FA20 FE49
-FA21 FE4A
-FA22 84309C35
-FA23 FE4B
-FA24 FE4C
-FA25 84309C36
-FA26 84309C37
-FA27 FE4D
-FA28 FE4E
-FA29 FE4F
-FA2A 84309C38
-FA2B 84309C39
-FA2C 84309D30
-FA2D 84309D31
-FA2E 84309D32
-FA2F 84309D33
-FA30 84309D34
-FA31 84309D35
-FA32 84309D36
-FA33 84309D37
-FA34 84309D38
-FA35 84309D39
-FA36 84309E30
-FA37 84309E31
-FA38 84309E32
-FA39 84309E33
-FA3A 84309E34
-FA3B 84309E35
-FA3C 84309E36
-FA3D 84309E37
-FA3E 84309E38
-FA3F 84309E39
-FA40 84309F30
-FA41 84309F31
-FA42 84309F32
-FA43 84309F33
-FA44 84309F34
-FA45 84309F35
-FA46 84309F36
-FA47 84309F37
-FA48 84309F38
-FA49 84309F39
-FA4A 8430A030
-FA4B 8430A031
-FA4C 8430A032
-FA4D 8430A033
-FA4E 8430A034
-FA4F 8430A035
-FA50 8430A036
-FA51 8430A037
-FA52 8430A038
-FA53 8430A039
-FA54 8430A130
-FA55 8430A131
-FA56 8430A132
-FA57 8430A133
-FA58 8430A134
-FA59 8430A135
-FA5A 8430A136
-FA5B 8430A137
-FA5C 8430A138
-FA5D 8430A139
-FA5E 8430A230
-FA5F 8430A231
-FA60 8430A232
-FA61 8430A233
-FA62 8430A234
-FA63 8430A235
-FA64 8430A236
-FA65 8430A237
-FA66 8430A238
-FA67 8430A239
-FA68 8430A330
-FA69 8430A331
-FA6A 8430A332
-FA6B 8430A333
-FA6C 8430A334
-FA6D 8430A335
-FA6E 8430A336
-FA6F 8430A337
-FA70 8430A338
-FA71 8430A339
-FA72 8430A430
-FA73 8430A431
-FA74 8430A432
-FA75 8430A433
-FA76 8430A434
-FA77 8430A435
-FA78 8430A436
-FA79 8430A437
-FA7A 8430A438
-FA7B 8430A439
-FA7C 8430A530
-FA7D 8430A531
-FA7E 8430A532
-FA7F 8430A533
-FA80 8430A534
-FA81 8430A535
-FA82 8430A536
-FA83 8430A537
-FA84 8430A538
-FA85 8430A539
-FA86 8430A630
-FA87 8430A631
-FA88 8430A632
-FA89 8430A633
-FA8A 8430A634
-FA8B 8430A635
-FA8C 8430A636
-FA8D 8430A637
-FA8E 8430A638
-FA8F 8430A639
-FA90 8430A730
-FA91 8430A731
-FA92 8430A732
-FA93 8430A733
-FA94 8430A734
-FA95 8430A735
-FA96 8430A736
-FA97 8430A737
-FA98 8430A738
-FA99 8430A739
-FA9A 8430A830
-FA9B 8430A831
-FA9C 8430A832
-FA9D 8430A833
-FA9E 8430A834
-FA9F 8430A835
-FAA0 8430A836
-FAA1 8430A837
-FAA2 8430A838
-FAA3 8430A839
-FAA4 8430A930
-FAA5 8430A931
-FAA6 8430A932
-FAA7 8430A933
-FAA8 8430A934
-FAA9 8430A935
-FAAA 8430A936
-FAAB 8430A937
-FAAC 8430A938
-FAAD 8430A939
-FAAE 8430AA30
-FAAF 8430AA31
-FAB0 8430AA32
-FAB1 8430AA33
-FAB2 8430AA34
-FAB3 8430AA35
-FAB4 8430AA36
-FAB5 8430AA37
-FAB6 8430AA38
-FAB7 8430AA39
-FAB8 8430AB30
-FAB9 8430AB31
-FABA 8430AB32
-FABB 8430AB33
-FABC 8430AB34
-FABD 8430AB35
-FABE 8430AB36
-FABF 8430AB37
-FAC0 8430AB38
-FAC1 8430AB39
-FAC2 8430AC30
-FAC3 8430AC31
-FAC4 8430AC32
-FAC5 8430AC33
-FAC6 8430AC34
-FAC7 8430AC35
-FAC8 8430AC36
-FAC9 8430AC37
-FACA 8430AC38
-FACB 8430AC39
-FACC 8430AD30
-FACD 8430AD31
-FACE 8430AD32
-FACF 8430AD33
-FAD0 8430AD34
-FAD1 8430AD35
-FAD2 8430AD36
-FAD3 8430AD37
-FAD4 8430AD38
-FAD5 8430AD39
-FAD6 8430AE30
-FAD7 8430AE31
-FAD8 8430AE32
-FAD9 8430AE33
-FADA 8430AE34
-FADB 8430AE35
-FADC 8430AE36
-FADD 8430AE37
-FADE 8430AE38
-FADF 8430AE39
-FAE0 8430AF30
-FAE1 8430AF31
-FAE2 8430AF32
-FAE3 8430AF33
-FAE4 8430AF34
-FAE5 8430AF35
-FAE6 8430AF36
-FAE7 8430AF37
-FAE8 8430AF38
-FAE9 8430AF39
-FAEA 8430B030
-FAEB 8430B031
-FAEC 8430B032
-FAED 8430B033
-FAEE 8430B034
-FAEF 8430B035
-FAF0 8430B036
-FAF1 8430B037
-FAF2 8430B038
-FAF3 8430B039
-FAF4 8430B130
-FAF5 8430B131
-FAF6 8430B132
-FAF7 8430B133
-FAF8 8430B134
-FAF9 8430B135
-FAFA 8430B136
-FAFB 8430B137
-FAFC 8430B138
-FAFD 8430B139
-FAFE 8430B230
-FAFF 8430B231
-FB00 8430B232
-FB01 8430B233
-FB02 8430B234
-FB03 8430B235
-FB04 8430B236
-FB05 8430B237
-FB06 8430B238
-FB07 8430B239
-FB08 8430B330
-FB09 8430B331
-FB0A 8430B332
-FB0B 8430B333
-FB0C 8430B334
-FB0D 8430B335
-FB0E 8430B336
-FB0F 8430B337
-FB10 8430B338
-FB11 8430B339
-FB12 8430B430
-FB13 8430B431
-FB14 8430B432
-FB15 8430B433
-FB16 8430B434
-FB17 8430B435
-FB18 8430B436
-FB19 8430B437
-FB1A 8430B438
-FB1B 8430B439
-FB1C 8430B530
-FB1D 8430B531
-FB1E 8430B532
-FB1F 8430B533
-FB20 8430B534
-FB21 8430B535
-FB22 8430B536
-FB23 8430B537
-FB24 8430B538
-FB25 8430B539
-FB26 8430B630
-FB27 8430B631
-FB28 8430B632
-FB29 8430B633
-FB2A 8430B634
-FB2B 8430B635
-FB2C 8430B636
-FB2D 8430B637
-FB2E 8430B638
-FB2F 8430B639
-FB30 8430B730
-FB31 8430B731
-FB32 8430B732
-FB33 8430B733
-FB34 8430B734
-FB35 8430B735
-FB36 8430B736
-FB37 8430B737
-FB38 8430B738
-FB39 8430B739
-FB3A 8430B830
-FB3B 8430B831
-FB3C 8430B832
-FB3D 8430B833
-FB3E 8430B834
-FB3F 8430B835
-FB40 8430B836
-FB41 8430B837
-FB42 8430B838
-FB43 8430B839
-FB44 8430B930
-FB45 8430B931
-FB46 8430B932
-FB47 8430B933
-FB48 8430B934
-FB49 8430B935
-FB4A 8430B936
-FB4B 8430B937
-FB4C 8430B938
-FB4D 8430B939
-FB4E 8430BA30
-FB4F 8430BA31
-FB50 8430BA32
-FB51 8430BA33
-FB52 8430BA34
-FB53 8430BA35
-FB54 8430BA36
-FB55 8430BA37
-FB56 8430BA38
-FB57 8430BA39
-FB58 8430BB30
-FB59 8430BB31
-FB5A 8430BB32
-FB5B 8430BB33
-FB5C 8430BB34
-FB5D 8430BB35
-FB5E 8430BB36
-FB5F 8430BB37
-FB60 8430BB38
-FB61 8430BB39
-FB62 8430BC30
-FB63 8430BC31
-FB64 8430BC32
-FB65 8430BC33
-FB66 8430BC34
-FB67 8430BC35
-FB68 8430BC36
-FB69 8430BC37
-FB6A 8430BC38
-FB6B 8430BC39
-FB6C 8430BD30
-FB6D 8430BD31
-FB6E 8430BD32
-FB6F 8430BD33
-FB70 8430BD34
-FB71 8430BD35
-FB72 8430BD36
-FB73 8430BD37
-FB74 8430BD38
-FB75 8430BD39
-FB76 8430BE30
-FB77 8430BE31
-FB78 8430BE32
-FB79 8430BE33
-FB7A 8430BE34
-FB7B 8430BE35
-FB7C 8430BE36
-FB7D 8430BE37
-FB7E 8430BE38
-FB7F 8430BE39
-FB80 8430BF30
-FB81 8430BF31
-FB82 8430BF32
-FB83 8430BF33
-FB84 8430BF34
-FB85 8430BF35
-FB86 8430BF36
-FB87 8430BF37
-FB88 8430BF38
-FB89 8430BF39
-FB8A 8430C030
-FB8B 8430C031
-FB8C 8430C032
-FB8D 8430C033
-FB8E 8430C034
-FB8F 8430C035
-FB90 8430C036
-FB91 8430C037
-FB92 8430C038
-FB93 8430C039
-FB94 8430C130
-FB95 8430C131
-FB96 8430C132
-FB97 8430C133
-FB98 8430C134
-FB99 8430C135
-FB9A 8430C136
-FB9B 8430C137
-FB9C 8430C138
-FB9D 8430C139
-FB9E 8430C230
-FB9F 8430C231
-FBA0 8430C232
-FBA1 8430C233
-FBA2 8430C234
-FBA3 8430C235
-FBA4 8430C236
-FBA5 8430C237
-FBA6 8430C238
-FBA7 8430C239
-FBA8 8430C330
-FBA9 8430C331
-FBAA 8430C332
-FBAB 8430C333
-FBAC 8430C334
-FBAD 8430C335
-FBAE 8430C336
-FBAF 8430C337
-FBB0 8430C338
-FBB1 8430C339
-FBB2 8430C430
-FBB3 8430C431
-FBB4 8430C432
-FBB5 8430C433
-FBB6 8430C434
-FBB7 8430C435
-FBB8 8430C436
-FBB9 8430C437
-FBBA 8430C438
-FBBB 8430C439
-FBBC 8430C530
-FBBD 8430C531
-FBBE 8430C532
-FBBF 8430C533
-FBC0 8430C534
-FBC1 8430C535
-FBC2 8430C536
-FBC3 8430C537
-FBC4 8430C538
-FBC5 8430C539
-FBC6 8430C630
-FBC7 8430C631
-FBC8 8430C632
-FBC9 8430C633
-FBCA 8430C634
-FBCB 8430C635
-FBCC 8430C636
-FBCD 8430C637
-FBCE 8430C638
-FBCF 8430C639
-FBD0 8430C730
-FBD1 8430C731
-FBD2 8430C732
-FBD3 8430C733
-FBD4 8430C734
-FBD5 8430C735
-FBD6 8430C736
-FBD7 8430C737
-FBD8 8430C738
-FBD9 8430C739
-FBDA 8430C830
-FBDB 8430C831
-FBDC 8430C832
-FBDD 8430C833
-FBDE 8430C834
-FBDF 8430C835
-FBE0 8430C836
-FBE1 8430C837
-FBE2 8430C838
-FBE3 8430C839
-FBE4 8430C930
-FBE5 8430C931
-FBE6 8430C932
-FBE7 8430C933
-FBE8 8430C934
-FBE9 8430C935
-FBEA 8430C936
-FBEB 8430C937
-FBEC 8430C938
-FBED 8430C939
-FBEE 8430CA30
-FBEF 8430CA31
-FBF0 8430CA32
-FBF1 8430CA33
-FBF2 8430CA34
-FBF3 8430CA35
-FBF4 8430CA36
-FBF5 8430CA37
-FBF6 8430CA38
-FBF7 8430CA39
-FBF8 8430CB30
-FBF9 8430CB31
-FBFA 8430CB32
-FBFB 8430CB33
-FBFC 8430CB34
-FBFD 8430CB35
-FBFE 8430CB36
-FBFF 8430CB37
-FC00 8430CB38
-FC01 8430CB39
-FC02 8430CC30
-FC03 8430CC31
-FC04 8430CC32
-FC05 8430CC33
-FC06 8430CC34
-FC07 8430CC35
-FC08 8430CC36
-FC09 8430CC37
-FC0A 8430CC38
-FC0B 8430CC39
-FC0C 8430CD30
-FC0D 8430CD31
-FC0E 8430CD32
-FC0F 8430CD33
-FC10 8430CD34
-FC11 8430CD35
-FC12 8430CD36
-FC13 8430CD37
-FC14 8430CD38
-FC15 8430CD39
-FC16 8430CE30
-FC17 8430CE31
-FC18 8430CE32
-FC19 8430CE33
-FC1A 8430CE34
-FC1B 8430CE35
-FC1C 8430CE36
-FC1D 8430CE37
-FC1E 8430CE38
-FC1F 8430CE39
-FC20 8430CF30
-FC21 8430CF31
-FC22 8430CF32
-FC23 8430CF33
-FC24 8430CF34
-FC25 8430CF35
-FC26 8430CF36
-FC27 8430CF37
-FC28 8430CF38
-FC29 8430CF39
-FC2A 8430D030
-FC2B 8430D031
-FC2C 8430D032
-FC2D 8430D033
-FC2E 8430D034
-FC2F 8430D035
-FC30 8430D036
-FC31 8430D037
-FC32 8430D038
-FC33 8430D039
-FC34 8430D130
-FC35 8430D131
-FC36 8430D132
-FC37 8430D133
-FC38 8430D134
-FC39 8430D135
-FC3A 8430D136
-FC3B 8430D137
-FC3C 8430D138
-FC3D 8430D139
-FC3E 8430D230
-FC3F 8430D231
-FC40 8430D232
-FC41 8430D233
-FC42 8430D234
-FC43 8430D235
-FC44 8430D236
-FC45 8430D237
-FC46 8430D238
-FC47 8430D239
-FC48 8430D330
-FC49 8430D331
-FC4A 8430D332
-FC4B 8430D333
-FC4C 8430D334
-FC4D 8430D335
-FC4E 8430D336
-FC4F 8430D337
-FC50 8430D338
-FC51 8430D339
-FC52 8430D430
-FC53 8430D431
-FC54 8430D432
-FC55 8430D433
-FC56 8430D434
-FC57 8430D435
-FC58 8430D436
-FC59 8430D437
-FC5A 8430D438
-FC5B 8430D439
-FC5C 8430D530
-FC5D 8430D531
-FC5E 8430D532
-FC5F 8430D533
-FC60 8430D534
-FC61 8430D535
-FC62 8430D536
-FC63 8430D537
-FC64 8430D538
-FC65 8430D539
-FC66 8430D630
-FC67 8430D631
-FC68 8430D632
-FC69 8430D633
-FC6A 8430D634
-FC6B 8430D635
-FC6C 8430D636
-FC6D 8430D637
-FC6E 8430D638
-FC6F 8430D639
-FC70 8430D730
-FC71 8430D731
-FC72 8430D732
-FC73 8430D733
-FC74 8430D734
-FC75 8430D735
-FC76 8430D736
-FC77 8430D737
-FC78 8430D738
-FC79 8430D739
-FC7A 8430D830
-FC7B 8430D831
-FC7C 8430D832
-FC7D 8430D833
-FC7E 8430D834
-FC7F 8430D835
-FC80 8430D836
-FC81 8430D837
-FC82 8430D838
-FC83 8430D839
-FC84 8430D930
-FC85 8430D931
-FC86 8430D932
-FC87 8430D933
-FC88 8430D934
-FC89 8430D935
-FC8A 8430D936
-FC8B 8430D937
-FC8C 8430D938
-FC8D 8430D939
-FC8E 8430DA30
-FC8F 8430DA31
-FC90 8430DA32
-FC91 8430DA33
-FC92 8430DA34
-FC93 8430DA35
-FC94 8430DA36
-FC95 8430DA37
-FC96 8430DA38
-FC97 8430DA39
-FC98 8430DB30
-FC99 8430DB31
-FC9A 8430DB32
-FC9B 8430DB33
-FC9C 8430DB34
-FC9D 8430DB35
-FC9E 8430DB36
-FC9F 8430DB37
-FCA0 8430DB38
-FCA1 8430DB39
-FCA2 8430DC30
-FCA3 8430DC31
-FCA4 8430DC32
-FCA5 8430DC33
-FCA6 8430DC34
-FCA7 8430DC35
-FCA8 8430DC36
-FCA9 8430DC37
-FCAA 8430DC38
-FCAB 8430DC39
-FCAC 8430DD30
-FCAD 8430DD31
-FCAE 8430DD32
-FCAF 8430DD33
-FCB0 8430DD34
-FCB1 8430DD35
-FCB2 8430DD36
-FCB3 8430DD37
-FCB4 8430DD38
-FCB5 8430DD39
-FCB6 8430DE30
-FCB7 8430DE31
-FCB8 8430DE32
-FCB9 8430DE33
-FCBA 8430DE34
-FCBB 8430DE35
-FCBC 8430DE36
-FCBD 8430DE37
-FCBE 8430DE38
-FCBF 8430DE39
-FCC0 8430DF30
-FCC1 8430DF31
-FCC2 8430DF32
-FCC3 8430DF33
-FCC4 8430DF34
-FCC5 8430DF35
-FCC6 8430DF36
-FCC7 8430DF37
-FCC8 8430DF38
-FCC9 8430DF39
-FCCA 8430E030
-FCCB 8430E031
-FCCC 8430E032
-FCCD 8430E033
-FCCE 8430E034
-FCCF 8430E035
-FCD0 8430E036
-FCD1 8430E037
-FCD2 8430E038
-FCD3 8430E039
-FCD4 8430E130
-FCD5 8430E131
-FCD6 8430E132
-FCD7 8430E133
-FCD8 8430E134
-FCD9 8430E135
-FCDA 8430E136
-FCDB 8430E137
-FCDC 8430E138
-FCDD 8430E139
-FCDE 8430E230
-FCDF 8430E231
-FCE0 8430E232
-FCE1 8430E233
-FCE2 8430E234
-FCE3 8430E235
-FCE4 8430E236
-FCE5 8430E237
-FCE6 8430E238
-FCE7 8430E239
-FCE8 8430E330
-FCE9 8430E331
-FCEA 8430E332
-FCEB 8430E333
-FCEC 8430E334
-FCED 8430E335
-FCEE 8430E336
-FCEF 8430E337
-FCF0 8430E338
-FCF1 8430E339
-FCF2 8430E430
-FCF3 8430E431
-FCF4 8430E432
-FCF5 8430E433
-FCF6 8430E434
-FCF7 8430E435
-FCF8 8430E436
-FCF9 8430E437
-FCFA 8430E438
-FCFB 8430E439
-FCFC 8430E530
-FCFD 8430E531
-FCFE 8430E532
-FCFF 8430E533
-FD00 8430E534
-FD01 8430E535
-FD02 8430E536
-FD03 8430E537
-FD04 8430E538
-FD05 8430E539
-FD06 8430E630
-FD07 8430E631
-FD08 8430E632
-FD09 8430E633
-FD0A 8430E634
-FD0B 8430E635
-FD0C 8430E636
-FD0D 8430E637
-FD0E 8430E638
-FD0F 8430E639
-FD10 8430E730
-FD11 8430E731
-FD12 8430E732
-FD13 8430E733
-FD14 8430E734
-FD15 8430E735
-FD16 8430E736
-FD17 8430E737
-FD18 8430E738
-FD19 8430E739
-FD1A 8430E830
-FD1B 8430E831
-FD1C 8430E832
-FD1D 8430E833
-FD1E 8430E834
-FD1F 8430E835
-FD20 8430E836
-FD21 8430E837
-FD22 8430E838
-FD23 8430E839
-FD24 8430E930
-FD25 8430E931
-FD26 8430E932
-FD27 8430E933
-FD28 8430E934
-FD29 8430E935
-FD2A 8430E936
-FD2B 8430E937
-FD2C 8430E938
-FD2D 8430E939
-FD2E 8430EA30
-FD2F 8430EA31
-FD30 8430EA32
-FD31 8430EA33
-FD32 8430EA34
-FD33 8430EA35
-FD34 8430EA36
-FD35 8430EA37
-FD36 8430EA38
-FD37 8430EA39
-FD38 8430EB30
-FD39 8430EB31
-FD3A 8430EB32
-FD3B 8430EB33
-FD3C 8430EB34
-FD3D 8430EB35
-FD3E 8430EB36
-FD3F 8430EB37
-FD40 8430EB38
-FD41 8430EB39
-FD42 8430EC30
-FD43 8430EC31
-FD44 8430EC32
-FD45 8430EC33
-FD46 8430EC34
-FD47 8430EC35
-FD48 8430EC36
-FD49 8430EC37
-FD4A 8430EC38
-FD4B 8430EC39
-FD4C 8430ED30
-FD4D 8430ED31
-FD4E 8430ED32
-FD4F 8430ED33
-FD50 8430ED34
-FD51 8430ED35
-FD52 8430ED36
-FD53 8430ED37
-FD54 8430ED38
-FD55 8430ED39
-FD56 8430EE30
-FD57 8430EE31
-FD58 8430EE32
-FD59 8430EE33
-FD5A 8430EE34
-FD5B 8430EE35
-FD5C 8430EE36
-FD5D 8430EE37
-FD5E 8430EE38
-FD5F 8430EE39
-FD60 8430EF30
-FD61 8430EF31
-FD62 8430EF32
-FD63 8430EF33
-FD64 8430EF34
-FD65 8430EF35
-FD66 8430EF36
-FD67 8430EF37
-FD68 8430EF38
-FD69 8430EF39
-FD6A 8430F030
-FD6B 8430F031
-FD6C 8430F032
-FD6D 8430F033
-FD6E 8430F034
-FD6F 8430F035
-FD70 8430F036
-FD71 8430F037
-FD72 8430F038
-FD73 8430F039
-FD74 8430F130
-FD75 8430F131
-FD76 8430F132
-FD77 8430F133
-FD78 8430F134
-FD79 8430F135
-FD7A 8430F136
-FD7B 8430F137
-FD7C 8430F138
-FD7D 8430F139
-FD7E 8430F230
-FD7F 8430F231
-FD80 8430F232
-FD81 8430F233
-FD82 8430F234
-FD83 8430F235
-FD84 8430F236
-FD85 8430F237
-FD86 8430F238
-FD87 8430F239
-FD88 8430F330
-FD89 8430F331
-FD8A 8430F332
-FD8B 8430F333
-FD8C 8430F334
-FD8D 8430F335
-FD8E 8430F336
-FD8F 8430F337
-FD90 8430F338
-FD91 8430F339
-FD92 8430F430
-FD93 8430F431
-FD94 8430F432
-FD95 8430F433
-FD96 8430F434
-FD97 8430F435
-FD98 8430F436
-FD99 8430F437
-FD9A 8430F438
-FD9B 8430F439
-FD9C 8430F530
-FD9D 8430F531
-FD9E 8430F532
-FD9F 8430F533
-FDA0 8430F534
-FDA1 8430F535
-FDA2 8430F536
-FDA3 8430F537
-FDA4 8430F538
-FDA5 8430F539
-FDA6 8430F630
-FDA7 8430F631
-FDA8 8430F632
-FDA9 8430F633
-FDAA 8430F634
-FDAB 8430F635
-FDAC 8430F636
-FDAD 8430F637
-FDAE 8430F638
-FDAF 8430F639
-FDB0 8430F730
-FDB1 8430F731
-FDB2 8430F732
-FDB3 8430F733
-FDB4 8430F734
-FDB5 8430F735
-FDB6 8430F736
-FDB7 8430F737
-FDB8 8430F738
-FDB9 8430F739
-FDBA 8430F830
-FDBB 8430F831
-FDBC 8430F832
-FDBD 8430F833
-FDBE 8430F834
-FDBF 8430F835
-FDC0 8430F836
-FDC1 8430F837
-FDC2 8430F838
-FDC3 8430F839
-FDC4 8430F930
-FDC5 8430F931
-FDC6 8430F932
-FDC7 8430F933
-FDC8 8430F934
-FDC9 8430F935
-FDCA 8430F936
-FDCB 8430F937
-FDCC 8430F938
-FDCD 8430F939
-FDCE 8430FA30
-FDCF 8430FA31
-FDD0 8430FA32
-FDD1 8430FA33
-FDD2 8430FA34
-FDD3 8430FA35
-FDD4 8430FA36
-FDD5 8430FA37
-FDD6 8430FA38
-FDD7 8430FA39
-FDD8 8430FB30
-FDD9 8430FB31
-FDDA 8430FB32
-FDDB 8430FB33
-FDDC 8430FB34
-FDDD 8430FB35
-FDDE 8430FB36
-FDDF 8430FB37
-FDE0 8430FB38
-FDE1 8430FB39
-FDE2 8430FC30
-FDE3 8430FC31
-FDE4 8430FC32
-FDE5 8430FC33
-FDE6 8430FC34
-FDE7 8430FC35
-FDE8 8430FC36
-FDE9 8430FC37
-FDEA 8430FC38
-FDEB 8430FC39
-FDEC 8430FD30
-FDED 8430FD31
-FDEE 8430FD32
-FDEF 8430FD33
-FDF0 8430FD34
-FDF1 8430FD35
-FDF2 8430FD36
-FDF3 8430FD37
-FDF4 8430FD38
-FDF5 8430FD39
-FDF6 8430FE30
-FDF7 8430FE31
-FDF8 8430FE32
-FDF9 8430FE33
-FDFA 8430FE34
-FDFB 8430FE35
-FDFC 8430FE36
-FDFD 8430FE37
-FDFE 8430FE38
-FDFF 8430FE39
-FE00 84318130
-FE01 84318131
-FE02 84318132
-FE03 84318133
-FE04 84318134
-FE05 84318135
-FE06 84318136
-FE07 84318137
-FE08 84318138
-FE09 84318139
-FE0A 84318230
-FE0B 84318231
-FE0C 84318232
-FE0D 84318233
-FE0E 84318234
-FE0F 84318235
-FE10 84318236
-FE11 84318237
-FE12 84318238
-FE13 84318239
-FE14 84318330
-FE15 84318331
-FE16 84318332
-FE17 84318333
-FE18 84318334
-FE19 84318335
-FE1A 84318336
-FE1B 84318337
-FE1C 84318338
-FE1D 84318339
-FE1E 84318430
-FE1F 84318431
-FE20 84318432
-FE21 84318433
-FE22 84318434
-FE23 84318435
-FE24 84318436
-FE25 84318437
-FE26 84318438
-FE27 84318439
-FE28 84318530
-FE29 84318531
-FE2A 84318532
-FE2B 84318533
-FE2C 84318534
-FE2D 84318535
-FE2E 84318536
-FE2F 84318537
-FE30 A955
-FE31 A6F2
-FE32 84318538
-FE33 A6F4
-FE34 A6F5
-FE35 A6E0
-FE36 A6E1
-FE37 A6F0
-FE38 A6F1
-FE39 A6E2
-FE3A A6E3
-FE3B A6EE
-FE3C A6EF
-FE3D A6E6
-FE3E A6E7
-FE3F A6E4
-FE40 A6E5
-FE41 A6E8
-FE42 A6E9
-FE43 A6EA
-FE44 A6EB
-FE45 84318539
-FE46 84318630
-FE47 84318631
-FE48 84318632
-FE49 A968
-FE4A A969
-FE4B A96A
-FE4C A96B
-FE4D A96C
-FE4E A96D
-FE4F A96E
-FE50 A96F
-FE51 A970
-FE52 A971
-FE53 84318633
-FE54 A972
-FE55 A973
-FE56 A974
-FE57 A975
-FE58 84318634
-FE59 A976
-FE5A A977
-FE5B A978
-FE5C A979
-FE5D A97A
-FE5E A97B
-FE5F A97C
-FE60 A97D
-FE61 A97E
-FE62 A980
-FE63 A981
-FE64 A982
-FE65 A983
-FE66 A984
-FE67 84318635
-FE68 A985
-FE69 A986
-FE6A A987
-FE6B A988
-FE6C 84318636
-FE6D 84318637
-FE6E 84318638
-FE6F 84318639
-FE70 84318730
-FE71 84318731
-FE72 84318732
-FE73 84318733
-FE74 84318734
-FE75 84318735
-FE76 84318736
-FE77 84318737
-FE78 84318738
-FE79 84318739
-FE7A 84318830
-FE7B 84318831
-FE7C 84318832
-FE7D 84318833
-FE7E 84318834
-FE7F 84318835
-FE80 84318836
-FE81 84318837
-FE82 84318838
-FE83 84318839
-FE84 84318930
-FE85 84318931
-FE86 84318932
-FE87 84318933
-FE88 84318934
-FE89 84318935
-FE8A 84318936
-FE8B 84318937
-FE8C 84318938
-FE8D 84318939
-FE8E 84318A30
-FE8F 84318A31
-FE90 84318A32
-FE91 84318A33
-FE92 84318A34
-FE93 84318A35
-FE94 84318A36
-FE95 84318A37
-FE96 84318A38
-FE97 84318A39
-FE98 84318B30
-FE99 84318B31
-FE9A 84318B32
-FE9B 84318B33
-FE9C 84318B34
-FE9D 84318B35
-FE9E 84318B36
-FE9F 84318B37
-FEA0 84318B38
-FEA1 84318B39
-FEA2 84318C30
-FEA3 84318C31
-FEA4 84318C32
-FEA5 84318C33
-FEA6 84318C34
-FEA7 84318C35
-FEA8 84318C36
-FEA9 84318C37
-FEAA 84318C38
-FEAB 84318C39
-FEAC 84318D30
-FEAD 84318D31
-FEAE 84318D32
-FEAF 84318D33
-FEB0 84318D34
-FEB1 84318D35
-FEB2 84318D36
-FEB3 84318D37
-FEB4 84318D38
-FEB5 84318D39
-FEB6 84318E30
-FEB7 84318E31
-FEB8 84318E32
-FEB9 84318E33
-FEBA 84318E34
-FEBB 84318E35
-FEBC 84318E36
-FEBD 84318E37
-FEBE 84318E38
-FEBF 84318E39
-FEC0 84318F30
-FEC1 84318F31
-FEC2 84318F32
-FEC3 84318F33
-FEC4 84318F34
-FEC5 84318F35
-FEC6 84318F36
-FEC7 84318F37
-FEC8 84318F38
-FEC9 84318F39
-FECA 84319030
-FECB 84319031
-FECC 84319032
-FECD 84319033
-FECE 84319034
-FECF 84319035
-FED0 84319036
-FED1 84319037
-FED2 84319038
-FED3 84319039
-FED4 84319130
-FED5 84319131
-FED6 84319132
-FED7 84319133
-FED8 84319134
-FED9 84319135
-FEDA 84319136
-FEDB 84319137
-FEDC 84319138
-FEDD 84319139
-FEDE 84319230
-FEDF 84319231
-FEE0 84319232
-FEE1 84319233
-FEE2 84319234
-FEE3 84319235
-FEE4 84319236
-FEE5 84319237
-FEE6 84319238
-FEE7 84319239
-FEE8 84319330
-FEE9 84319331
-FEEA 84319332
-FEEB 84319333
-FEEC 84319334
-FEED 84319335
-FEEE 84319336
-FEEF 84319337
-FEF0 84319338
-FEF1 84319339
-FEF2 84319430
-FEF3 84319431
-FEF4 84319432
-FEF5 84319433
-FEF6 84319434
-FEF7 84319435
-FEF8 84319436
-FEF9 84319437
-FEFA 84319438
-FEFB 84319439
-FEFC 84319530
-FEFD 84319531
-FEFE 84319532
-FEFF 84319533
-FF00 84319534
-FF01 A3A1
-FF02 A3A2
-FF03 A3A3
-FF04 A1E7
-FF05 A3A5
-FF06 A3A6
-FF07 A3A7
-FF08 A3A8
-FF09 A3A9
-FF0A A3AA
-FF0B A3AB
-FF0C A3AC
-FF0D A3AD
-FF0E A3AE
-FF0F A3AF
-FF10 A3B0
-FF11 A3B1
-FF12 A3B2
-FF13 A3B3
-FF14 A3B4
-FF15 A3B5
-FF16 A3B6
-FF17 A3B7
-FF18 A3B8
-FF19 A3B9
-FF1A A3BA
-FF1B A3BB
-FF1C A3BC
-FF1D A3BD
-FF1E A3BE
-FF1F A3BF
-FF20 A3C0
-FF21 A3C1
-FF22 A3C2
-FF23 A3C3
-FF24 A3C4
-FF25 A3C5
-FF26 A3C6
-FF27 A3C7
-FF28 A3C8
-FF29 A3C9
-FF2A A3CA
-FF2B A3CB
-FF2C A3CC
-FF2D A3CD
-FF2E A3CE
-FF2F A3CF
-FF30 A3D0
-FF31 A3D1
-FF32 A3D2
-FF33 A3D3
-FF34 A3D4
-FF35 A3D5
-FF36 A3D6
-FF37 A3D7
-FF38 A3D8
-FF39 A3D9
-FF3A A3DA
-FF3B A3DB
-FF3C A3DC
-FF3D A3DD
-FF3E A3DE
-FF3F A3DF
-FF40 A3E0
-FF41 A3E1
-FF42 A3E2
-FF43 A3E3
-FF44 A3E4
-FF45 A3E5
-FF46 A3E6
-FF47 A3E7
-FF48 A3E8
-FF49 A3E9
-FF4A A3EA
-FF4B A3EB
-FF4C A3EC
-FF4D A3ED
-FF4E A3EE
-FF4F A3EF
-FF50 A3F0
-FF51 A3F1
-FF52 A3F2
-FF53 A3F3
-FF54 A3F4
-FF55 A3F5
-FF56 A3F6
-FF57 A3F7
-FF58 A3F8
-FF59 A3F9
-FF5A A3FA
-FF5B A3FB
-FF5C A3FC
-FF5D A3FD
-FF5E A1AB
-FF5F 84319535
-FF60 84319536
-FF61 84319537
-FF62 84319538
-FF63 84319539
-FF64 84319630
-FF65 84319631
-FF66 84319632
-FF67 84319633
-FF68 84319634
-FF69 84319635
-FF6A 84319636
-FF6B 84319637
-FF6C 84319638
-FF6D 84319639
-FF6E 84319730
-FF6F 84319731
-FF70 84319732
-FF71 84319733
-FF72 84319734
-FF73 84319735
-FF74 84319736
-FF75 84319737
-FF76 84319738
-FF77 84319739
-FF78 84319830
-FF79 84319831
-FF7A 84319832
-FF7B 84319833
-FF7C 84319834
-FF7D 84319835
-FF7E 84319836
-FF7F 84319837
-FF80 84319838
-FF81 84319839
-FF82 84319930
-FF83 84319931
-FF84 84319932
-FF85 84319933
-FF86 84319934
-FF87 84319935
-FF88 84319936
-FF89 84319937
-FF8A 84319938
-FF8B 84319939
-FF8C 84319A30
-FF8D 84319A31
-FF8E 84319A32
-FF8F 84319A33
-FF90 84319A34
-FF91 84319A35
-FF92 84319A36
-FF93 84319A37
-FF94 84319A38
-FF95 84319A39
-FF96 84319B30
-FF97 84319B31
-FF98 84319B32
-FF99 84319B33
-FF9A 84319B34
-FF9B 84319B35
-FF9C 84319B36
-FF9D 84319B37
-FF9E 84319B38
-FF9F 84319B39
-FFA0 84319C30
-FFA1 84319C31
-FFA2 84319C32
-FFA3 84319C33
-FFA4 84319C34
-FFA5 84319C35
-FFA6 84319C36
-FFA7 84319C37
-FFA8 84319C38
-FFA9 84319C39
-FFAA 84319D30
-FFAB 84319D31
-FFAC 84319D32
-FFAD 84319D33
-FFAE 84319D34
-FFAF 84319D35
-FFB0 84319D36
-FFB1 84319D37
-FFB2 84319D38
-FFB3 84319D39
-FFB4 84319E30
-FFB5 84319E31
-FFB6 84319E32
-FFB7 84319E33
-FFB8 84319E34
-FFB9 84319E35
-FFBA 84319E36
-FFBB 84319E37
-FFBC 84319E38
-FFBD 84319E39
-FFBE 84319F30
-FFBF 84319F31
-FFC0 84319F32
-FFC1 84319F33
-FFC2 84319F34
-FFC3 84319F35
-FFC4 84319F36
-FFC5 84319F37
-FFC6 84319F38
-FFC7 84319F39
-FFC8 8431A030
-FFC9 8431A031
-FFCA 8431A032
-FFCB 8431A033
-FFCC 8431A034
-FFCD 8431A035
-FFCE 8431A036
-FFCF 8431A037
-FFD0 8431A038
-FFD1 8431A039
-FFD2 8431A130
-FFD3 8431A131
-FFD4 8431A132
-FFD5 8431A133
-FFD6 8431A134
-FFD7 8431A135
-FFD8 8431A136
-FFD9 8431A137
-FFDA 8431A138
-FFDB 8431A139
-FFDC 8431A230
-FFDD 8431A231
-FFDE 8431A232
-FFDF 8431A233
-FFE0 A1E9
-FFE1 A1EA
-FFE2 A956
-FFE3 A3FE
-FFE4 A957
-FFE5 A3A4
-FFE6 8431A234
-FFE7 8431A235
-FFE8 8431A236
-FFE9 8431A237
-FFEA 8431A238
-FFEB 8431A239
-FFEC 8431A330
-FFED 8431A331
-FFEE 8431A332
-FFEF 8431A333
-FFF0 8431A334
-FFF1 8431A335
-FFF2 8431A336
-FFF3 8431A337
-FFF4 8431A338
-FFF5 8431A339
-FFF6 8431A430
-FFF7 8431A431
-FFF8 8431A432
-FFF9 8431A433
-FFFA 8431A434
-FFFB 8431A435
-FFFC 8431A436
-FFFD 8431A437
-FFFE 8431A438
-FFFF 8431A439
diff --git a/src/common/backend/utils/mb/mbutils.cpp b/src/common/backend/utils/mb/mbutils.cpp
index 546cfa89b..981331330 100644
--- a/src/common/backend/utils/mb/mbutils.cpp
+++ b/src/common/backend/utils/mb/mbutils.cpp
@@ -825,6 +825,24 @@ int pg_mbstrlen_with_len_eml(const char* mbstr, int limit, int eml)
return len;
}
+int pg_mbstrlen_with_len_toast(const char* mbstr, int* limit)
+{
+ int len = 0;
+
+ /* optimization for single byte encoding */
+ if (pg_database_encoding_max_length() == 1) {
+ return *limit;
+ }
+ while (*limit > 0 && *mbstr) {
+ int l = pg_mblen(mbstr);
+
+ *limit -= l;
+ mbstr += l;
+ len++;
+ }
+ return len;
+}
+
/*
* returns the byte length of a multibyte string
* (not necessarily NULL terminated)
diff --git a/src/common/backend/utils/misc/guc-file.l b/src/common/backend/utils/misc/guc-file.l
index 3a7096b9c..de25b0c3c 100644
--- a/src/common/backend/utils/misc/guc-file.l
+++ b/src/common/backend/utils/misc/guc-file.l
@@ -370,6 +370,9 @@ ProcessConfigFile(GucContext context)
if (pre_value)
pfree(pre_value);
}
+ if (EnableGlobalSysCache()) {
+ g_instance.global_sysdbcache.UpdateGSCConfig(g_instance.attr.attr_memory.global_syscache_threshold);
+ }
/* Remember when we last successfully loaded the config file. */
t_thrd.time_cxt.pg_reload_time = GetCurrentTimestamp();
diff --git a/src/common/backend/utils/misc/guc.cpp b/src/common/backend/utils/misc/guc.cpp
index 562792662..d74d096b9 100755
--- a/src/common/backend/utils/misc/guc.cpp
+++ b/src/common/backend/utils/misc/guc.cpp
@@ -8,8 +8,8 @@
*
* Copyright (c) 2000-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
- * Written by Peter Eisentraut .
* Portions Copyright (c) 2021, openGauss Contributors
+ * Written by Peter Eisentraut .
*
* IDENTIFICATION
* src/backend/utils/misc/guc.c
@@ -183,7 +183,6 @@
#define INVALID_LINES_IDX (int)(~0)
#define MAX_PARAM_LEN 1024
#define WRITE_CONFIG_LOCK_LEN (1024 * 1024)
-#define CONFIG_BAK_FILENAME "postgresql.conf.bak"
#ifdef EXEC_BACKEND
#define CONFIG_EXEC_PARAMS "global/config_exec_params"
@@ -413,6 +412,7 @@ const char* sync_guc_variable_namelist[] = {"work_mem",
"sql_beta_feature",
#ifndef ENABLE_MULTIPLE_NODES
"plsql_show_all_error",
+ "uppercase_attribute_name",
#endif
"track_stmt_session_slot",
"track_stmt_stat_level",
@@ -971,7 +971,6 @@ const char* const config_group_names[] = {
/* INSTRUMENTS_OPTIONS */
gettext_noop("Instruments Options"),
gettext_noop("Column Encryption"),
- gettext_noop("Compress Options"),
#ifdef PGXC
/* DATA_NODES */
gettext_noop("Datanodes and Connection Pooling"),
@@ -1645,6 +1644,17 @@ static void InitConfigureNamesBool()
NULL,
NULL},
#endif
+ {{"enable_global_syscache",
+ PGC_POSTMASTER,
+ NODE_ALL,
+ CLIENT_CONN,
+ gettext_noop("enable to use global system cache. "), NULL},
+ &g_instance.attr.attr_common.enable_global_syscache,
+ true,
+ NULL,
+ NULL,
+ NULL},
+
{{"enable_router",
PGC_SIGHUP,
NODE_DISTRIBUTE,
@@ -1783,6 +1793,19 @@ static void InitConfigureNamesBool()
NULL,
NULL
},
+ {{"enable_ustore",
+ PGC_POSTMASTER,
+ NODE_SINGLENODE,
+ QUERY_TUNING_METHOD,
+ gettext_noop("Enable ustore storage engine"),
+ NULL},
+ &g_instance.attr.attr_storage.enable_ustore,
+ true,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ },
/* End-of-list marker */
{{NULL,
(GucContext)0,
@@ -2070,7 +2093,11 @@ static void InitConfigureNamesInt()
GUC_SUPERUSER_ONLY},
&g_instance.attr.attr_common.asp_sample_num,
100000,
+#ifdef ENABLE_MULTIPLE_NODES
10000,
+#else
+ 10,
+#endif
100000,
NULL,
NULL,
@@ -2229,32 +2256,6 @@ static void InitConfigureNamesInt()
NULL,
NULL,
NULL},
- {{"pset_lob_length",
- PGC_USERSET,
- NODE_ALL,
- CLIENT_CONN_STATEMENT,
- gettext_noop("GUC parameter of pset_lob_length."),
- NULL},
- &u_sess->attr.attr_common.pset_lob_length,
- 0,
- 0,
- INT_MAX,
- NULL,
- NULL,
- NULL},
- {{"pset_num_width",
- PGC_USERSET,
- NODE_ALL,
- CLIENT_CONN_STATEMENT,
- gettext_noop("GUC parameter of pset_num_width."),
- NULL},
- &u_sess->attr.attr_common.pset_num_width,
- 0,
- 0,
- 128,
- NULL,
- NULL,
- NULL},
{{"tcp_keepalives_idle",
PGC_USERSET,
NODE_ALL,
@@ -3043,7 +3044,6 @@ static void InitConfigureNamesString()
NULL,
NULL,
NULL},
-
{{"thread_pool_attr",
PGC_POSTMASTER,
NODE_ALL,
@@ -3056,6 +3056,19 @@ static void InitConfigureNamesString()
NULL,
NULL,
NULL},
+
+ {{"thread_pool_stream_attr",
+ PGC_POSTMASTER,
+ NODE_ALL,
+ CLIENT_CONN,
+ gettext_noop("Spare Cpu that can not be used in thread pool stream."),
+ NULL,
+ GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY},
+ &g_instance.attr.attr_common.thread_pool_stream_attr,
+ "16, 0.2, 2, (nobind)",
+ NULL,
+ NULL,
+ NULL},
{{"comm_proxy_attr",
PGC_POSTMASTER,
@@ -3769,7 +3782,7 @@ static void InitConfigureNamesString()
&u_sess->attr.attr_common.ts_compaction_strategy,
"3,6,6,12,0",
check_compaciton_strategy,
- NULL},
+ NULL},
#endif
{{NULL,
(GucContext)0,
@@ -4045,7 +4058,7 @@ static void InitConfigureNamesEnum()
PGC_POSTMASTER,
NODE_SINGLENODE,
PRESET_OPTIONS,
- gettext_noop("Sets how binary values are to be encoded in XML."),
+ gettext_noop("Sets the type of shared storage cluster."),
NULL},
&g_instance.attr.attr_common.cluster_run_mode,
RUN_MODE_PRIMARY,
@@ -4053,6 +4066,18 @@ static void InitConfigureNamesEnum()
NULL,
NULL,
NULL},
+ {{"stream_cluster_run_mode",
+ PGC_POSTMASTER,
+ NODE_DISTRIBUTE,
+ PRESET_OPTIONS,
+ gettext_noop("Sets the type of streaming cluster."),
+ NULL},
+ &g_instance.attr.attr_common.stream_cluster_run_mode,
+ RUN_MODE_PRIMARY,
+ cluster_run_mode_options,
+ NULL,
+ NULL,
+ NULL},
/* End-of-list marker */
{{NULL,
(GucContext)0,
@@ -8215,7 +8240,7 @@ static void CheckAlterSystemSetPrivilege(const char* name)
"query_log_directory", "ssl_ca_file", "ssl_cert_file", "ssl_crl_file", "ssl_key_file", "stats_temp_directory",
"unix_socket_directory", "unix_socket_group", "unix_socket_permissions",
"krb_caseins_users", "krb_server_keyfile", "krb_srvname", "allow_system_table_mods", "enableSeparationOfDuty",
- "modify_initial_password", "password_encryption_type", "password_policy",
+ "modify_initial_password", "password_encryption_type", "password_policy", "audit_xid_info",
NULL
};
for (int i = 0; blackList[i] != NULL; i++) {
@@ -11298,7 +11323,8 @@ static const char* show_tcp_keepalives_interval(void)
const int maxBufLen = 16;
static char nbuf[maxBufLen];
- errno_t rc = snprintf_s(nbuf, maxBufLen, maxBufLen - 1, "%d", pq_getkeepalivesinterval(u_sess->proc_cxt.MyProcPort));
+ errno_t rc = snprintf_s(nbuf, maxBufLen, maxBufLen - 1, "%d",
+ pq_getkeepalivesinterval(u_sess->proc_cxt.MyProcPort));
securec_check_ss(rc, "\0", "\0");
return nbuf;
}
@@ -12055,6 +12081,56 @@ ErrCode copy_guc_lines(char** copy_to_line, char** optlines, const char** opt_na
return CODE_OK;
}
+/*
+ * @@GaussDB@@
+ * Brief : void modify_guc_one_line
+ * Description : modify one guc config
+ * Notes :
+ */
+void modify_guc_one_line(char*** guc_optlines, const char* opt_name, const char* copy_from_line)
+{
+ int opt_name_index = 0;
+ int optvalue_off = 0;
+ int optvalue_len = 0;
+ char **optlines = *guc_optlines;
+
+ opt_name_index = find_guc_option(optlines, opt_name, NULL, NULL, &optvalue_off, &optvalue_len, false);
+ if (INVALID_LINES_IDX != opt_name_index) {
+ pfree(optlines[opt_name_index]);
+ } else {
+ int lines = 0;
+ /* get optlines row number */
+ for (lines = 0; optlines[lines] != NULL; ++lines) {}
+ /* add one line guc item, and set a end flag NULL. */
+ char **optlines_copy = (char**)pg_malloc((lines + 2) * sizeof(char*));
+ errno_t rc = memset_s(optlines_copy, (lines + 2) * sizeof(char*), 0, (lines + 2) * sizeof(char*));
+ securec_check(rc, "\0", "\0");
+ for (int cnt = 0; cnt < lines; cnt++) {
+ optlines_copy[cnt] = optlines[cnt];
+ }
+ pfree(optlines);
+ *guc_optlines = optlines_copy;
+ optlines = *guc_optlines;
+ optlines_copy = NULL;
+
+ Assert(optlines[lines] == NULL);
+ optlines[lines + 1] = NULL;
+ opt_name_index = lines;
+ }
+ int newsize = strlen(copy_from_line) + 1;
+
+ optlines[opt_name_index] = (char*)pg_malloc(newsize);
+
+ errno_t rc = strncpy_s(optlines[opt_name_index], newsize, copy_from_line, newsize - 1);
+ securec_check(rc, "\0", "\0");
+
+ if (newsize > MAX_PARAM_LEN) {
+ ereport(WARNING, (errmsg("modify_guc_one_line:opt len '%s' is out of 1024", optlines[opt_name_index])));
+ }
+
+}
+
+
/*
* @@GaussDB@@
* Brief : static void modify_config_file
diff --git a/src/common/backend/utils/misc/guc/guc_memory.cpp b/src/common/backend/utils/misc/guc/guc_memory.cpp
index d946a9797..79f087462 100644
--- a/src/common/backend/utils/misc/guc/guc_memory.cpp
+++ b/src/common/backend/utils/misc/guc/guc_memory.cpp
@@ -264,7 +264,22 @@ static void InitMemoryConfigureNamesBool()
NULL,
NULL,
NULL},
-
+
+#ifdef MEMORY_CONTEXT_CHECKING
+ // variable to enable memory check
+ {{"enable_memory_context_check_debug",
+ PGC_POSTMASTER,
+ NODE_ALL,
+ RESOURCES_MEM,
+ gettext_noop("check the memory context info on debug mode."),
+ NULL},
+ &g_instance.attr.attr_memory.enable_memory_context_check_debug,
+ false,
+ NULL,
+ NULL,
+ NULL},
+#endif
+
/* End-of-list marker */
{{NULL,
(GucContext)0,
@@ -318,7 +333,7 @@ static void InitMemoryConfigureNamesInt()
NULL,
NULL},
{{"local_syscache_threshold",
- PGC_POSTMASTER,
+ PGC_SIGHUP,
NODE_ALL,
RESOURCES_MEM,
gettext_noop("Sets the maximum threshold for cleaning cache."),
@@ -331,6 +346,20 @@ static void InitMemoryConfigureNamesInt()
check_syscache_threshold_gpc,
NULL,
NULL},
+ {{"global_syscache_threshold",
+ PGC_SIGHUP,
+ NODE_ALL,
+ RESOURCES_MEM,
+ gettext_noop("Sets the maximum threshold for cleaning global syscache."),
+ NULL,
+ GUC_UNIT_KB},
+ &g_instance.attr.attr_memory.global_syscache_threshold,
+ 160 * 1024,
+ 16 * 1024,
+ 1024 * 1024 * 1024,
+ NULL,
+ NULL,
+ NULL},
{{"work_mem",
PGC_USERSET,
NODE_ALL,
@@ -633,7 +662,6 @@ static bool check_syscache_threshold_gpc(int* newval, void** extra, GucSource so
*newval / 1024)));
g_instance.attr.attr_memory.local_syscache_threshold = 16 * 1024;
}
-
return true;
}
diff --git a/src/common/backend/utils/misc/guc/guc_security.cpp b/src/common/backend/utils/misc/guc/guc_security.cpp
index 690118fef..e9ec81dc6 100755
--- a/src/common/backend/utils/misc/guc/guc_security.cpp
+++ b/src/common/backend/utils/misc/guc/guc_security.cpp
@@ -798,7 +798,7 @@ static void InitSecurityConfigureNamesInt()
&u_sess->attr.attr_security.Audit_DDL,
12295,
0,
- 2097151,
+ 67108863,
NULL,
NULL,
NULL},
@@ -889,6 +889,36 @@ static void InitSecurityConfigureNamesInt()
NULL,
NULL,
NULL},
+
+ {{"audit_xid_info",
+ PGC_SIGHUP,
+ NODE_ALL,
+ AUDIT_OPTIONS,
+ gettext_noop("whether record xid info in audit log."),
+ NULL,
+ 0},
+ &u_sess->attr.attr_security.audit_xid_info,
+ 0,
+ 0,
+ 1,
+ NULL,
+ NULL,
+ NULL},
+
+ {{"audit_thread_num",
+ PGC_POSTMASTER,
+ NODE_ALL,
+ AUDIT_OPTIONS,
+ gettext_noop("Sets the number of audit threads."),
+ NULL,
+ 0},
+ &g_instance.attr.attr_security.audit_thread_num,
+ 1,
+ 1,
+ 48,
+ NULL,
+ NULL,
+ NULL},
/* End-of-list marker */
{{NULL,
@@ -1262,18 +1292,17 @@ static bool check_ssl_ciphers(char** newval, void** extra, GucSource)
int i = 0;
char* ptok = NULL;
const char* ssl_ciphers_list[] = {
- "DHE-RSA-AES256-GCM-SHA384",
- "DHE-RSA-AES128-GCM-SHA256",
- "DHE-RSA-AES256-CCM",
- "DHE-RSA-AES128-CCM",
- "ECDHE-RSA-AES256-GCM-SHA384",
"ECDHE-RSA-AES128-GCM-SHA256",
- "ECDHE-ECDSA-AES256-GCM-SHA384",
+ "ECDHE-RSA-AES256-GCM-SHA384",
"ECDHE-ECDSA-AES128-GCM-SHA256",
- NULL
+ "ECDHE-ECDSA-AES256-GCM-SHA384",
+ "DHE-RSA-AES128-GCM-SHA256",
+ "DHE-RSA-AES256-GCM-SHA384"
};
+ int maxCnt = lengthof(ssl_ciphers_list);
+
if (*newval == NULL || **newval == '\0' || **newval == ';') {
- ereport(ERROR, (errmsg("sslciphers can not be null")));
+ return false;
} else if (strcasecmp(*newval, "ALL") == 0) {
return true;
} else {
@@ -1286,25 +1315,19 @@ static bool check_ssl_ciphers(char** newval, void** extra, GucSource)
break;
}
if (cipherStr == strchr(cipherStr, ';')) {
- ereport(ERROR, (errmsg("unrecognized ssl ciphers name: \"%s\"", *newval)));
+ return false;
}
cipherStr = strchr(cipherStr, ';');
}
+
+ if (counter > maxCnt) {
+ return false;
+ }
ciphers_list = static_cast(palloc(counter * sizeof(char*)));
-
- Assert(ciphers_list != NULL);
- if (ciphers_list == NULL) {
- ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("malloc failed")));
- }
-
cipherStr_tmp = pstrdup(*newval);
- if (cipherStr_tmp == NULL) {
- pfree_ext(ciphers_list);
- ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("malloc failed")));
- }
token = strtok_r(cipherStr_tmp, ";", &ptok);
while (token != NULL) {
- for (int j = 0; ssl_ciphers_list[j] != NULL; j++) {
+ for (int j = 0; j < maxCnt; j++) {
if (strlen(ssl_ciphers_list[j]) == strlen(token) &&
strncmp(ssl_ciphers_list[j], token, strlen(token)) == 0) {
ciphers_list[i] = const_cast(ssl_ciphers_list[j]);
@@ -1312,16 +1335,11 @@ static bool check_ssl_ciphers(char** newval, void** extra, GucSource)
break;
}
}
+
if (!find_ciphers_in_list) {
- const int maxCipherStrLen = 64;
- char errormessage[maxCipherStrLen] = {0};
- errno_t errorno = EOK;
- errorno = strncpy_s(errormessage, sizeof(errormessage), token, sizeof(errormessage) - 1);
- securec_check(errorno, cipherStr_tmp, ciphers_list, "\0");
- errormessage[maxCipherStrLen - 1] = '\0';
pfree_ext(cipherStr_tmp);
pfree_ext(ciphers_list);
- ereport(ERROR, (errmsg("unrecognized ssl ciphers name: \"%s\"", errormessage)));
+ return false;
}
token = strtok_r(NULL, ";", &ptok);
i++;
@@ -1332,3 +1350,4 @@ static bool check_ssl_ciphers(char** newval, void** extra, GucSource)
pfree_ext(ciphers_list);
return true;
}
+
diff --git a/src/common/backend/utils/misc/guc/guc_sql.cpp b/src/common/backend/utils/misc/guc/guc_sql.cpp
index fca448ca5..9139bb39d 100755
--- a/src/common/backend/utils/misc/guc/guc_sql.cpp
+++ b/src/common/backend/utils/misc/guc/guc_sql.cpp
@@ -8,8 +8,8 @@
*
* Copyright (c) 2000-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
- * Written by Peter Eisentraut .
* Portions Copyright (c) 2021, openGauss Contributors
+ * Written by Peter Eisentraut .
*
* IDENTIFICATION
* src/backend/utils/misc/guc/guc_sql.cpp
@@ -165,7 +165,6 @@ static void assign_convert_string_to_digit(bool newval, void* extra);
static void AssignUStoreAttr(const char* newval, void* extra);
static bool check_snapshot_delimiter(char** newval, void** extra, GucSource source);
static bool check_snapshot_separator(char** newval, void** extra, GucSource source);
-static bool check_numformat_arg(char** numformat, void** extra, GucSource source);
static void InitSqlConfigureNamesBool();
@@ -174,15 +173,7 @@ static void InitSqlConfigureNamesInt64();
static void InitSqlConfigureNamesReal();
static void InitSqlConfigureNamesString();
static void InitSqlConfigureNamesEnum();
-
-double str_to_num(char *format_str);
-double my_pow(double base, int exp);
-void extract_deci_part_width(double num, int width, int int_places, StringInfo result, bool is_negative);
-void extract_part(double num, StringInfo result, bool is_negative, bool extract_deci, int int_places, int deci_places);
-void extract_int_part(double num, int places, StringInfo space_part, StringInfo int_part);
-void extract_deci_part(double num, int deci_places, StringInfo deci_part);
-void out_of_range(StringInfo result, int len, bool amend_length);
-
+#define FORBID_GUC_NUM 3
/*
* Although only "on", "off", and "safe_encoding" are documented, we
* accept all the likely variants of "on" and "off".
@@ -296,9 +287,17 @@ static const struct config_enum_entry sql_beta_options[] = {
{"canonical_pathkey", CANONICAL_PATHKEY, false},
{"index_cost_with_leaf_pages_only", INDEX_COST_WITH_LEAF_PAGES_ONLY, false},
{"partition_opfusion", PARTITION_OPFUSION , false},
- {"spi_debug", SPI_DEBUG, false},
- {"resowner_debug", RESOWNER_DEBUG, false},
{"a_style_coerce", A_STYLE_COERCE, false},
+ {"plpgsql_stream_fetchall", PLPGSQL_STREAM_FETCHALL, false},
+ {"predpush_same_level", PREDPUSH_SAME_LEVEL, false},
+ {"partition_fdw_on", PARTITION_FDW_ON, false},
+ {NULL, 0, false}
+};
+
+static const struct config_enum_entry vector_engine_strategy[] = {
+ {"off", OFF_VECTOR_ENGINE, false},
+ {"force", FORCE_VECTOR_ENGINE, false},
+ {"optimal", OPT_VECTOR_ENGINE, false},
{NULL, 0, false}
};
@@ -323,7 +322,14 @@ static const struct behavior_compat_entry behavior_compat_options[OPT_MAX] = {
{"hide_tailing_zero", OPT_HIDE_TAILING_ZERO},
{"plsql_security_definer", OPT_SECURITY_DEFINER},
{"skip_insert_gs_source", OPT_SKIP_GS_SOURCE},
- {"proc_outparam_override", OPT_PROC_OUTPARAM_OVERRIDE}
+ {"proc_outparam_override", OPT_PROC_OUTPARAM_OVERRIDE},
+ {"allow_procedure_compile_check", OPT_ALLOW_PROCEDURE_COMPILE_CHECK},
+ {"proc_implicit_for_loop_variable", OPT_IMPLICIT_FOR_LOOP_VARIABLE},
+ {"aformat_null_test", OPT_AFORMAT_NULL_TEST},
+ {"aformat_regexp_match", OPT_AFORMAT_REGEX_MATCH},
+ {"rownum_type_compat", OPT_ROWNUM_TYPE_COMPAT},
+ {"compat_cursor", OPT_COMPAT_CURSOR},
+ {"char_coerce_compat", OPT_CHAR_COERCE_COMPAT}
};
/*
@@ -865,7 +871,7 @@ static void InitSqlConfigureNamesBool()
gettext_noop("Logs the duration of each completed SQL statement."),
NULL},
&u_sess->attr.attr_sql.log_duration,
- true,
+ false,
NULL,
NULL,
NULL},
@@ -1545,6 +1551,19 @@ static void InitSqlConfigureNamesBool()
NULL,
NULL
},
+ {{"uppercase_attribute_name",
+ PGC_USERSET,
+ NODE_SINGLENODE,
+ COMPAT_OPTIONS,
+ gettext_noop("Set to ON will force attname displayed in upper case when all characters in lower case "
+ "(comapatible with ORA), otherwise do nothing."),
+ NULL,
+ GUC_REPORT},
+ &u_sess->attr.attr_sql.uppercase_attribute_name,
+ false,
+ NULL,
+ NULL,
+ NULL},
#endif
/* End-of-list marker */
{{NULL,
@@ -2213,6 +2232,7 @@ static void InitSqlConfigureNamesInt()
NULL,
NULL,
NULL},
+#ifndef ENABLE_MULTIPLE_NODES
{{"pldebugger_timeout",
PGC_USERSET,
NODE_ALL,
@@ -2227,6 +2247,7 @@ static void InitSqlConfigureNamesInt()
NULL,
NULL,
NULL},
+#endif
/* End-of-list marker */
{{NULL,
(GucContext)0,
@@ -2665,17 +2686,6 @@ static void InitSqlConfigureNamesString()
check_snapshot_delimiter,
NULL,
NULL},
- {{"pset_num_format",
- PGC_USERSET,
- NODE_ALL,
- CUSTOM_OPTIONS,
- gettext_noop("GUC parameter of pset_num_format."),
- NULL},
- &u_sess->attr.attr_common.pset_num_format,
- "\0",
- check_numformat_arg,
- NULL,
- NULL},
{{NULL,
(GucContext)0,
(GucNodeType)0,
@@ -2837,6 +2847,18 @@ static void InitSqlConfigureNamesEnum()
NULL,
NULL,
NULL},
+ {{"try_vector_engine_strategy",
+ PGC_USERSET,
+ NODE_ALL,
+ QUERY_TUNING,
+ gettext_noop("Sets the strategy of using vector engine for row table."),
+ NULL},
+ &u_sess->attr.attr_sql.vectorEngineStrategy,
+ OFF_VECTOR_ENGINE,
+ vector_engine_strategy,
+ NULL,
+ NULL,
+ NULL},
/* End-of-list marker */
{{NULL,
@@ -3091,7 +3113,22 @@ static void assign_inlist2joininfo(const char* newval, void* extra)
}
}
}
-
+#ifdef ENABLE_MULTIPLE_NODES
+static bool ForbidDistributeParameter(const char* elem)
+{
+ const char *forbidList[] = {
+ "proc_outparam_override",
+ "skip_insert_gs_source",
+ "rownum_type_compat"
+ };
+ for (int i = 0; i < FORBID_GUC_NUM; i++) {
+ if (strcmp(forbidList[i], elem) == 0) {
+ return true;
+ }
+ }
+ return false;
+}
+#endif
/*
* check_behavior_compat_options: GUC check_hook for behavior compat options
*/
@@ -3119,12 +3156,20 @@ static bool check_behavior_compat_options(char** newval, void** extra, GucSource
bool nfound = true;
for (start = 0; start < OPT_MAX; start++) {
+#ifdef ENABLE_MULTIPLE_NODES
+ if (ForbidDistributeParameter(item)) {
+ GUC_check_errdetail("behavior compat option %s can not use"
+ " in distributed database system", item);
+ pfree(rawstring);
+ list_free(elemlist);
+ return false;
+ }
+#endif
if (strcmp(item, behavior_compat_options[start].name) == 0) {
nfound = false;
break;
}
}
-
if (nfound) {
GUC_check_errdetail("invalid behavior compat option \"%s\"", item);
pfree(rawstring);
@@ -3316,274 +3361,3 @@ static bool check_snapshot_separator(char** newval, void** extra, GucSource sour
return (strlen(*newval) == 1 && (!u_sess->attr.attr_sql.db4ai_snapshot_version_delimiter
|| **newval != *u_sess->attr.attr_sql.db4ai_snapshot_version_delimiter));
}
-
-/*
- * @@GaussDB@@
- * Brief : Check numformat (strlen(numformat) is known to greater than 0).
- * Description : If numformat is not right, then return false.
- */
-static bool check_numformat_arg(char** numformat, void** extra, GucSource source)
-{
- if (NULL == numformat) {
- return false;
- }
-
- if (strlen(*numformat) > 128) {
- GUC_check_errdetail("The numformat is too long!");
- return false;
- }
-
- bool point_appeared = false;
- char *numformat_copy = *numformat;
- while (*numformat_copy != '\0') {
- if (*numformat_copy != '9' && *numformat_copy != '.') {
- return false;
- }
- if (*numformat_copy == '.') {
- if (unlikely(point_appeared)) {
- return false;
- }
- point_appeared = true;
- }
- numformat_copy++;
- }
- return true;
-}
-
-char* apply_num_width(double num)
-{
- StringInfoData result;
- initStringInfo(&result);
- bool is_negative = false;
- int width = u_sess->attr.attr_common.pset_num_width;
- const int decimal = 10;
- if (num < 0) {
- num = -num;
- is_negative = true;
- width--;
- }
-
- int int_places = 0;
- double num_copy = num;
- while ((int)num_copy > 0) {
- int_places++;
- num_copy = num_copy / decimal;
- }
-
- if (int_places > width) {
- out_of_range(&result, width, is_negative);
- } else if (int_places == width || int_places == width - 1) {
- int value = (int)(num * decimal) % decimal;
- if (value >= 5) {
- num += 1;
- }
- if ((int)num == (int)my_pow(decimal, width) && int_places == width) {
- out_of_range(&result, width, is_negative);
- } else {
- if (unlikely(is_negative)) {
- appendStringInfo(&result, "%s", "-");
- }
- appendStringInfo(&result, "%d", (int)num);
- }
- } else {
- extract_deci_part_width(num, width, int_places, &result, is_negative);
- }
-
- return result.data;
-}
-
-void extract_deci_part_width(double num, int width, int int_places, StringInfo result, bool is_negative)
-{
- int deci_places = width - 1 - int_places;
- const int decimal = 10;
- int value = (int)(num * my_pow(decimal, deci_places + 1)) % decimal;
- if (value >= 5) {
- num += my_pow(decimal, -deci_places);
- int_places = 0;
- double num_copy = num;
- while ((int)num_copy > 0) {
- int_places++;
- num_copy = num_copy / decimal;
- }
- deci_places = width - 1 - int_places;
- }
-
- StringInfoData int_part, deci_part;
- initStringInfo(&int_part);
- initStringInfo(&deci_part);
-
- if (unlikely(is_negative)) {
- appendStringInfo(&int_part, "%s", "-");
- }
-
- for (int i = int_places - 1; i >= 0; i--) {
- int value = (int)(num / my_pow(decimal, i)) % decimal;
- appendStringInfo(&int_part, "%d", value);
- }
-
- int last_not_zero = 0;
- for (int i = 1; i <= deci_places; i++) {
- int value = (int)(num * my_pow(decimal, i)) % decimal;
- if (value != 0) {
- last_not_zero = i;
- }
- }
-
- if (last_not_zero == 0) {
- for (int i = 0; i < deci_places + 1; i++) {
- appendStringInfo(result, "%s", " ");
- }
- if (int_part.len == 0) {
- appendStringInfo(&int_part, "%s", "0");
- }
- appendStringInfo(result, "%s", int_part.data);
- } else {
- for (int i = 0; i < deci_places - last_not_zero; i++) {
- appendStringInfo(result, "%s", " ");
- }
- appendStringInfo(result, "%s", int_part.data);
- appendStringInfo(result, "%s", ".");
- extract_deci_part(num, last_not_zero, &deci_part);
- appendStringInfo(result, "%s", deci_part.data);
- }
-
- pfree(int_part.data);
- pfree(deci_part.data);
-}
-
-char* apply_num_format(double num)
-{
- char *format_str = u_sess->attr.attr_common.pset_num_format;
- double format_num = str_to_num(format_str);
- const int decimal = 10;
-
- StringInfoData result;
- initStringInfo(&result);
- bool is_negative = false;
-
- if (num < 0) {
- num = -num;
- is_negative = true;
- }
-
- char *decimal_str = strrchr(format_str, '.');
- if (decimal_str == NULL) {
- int remainder = (int)(num * decimal) % decimal;
- if (remainder >= 5) {
- num += 1;
- }
- if ((int)num > (int)format_num) {
- out_of_range(&result, strlen(format_str) + 1, false);
- } else {
- extract_part(num, &result, is_negative, false, strlen(format_str), 0);
- }
- } else {
- int deci_places = strlen(decimal_str) - 1;
- int remainder = (int)(num * my_pow(decimal, deci_places + 1)) % decimal;
- if (remainder >= 5) {
- num += my_pow(decimal, -deci_places);
- }
- num = (double)(int)(num * my_pow(decimal, deci_places)) / my_pow(decimal, deci_places);
- if (num > format_num) {
- out_of_range(&result, strlen(format_str) + 1, false);
- } else {
- extract_part(num, &result, is_negative, true, strlen(format_str) - strlen(decimal_str), deci_places);
- }
- }
-
- return result.data;
-}
-
-double str_to_num(char *format_str)
-{
- double num;
- const int decimal = 10;
-
- char *decimal_str = strrchr(format_str, '.');
- if (decimal_str == NULL) {
- num = my_pow(decimal, strlen(format_str)) - 1;
- } else {
- num = my_pow(decimal, strlen(format_str) - strlen(decimal_str)) - 1 + (1 - my_pow(decimal, 1 - strlen(decimal_str)));
- }
-
- return num;
-}
-
-double my_pow(double base, int exp)
-{
- double result = 1;
- bool is_negative = false;
- if (exp < 0) {
- exp = -exp;
- is_negative = true;
- }
- while (exp) {
- if (exp & 1) {
- result *= base;
- }
- exp >>= 1;
- base *= base;
- }
- return is_negative ? (1 / result) : result;
-}
-
-void extract_part(double num, StringInfo result, bool is_negative, bool extract_deci, int int_places, int deci_places)
-{
- StringInfoData space_part, int_part, deci_part;
- initStringInfo(&space_part);
- initStringInfo(&int_part);
- initStringInfo(&deci_part);
-
- extract_int_part(num, int_places, &space_part, &int_part);
-
- appendStringInfo(result, "%s", space_part.data);
- if (unlikely(is_negative)) {
- appendStringInfo(result, "%s", "-");
- }
- appendStringInfo(result, "%s", int_part.data);
-
- if (extract_deci) {
- extract_deci_part(num, deci_places, &deci_part);
- appendStringInfo(result, "%s", ".");
- appendStringInfo(result, "%s", deci_part.data);
- }
-
- pfree(space_part.data);
- pfree(int_part.data);
- pfree(deci_part.data);
-}
-
-void extract_int_part(double num, int places, StringInfo space_part, StringInfo int_part)
-{
- bool can_append_space = true;
- const int decimal = 10;
- for (int i = places - 1; i >= 0; i--) {
- int value = (int)(num / my_pow(decimal, i)) % decimal;
- if (value == 0 && unlikely(can_append_space)) {
- appendStringInfo(space_part, "%s", " ");
- } else {
- appendStringInfo(int_part, "%d", value);
- can_append_space = false;
- }
- }
-}
-
-void extract_deci_part(double num, int deci_places, StringInfo deci_part)
-{
- const int decimal = 10;
-
- for (int i = 1; i <= deci_places; i++) {
- int value = (int)(num * my_pow(decimal, i)) % decimal;
- appendStringInfo(deci_part, "%d", value);
- }
-}
-
-void out_of_range(StringInfo result, int len, bool amend_length)
-{
- if (unlikely(amend_length)) {
- len++;
- }
- for (int i = 0; i < len; i++) {
- appendStringInfo(result, "%s", "#");
- }
-}
diff --git a/src/common/backend/utils/misc/guc/guc_storage.cpp b/src/common/backend/utils/misc/guc/guc_storage.cpp
index a60ae55de..b53d83820 100755
--- a/src/common/backend/utils/misc/guc/guc_storage.cpp
+++ b/src/common/backend/utils/misc/guc/guc_storage.cpp
@@ -209,6 +209,8 @@ static int GetLengthAndCheckReplConn(const char* ConnInfoList);
#ifndef ENABLE_MULTIPLE_NODES
static void assign_dcf_election_timeout(int newval, void* extra);
+static void assign_dcf_auto_elc_priority_en(int newval, void* extra);
+static void assign_dcf_election_switch_threshold(int newval, void* extra);
static void assign_dcf_run_mode(int newval, void* extra);
static void assign_dcf_log_level(const char* newval, void* extra);
static void assign_dcf_max_log_file_size(int newval, void* extra);
@@ -605,6 +607,18 @@ static void InitStorageConfigureNamesBool()
NULL,
NULL},
+ {{"enable_wal_shipping_compression",
+ PGC_SIGHUP,
+ NODE_ALL,
+ REPLICATION_SENDING,
+ gettext_noop("enable compress xlog during xlog shipping."),
+ NULL},
+ &g_instance.attr.attr_storage.enable_wal_shipping_compression,
+ false,
+ NULL,
+ NULL,
+ NULL},
+
{{"enable_mix_replication",
PGC_POSTMASTER,
NODE_ALL,
@@ -641,7 +655,6 @@ static void InitStorageConfigureNamesBool()
NULL,
NULL},
#endif
-
{{"ha_module_debug",
PGC_USERSET,
NODE_ALL,
@@ -879,6 +892,17 @@ static void InitStorageConfigureNamesBool()
NULL,
NULL,
NULL},
+ {{"enable_defer_calculate_snapshot",
+ PGC_SIGHUP,
+ NODE_ALL,
+ UNGROUPED,
+ gettext_noop("Enable defer to calculate mvcc snapshot when commit"),
+ NULL},
+ &u_sess->attr.attr_storage.enable_defer_calculate_snapshot,
+ true,
+ NULL,
+ NULL,
+ NULL},
#ifdef USE_ASSERT_CHECKING
{{"enable_segment",
PGC_SIGHUP,
@@ -943,6 +967,20 @@ static void InitStorageConfigureNamesBool()
NULL,
NULL},
#endif
+
+#ifdef ENABLE_MULTIPLE_NODES
+ {{"auto_csn_barrier",
+ PGC_SIGHUP,
+ NODE_DISTRIBUTE,
+ WAL,
+ gettext_noop("Enable auto csn barrier creation."),
+ NULL},
+ &g_instance.attr.attr_storage.auto_csn_barrier,
+ false,
+ NULL,
+ NULL,
+ NULL},
+#endif
/* End-of-list marker */
{{NULL,
(GucContext)0,
@@ -1288,6 +1326,32 @@ static void InitStorageConfigureNamesInt()
NULL,
assign_dcf_election_timeout,
NULL},
+ {{"dcf_enable_auto_election_priority",
+ PGC_SIGHUP,
+ NODE_SINGLENODE,
+ REPLICATION_PAXOS,
+ gettext_noop("Sets the election priority of local DCF node."),
+ NULL},
+ &u_sess->attr.attr_storage.dcf_attr.dcf_auto_elc_priority_en,
+ 1,
+ 0,
+ 1,
+ NULL,
+ assign_dcf_auto_elc_priority_en,
+ NULL},
+ {{"dcf_election_switch_threshold",
+ PGC_SIGHUP,
+ NODE_SINGLENODE,
+ REPLICATION_PAXOS,
+ gettext_noop("Sets the election switch threshold of local DCF node."),
+ NULL},
+ &u_sess->attr.attr_storage.dcf_attr.dcf_election_switch_threshold,
+ 0,
+ 0,
+ INT_MAX,
+ NULL,
+ assign_dcf_election_switch_threshold,
+ NULL},
{{"dcf_max_log_file_size",
PGC_SIGHUP,
NODE_SINGLENODE,
@@ -2035,7 +2099,34 @@ static void InitStorageConfigureNamesInt()
NULL,
NULL,
NULL},
-
+ {{"wal_flush_timeout",
+ PGC_SIGHUP,
+ NODE_ALL,
+ WAL_SETTINGS,
+ gettext_noop("set timeout when iterator table entry."),
+ NULL,
+ GUC_NOT_IN_SAMPLE},
+ &g_instance.attr.attr_storage.wal_flush_timeout,
+ 2,
+ 0,
+ 90000000,
+ NULL,
+ NULL,
+ NULL},
+ {{"wal_flush_delay",
+ PGC_SIGHUP,
+ NODE_ALL,
+ WAL_SETTINGS,
+ gettext_noop("set delay time when iterator table entry."),
+ NULL,
+ GUC_NOT_IN_SAMPLE},
+ &g_instance.attr.attr_storage.wal_flush_delay,
+ 1,
+ 0,
+ 90000000,
+ NULL,
+ NULL,
+ NULL},
{{"checkpoint_wait_timeout",
PGC_SIGHUP,
NODE_ALL,
@@ -2080,6 +2171,20 @@ static void InitStorageConfigureNamesInt()
NULL,
NULL,
NULL},
+ {{"archive_interval",
+ PGC_SIGHUP,
+ NODE_ALL,
+ WAL_ARCHIVING,
+ gettext_noop("OBS archive time interval."),
+ NULL,
+ GUC_UNIT_S},
+ &u_sess->attr.attr_storage.archive_interval,
+ 1,
+ 1,
+ 1000,
+ NULL,
+ NULL,
+ NULL},
/* see max_connections */
{{"max_wal_senders",
PGC_POSTMASTER,
@@ -2094,7 +2199,7 @@ static void InitStorageConfigureNamesInt()
16,
#endif
0,
- MAX_BACKENDS,
+ 1024,
NULL,
NULL,
NULL},
@@ -2108,7 +2213,7 @@ static void InitStorageConfigureNamesInt()
&g_instance.attr.attr_storage.max_replication_slots,
8,
0,
- MAX_BACKENDS, /* XXX? */
+ 1024, /* XXX? */
NULL,
NULL,
NULL},
@@ -2729,6 +2834,34 @@ static void InitStorageConfigureNamesInt()
NULL,
NULL,
NULL},
+ {{"dw_file_num",
+ PGC_POSTMASTER,
+ NODE_ALL,
+ WAL_CHECKPOINTS,
+ gettext_noop("Sets the number of dw batch files."),
+ NULL,
+ 0},
+ &g_instance.attr.attr_storage.dw_file_num,
+ 1,
+ 1,
+ 16,
+ NULL,
+ NULL,
+ NULL},
+ {{"dw_file_size",
+ PGC_POSTMASTER,
+ NODE_ALL,
+ WAL_CHECKPOINTS,
+ gettext_noop("Sets the size of each dw batch file."),
+ NULL,
+ 0},
+ &g_instance.attr.attr_storage.dw_file_size,
+ 256,
+ 32,
+ 256,
+ NULL,
+ NULL,
+ NULL},
{{"recovery_parse_workers",
PGC_POSTMASTER,
NODE_ALL,
@@ -2889,27 +3022,27 @@ static void InitStorageConfigureNamesInt()
NULL,
NULL},
{{"undo_space_limit_size",
- PGC_POSTMASTER,
+ PGC_SIGHUP,
NODE_SINGLENODE,
RESOURCES_DISK,
gettext_noop("Undo space limit size for force recycle."),
NULL,
GUC_UNIT_BLOCKS},
- &g_instance.attr.attr_storage.undo_space_limit_size,
- 4194304, /* 32 GB */
+ &u_sess->attr.attr_storage.undo_space_limit_size,
+ 33554432, /* 256 GB */
102400, /* 800 MB */
INT_MAX,
NULL,
NULL,
NULL},
{{"undo_limit_size_per_transaction",
- PGC_POSTMASTER,
+ PGC_SIGHUP,
NODE_SINGLENODE,
RESOURCES_DISK,
gettext_noop("Undo limit size per transaction."),
NULL,
GUC_UNIT_BLOCKS},
- &g_instance.attr.attr_storage.undo_limit_size_transaction,
+ &u_sess->attr.attr_storage.undo_limit_size_transaction,
4194304, /* 32 GB */
256, /* 2 MB */
INT_MAX,
@@ -2990,7 +3123,7 @@ static void InitStorageConfigureNamesInt()
gettext_noop("Set gtm option, 0 for GTM ,1 GTMLite and 2 GTMFree"),
NULL},
&g_instance.attr.attr_storage.gtm_option,
- GTMOPTION_GTM,
+ GTMOPTION_GTMLITE,
GTMOPTION_GTM,
GTMOPTION_GTMFREE,
NULL,
@@ -3044,13 +3177,27 @@ static void InitStorageConfigureNamesInt()
gettext_noop("Sets the maximum retention time of objects in recyclebin."),
NULL,
GUC_UNIT_S},
- &u_sess->attr.attr_storage.recyclebin_retention,
+ &u_sess->attr.attr_storage.recyclebin_retention_time,
900,
1,
INT_MAX,
NULL,
NULL,
NULL},
+ {{"undo_retention_time",
+ PGC_SIGHUP,
+ NODE_SINGLENODE,
+ UNGROUPED,
+ gettext_noop("Sets the maximum retention time of undo record."),
+ NULL,
+ GUC_UNIT_S},
+ &u_sess->attr.attr_storage.undo_retention_time,
+ 0,
+ 0,
+ INT_MAX,
+ NULL,
+ NULL,
+ NULL},
/* End-of-list marker */
{{NULL,
(GucContext)0,
@@ -3743,7 +3890,7 @@ static void InitStorageConfigureNamesString()
NULL,
GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY},
&g_instance.attr.attr_storage.num_internal_lock_partitions_str,
- "CLOG_PART=256,CSNLOG_PART=512,LOG2_LOCKTABLE_PART=4,TWOPHASE_PART=1",
+ "CLOG_PART=256,CSNLOG_PART=512,LOG2_LOCKTABLE_PART=4,TWOPHASE_PART=1,FASTPATH_PART=20",
NULL,
NULL,
NULL},
@@ -3889,6 +4036,18 @@ static void InitStorageConfigureNamesString()
NULL,
NULL,
NULL},
+ {{"redo_bind_cpu_attr",
+ PGC_POSTMASTER,
+ NODE_ALL,
+ WAL_SETTINGS,
+ gettext_noop("bind redo worker threads to specified cpus"),
+ NULL,
+ GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY},
+ &g_instance.attr.attr_storage.redo_bind_cpu_attr,
+ "nobind",
+ NULL,
+ NULL,
+ NULL},
{{NULL,
(GucContext)0,
(GucNodeType)0,
@@ -4130,6 +4289,7 @@ bool check_enable_gtm_free(bool* newval, void** extra, GucSource source)
/* Initialize storage critical lwlock partition num */
void InitializeNumLwLockPartitions(void)
{
+ Assert(lengthof(LWLockPartInfo) == LWLOCK_PART_KIND);
/* set default values */
SetLWLockPartDefaultNum();
/* Do str copy and remove space. */
@@ -4300,6 +4460,118 @@ static inline bool GetReplCurArrayIsNull()
}
#endif
+static int IsReplConnInfoChanged(const char* replConnInfo, const char* newval)
+{
+ char* temptok = NULL;
+ char* toker = NULL;
+ char* temp = NULL;
+ char* token = NULL;
+ char* tmpToken = NULL;
+ char* oldReplStr = NULL;
+ char* newReplStr = NULL;
+ int repl_length = 0;
+ replconninfo* newReplInfo = NULL;
+ replconninfo* ReplInfo_1 = t_thrd.postmaster_cxt.ReplConnArray[1];
+ if (replConnInfo == NULL || newval == NULL) {
+ return NO_CHANGE;
+ }
+
+ newReplInfo = ParseReplConnInfo(newval, &repl_length);
+ oldReplStr = pstrdup(replConnInfo);
+ newReplStr = pstrdup(newval);
+
+ /* Added replication info and enabled new ip or port */
+ if (strcmp(oldReplStr, "") == 0) {
+ if (strcmp(newReplStr, "") != 0) {
+ /* ReplConnInfo_1 is not configured, it is considered to be new repconninfo */
+ if (ReplInfo_1 == NULL) {
+ pfree_ext(newReplInfo);
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return ADD_REPL_CONN_INFO_WITH_NEW_LOCAL_IP_PORT;
+ }
+
+ if (strcmp(ReplInfo_1->localhost, newReplInfo->localhost) != 0 ||
+ ReplInfo_1->localport != newReplInfo->localport ||
+ ReplInfo_1->localheartbeatport != newReplInfo->localheartbeatport) {
+ pfree_ext(newReplInfo);
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return ADD_REPL_CONN_INFO_WITH_NEW_LOCAL_IP_PORT;
+ } else {
+ pfree_ext(newReplInfo);
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return ADD_REPL_CONN_INFO_WITH_OLD_LOCAL_IP_PORT;
+ }
+ } else {
+ pfree_ext(newReplInfo);
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return NO_CHANGE;
+ }
+ }
+
+ pfree_ext(newReplInfo);
+ temp = strstr(oldReplStr, "iscascade");
+ if (temp == NULL) {
+ temptok = strstr(newReplStr, "iscascade");
+ if (temptok == NULL) {
+ /* Modify the old replication info,
+ excluding disaster recovery configuration information */
+ if (strcmp(oldReplStr, newReplStr) == 0) {
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return NO_CHANGE;
+ } else {
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return OLD_REPL_CHANGE_IP_OR_PORT;
+ }
+ } else {
+ toker = strstr(newReplStr, "iscrossregion");
+ if (toker == NULL) {
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return OLD_REPL_CHANGE_IP_OR_PORT;
+ } else {
+ /* Modify the old replication info and
+ add disaster recovery configuration information */
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return ADD_DISASTER_RECOVERY_INFO;
+ }
+ }
+ } else {
+ temptok = strstr(newReplStr, "iscascade");
+ if (temptok == NULL) {
+ /* Modify the replication info message,
+ the new message does not carry disaster recovery information */
+ token = strtok_r(oldReplStr, "d", &tmpToken);
+ if (strncasecmp(token, newReplStr, strlen(newReplStr)) == 0) {
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return NO_CHANGE;
+ } else {
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return OLD_REPL_CHANGE_IP_OR_PORT;
+ }
+ } else {
+ /* Modify the replication info carrying disaster recovery information */
+ if (strcmp(oldReplStr, newReplStr) == 0) {
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return NO_CHANGE;
+ } else {
+ pfree_ext(oldReplStr);
+ pfree_ext(newReplStr);
+ return OLD_REPL_CHANGE_IP_OR_PORT;
+ }
+ }
+ }
+}
+
/*
* @@GaussDB@@
* Brief : Parse replconninfo1.
@@ -4316,9 +4588,9 @@ static void assign_replconninfo1(const char* newval, void* extra)
* At present, ReplConnArray is only used by PM, so it is safe.
*/
t_thrd.postmaster_cxt.ReplConnArray[1] = ParseReplConnInfo(newval, &repl_length);
- if (u_sess->attr.attr_storage.ReplConnInfoArr[1] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[1], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[1] = true;
+ if (u_sess->attr.attr_storage.ReplConnInfoArr[1] != NULL && newval != NULL) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[1] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[1], newval);
#ifndef ENABLE_MULTIPLE_NODES
/* perceive single --> primary_standby */
@@ -4326,6 +4598,7 @@ static void assign_replconninfo1(const char* newval, void* extra)
t_thrd.postmaster_cxt.HaShmData->current_mode == NORMAL_MODE &&
!GetReplCurArrayIsNull()) {
t_thrd.postmaster_cxt.HaShmData->current_mode = PRIMARY_MODE;
+ g_instance.global_sysdbcache.RefreshHotStandby();
}
#endif
}
@@ -4343,9 +4616,9 @@ static void assign_replconninfo2(const char* newval, void* extra)
pfree(t_thrd.postmaster_cxt.ReplConnArray[2]);
t_thrd.postmaster_cxt.ReplConnArray[2] = ParseReplConnInfo(newval, &repl_length);
- if (u_sess->attr.attr_storage.ReplConnInfoArr[2] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[2], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[2] = true;
+ if (u_sess->attr.attr_storage.ReplConnInfoArr[2] != NULL && newval != NULL) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[2] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[2], newval);
}
}
@@ -4357,9 +4630,9 @@ static void assign_replconninfo3(const char* newval, void* extra)
pfree(t_thrd.postmaster_cxt.ReplConnArray[3]);
t_thrd.postmaster_cxt.ReplConnArray[3] = ParseReplConnInfo(newval, &repl_length);
- if (u_sess->attr.attr_storage.ReplConnInfoArr[3] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[3], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[3] = true;
+ if (u_sess->attr.attr_storage.ReplConnInfoArr[3] != NULL && newval != NULL) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[3] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[3], newval);
}
}
@@ -4371,9 +4644,9 @@ static void assign_replconninfo4(const char* newval, void* extra)
pfree(t_thrd.postmaster_cxt.ReplConnArray[4]);
t_thrd.postmaster_cxt.ReplConnArray[4] = ParseReplConnInfo(newval, &repl_length);
- if (u_sess->attr.attr_storage.ReplConnInfoArr[4] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[4], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[4] = true;
+ if (u_sess->attr.attr_storage.ReplConnInfoArr[4] != NULL && newval != NULL) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[4] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[4], newval);
}
}
@@ -4385,9 +4658,9 @@ static void assign_replconninfo5(const char* newval, void* extra)
pfree(t_thrd.postmaster_cxt.ReplConnArray[5]);
t_thrd.postmaster_cxt.ReplConnArray[5] = ParseReplConnInfo(newval, &repl_length);
- if (u_sess->attr.attr_storage.ReplConnInfoArr[5] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[5], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[5] = true;
+ if (u_sess->attr.attr_storage.ReplConnInfoArr[5] != NULL && newval != NULL) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[5] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[5], newval);
}
}
@@ -4399,9 +4672,9 @@ static void assign_replconninfo6(const char* newval, void* extra)
pfree(t_thrd.postmaster_cxt.ReplConnArray[6]);
t_thrd.postmaster_cxt.ReplConnArray[6] = ParseReplConnInfo(newval, &repl_length);
- if (u_sess->attr.attr_storage.ReplConnInfoArr[6] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[6], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[6] = true;
+ if (u_sess->attr.attr_storage.ReplConnInfoArr[6] != NULL && newval != NULL) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[6] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[6], newval);
}
}
@@ -4413,9 +4686,9 @@ static void assign_replconninfo7(const char* newval, void* extra)
pfree(t_thrd.postmaster_cxt.ReplConnArray[7]);
t_thrd.postmaster_cxt.ReplConnArray[7] = ParseReplConnInfo(newval, &repl_length);
- if (u_sess->attr.attr_storage.ReplConnInfoArr[7] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[7], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[7] = true;
+ if (u_sess->attr.attr_storage.ReplConnInfoArr[7] != NULL && newval != NULL) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[7] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[7], newval);
}
}
@@ -4428,9 +4701,9 @@ static void assign_replconninfo8(const char* newval, void* extra)
}
t_thrd.postmaster_cxt.ReplConnArray[8] = ParseReplConnInfo(newval, &repl_length);
- if (u_sess->attr.attr_storage.ReplConnInfoArr[8] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[8], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[8] = true;
+ if (u_sess->attr.attr_storage.ReplConnInfoArr[8] != NULL && newval != NULL) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[8] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[8], newval);
}
}
@@ -4443,9 +4716,9 @@ static void assign_replconninfo9(const char* newval, void* extra)
}
t_thrd.postmaster_cxt.ReplConnArray[9] = ParseReplConnInfo(newval, &repl_length);
- if (u_sess->attr.attr_storage.ReplConnInfoArr[9] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[9], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[9] = true;
+ if (u_sess->attr.attr_storage.ReplConnInfoArr[9] != NULL && newval != NULL) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[9] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[9], newval);
}
}
@@ -4459,8 +4732,9 @@ static void assign_replconninfo10(const char* newval, void* extra)
t_thrd.postmaster_cxt.ReplConnArray[10] = ParseReplConnInfo(newval, &repl_length);
if (u_sess->attr.attr_storage.ReplConnInfoArr[10] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[10], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[10] = true;
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[10], newval)) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[10] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[10], newval);
}
}
@@ -4474,8 +4748,9 @@ static void assign_replconninfo11(const char* newval, void* extra)
t_thrd.postmaster_cxt.ReplConnArray[11] = ParseReplConnInfo(newval, &repl_length);
if (u_sess->attr.attr_storage.ReplConnInfoArr[11] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[11], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[11] = true;
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[11], newval)) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[11] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[11], newval);
}
}
@@ -4489,8 +4764,9 @@ static void assign_replconninfo12(const char* newval, void* extra)
t_thrd.postmaster_cxt.ReplConnArray[12] = ParseReplConnInfo(newval, &repl_length);
if (u_sess->attr.attr_storage.ReplConnInfoArr[12] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[12], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[12] = true;
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[12], newval)) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[12] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[12], newval);
}
}
@@ -4504,8 +4780,9 @@ static void assign_replconninfo13(const char* newval, void* extra)
t_thrd.postmaster_cxt.ReplConnArray[13] = ParseReplConnInfo(newval, &repl_length);
if (u_sess->attr.attr_storage.ReplConnInfoArr[13] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[13], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[13] = true;
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[13], newval)) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[13] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[13], newval);
}
}
@@ -4519,8 +4796,9 @@ static void assign_replconninfo14(const char* newval, void* extra)
t_thrd.postmaster_cxt.ReplConnArray[14] = ParseReplConnInfo(newval, &repl_length);
if (u_sess->attr.attr_storage.ReplConnInfoArr[14] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[14], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[14] = true;
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[14], newval)) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[14] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[14], newval);
}
}
@@ -4534,8 +4812,9 @@ static void assign_replconninfo15(const char* newval, void* extra)
t_thrd.postmaster_cxt.ReplConnArray[15] = ParseReplConnInfo(newval, &repl_length);
if (u_sess->attr.attr_storage.ReplConnInfoArr[15] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[15], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[15] = true;
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[15], newval)) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[15] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[15], newval);
}
}
@@ -4549,8 +4828,9 @@ static void assign_replconninfo16(const char* newval, void* extra)
t_thrd.postmaster_cxt.ReplConnArray[16] = ParseReplConnInfo(newval, &repl_length);
if (u_sess->attr.attr_storage.ReplConnInfoArr[16] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[16], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[16] = true;
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[16], newval)) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[16] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[16], newval);
}
}
@@ -4564,8 +4844,9 @@ static void assign_replconninfo17(const char* newval, void* extra)
t_thrd.postmaster_cxt.ReplConnArray[17] = ParseReplConnInfo(newval, &repl_length);
if (u_sess->attr.attr_storage.ReplConnInfoArr[17] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[17], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[17] = true;
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[17], newval)) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[17] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[17], newval);
}
}
@@ -4579,8 +4860,9 @@ static void assign_replconninfo18(const char* newval, void* extra)
t_thrd.postmaster_cxt.ReplConnArray[18] = ParseReplConnInfo(newval, &repl_length);
if (u_sess->attr.attr_storage.ReplConnInfoArr[18] != NULL && newval != NULL &&
- strcmp(u_sess->attr.attr_storage.ReplConnInfoArr[18], newval) != 0) {
- t_thrd.postmaster_cxt.ReplConnChanged[18] = true;
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[18], newval)) {
+ t_thrd.postmaster_cxt.ReplConnChangeType[18] =
+ IsReplConnInfoChanged(u_sess->attr.attr_storage.ReplConnInfoArr[18], newval);
}
}
@@ -5029,6 +5311,33 @@ static ReplConnInfo* ParseReplConnInfo(const char* ConnInfoList, int* InfoLength
}
}
+#ifdef ENABLE_LITE_MODE
+ iter = strstr(token, "sslmode");
+ if (iter != NULL) {
+ iter += sizeof("sslmode");
+ while (*iter == ' ' || *iter == '=') {
+ iter++;
+ }
+
+ pNext = iter;
+ iplen = 0;
+ while (*pNext != ' ' && *pNext != '\0') {
+ iplen++;
+ pNext++;
+ }
+ errorno = strncpy_s(repl[parsed].sslmode, SSL_MODE_LEN - 1, iter, iplen);
+ securec_check(errorno, "\0", "\0");
+ repl[parsed].sslmode[iplen] = '\0';
+
+ if (strcmp(repl[parsed].sslmode, "disable") != 0 && strcmp(repl[parsed].sslmode, "allow") != 0 &&
+ strcmp(repl[parsed].sslmode, "prefer") != 0 && strcmp(repl[parsed].sslmode, "require") != 0 &&
+ strcmp(repl[parsed].sslmode, "verify-ca") != 0 && strcmp(repl[parsed].sslmode, "verify-full") != 0) {
+ errorno = strcpy_s(repl[parsed].sslmode, SSL_MODE_LEN, "prefer");
+ securec_check(errorno, "\0", "\0");
+ }
+ }
+#endif
+
token = strtok_r(NULL, ",", &tmp_token);
parsed++;
}
@@ -5150,6 +5459,20 @@ static void assign_dcf_election_timeout(int newval, void* extra)
dcf_set_param("ELECTION_TIMEOUT", std::to_string(newval).c_str());
}
+static void assign_dcf_auto_elc_priority_en(int newval, void* extra)
+{
+ u_sess->attr.attr_storage.dcf_attr.dcf_auto_elc_priority_en = newval;
+ if (t_thrd.proc_cxt.MyProcPid == PostmasterPid)
+ dcf_set_param("AUTO_ELC_PRIORITY_EN", std::to_string(newval).c_str());
+}
+
+static void assign_dcf_election_switch_threshold(int newval, void* extra)
+{
+ u_sess->attr.attr_storage.dcf_attr.dcf_election_switch_threshold = newval;
+ if (t_thrd.proc_cxt.MyProcPid == PostmasterPid)
+ dcf_set_param("ELECTION_SWITCH_THRESHOLD", std::to_string(newval).c_str());
+}
+
static void assign_dcf_run_mode(int newval, void* extra)
{
u_sess->attr.attr_storage.dcf_attr.dcf_run_mode = newval;
diff --git a/src/common/backend/utils/misc/pg_controldata.cpp b/src/common/backend/utils/misc/pg_controldata.cpp
index e5624c337..91f18c8d8 100644
--- a/src/common/backend/utils/misc/pg_controldata.cpp
+++ b/src/common/backend/utils/misc/pg_controldata.cpp
@@ -234,7 +234,7 @@ Datum pg_control_checkpoint(PG_FUNCTION_ARGS)
*/
XLByteToSeg(controlFile->checkPointCopy.redo, segno);
- XLogFileName(xlogfilename, controlFile->checkPointCopy.ThisTimeLineID, segno);
+ XLogFileName(xlogfilename, MAXFNAMELEN, controlFile->checkPointCopy.ThisTimeLineID, segno);
i = 0;
/* Populate the values and null arrays */
diff --git a/src/common/backend/utils/misc/postgresql_distribute.conf.sample b/src/common/backend/utils/misc/postgresql_distribute.conf.sample
index de1abba8f..00cbf2fe4 100644
--- a/src/common/backend/utils/misc/postgresql_distribute.conf.sample
+++ b/src/common/backend/utils/misc/postgresql_distribute.conf.sample
@@ -470,7 +470,7 @@ log_min_duration_statement = 1800000 # -1 is disabled, 0 logs all statements
#log_pagewriter = off
log_connections = off # log connection requirement from client
log_disconnections = off # log disconnection from client
-log_duration = on # log the execution time of each query
+log_duration = off # log the execution time of each query
# when log_duration is on and log_min_duration_statement
# is larger than zero, log the ones whose execution time
# is larger than this threshold
@@ -802,6 +802,8 @@ audit_enabled = on
#audit_function_exec = 0
#audit_copy_exec = 0
#audit_set_parameter = 1 # whether audit set parameter operation
+#audit_xid_info = 0 # whether record xid info in audit log
+#audit_thread_num = 1
#Choose which style to print the explain info, normal,pretty,summary,run
#explain_perf_mode = normal
diff --git a/src/common/backend/utils/misc/postgresql_single.conf.sample b/src/common/backend/utils/misc/postgresql_single.conf.sample
index 76ff11c30..2033781df 100644
--- a/src/common/backend/utils/misc/postgresql_single.conf.sample
+++ b/src/common/backend/utils/misc/postgresql_single.conf.sample
@@ -476,7 +476,7 @@ log_min_duration_statement = 1800000 # -1 is disabled, 0 logs all statements
#log_pagewriter = off
log_connections = off # log connection requirement from client
log_disconnections = off # log disconnection from client
-log_duration = on # log the execution time of each query
+log_duration = off # log the execution time of each query
# when log_duration is on and log_min_duration_statement
# is larger than zero, log the ones whose execution time
# is larger than this threshold
@@ -737,6 +737,8 @@ audit_enabled = on
#audit_function_exec = 0
#audit_copy_exec = 0
#audit_set_parameter = 1 # whether audit set parameter operation
+#audit_xid_info = 0 # whether record xid info in audit log
+#audit_thread_num = 1
#Choose which style to print the explain info, normal,pretty,summary,run
#explain_perf_mode = normal
diff --git a/src/common/backend/utils/misc/superuser.cpp b/src/common/backend/utils/misc/superuser.cpp
index c24429d4a..01ed52d07 100644
--- a/src/common/backend/utils/misc/superuser.cpp
+++ b/src/common/backend/utils/misc/superuser.cpp
@@ -283,7 +283,6 @@ bool CheckExecDirectPrivilege(const char* query)
static void cacheSuperOrSysadmin(Oid roleid)
{
HeapTuple rtup = NULL;
-
u_sess->sec_cxt.last_roleid_is_super = false;
u_sess->sec_cxt.last_roleid_is_sysdba = false;
u_sess->sec_cxt.last_roleid_is_auditadmin = false;
@@ -343,7 +342,7 @@ static void cacheSuperOrSysadmin(Oid roleid)
/* If first time through, set up callback for cache flushes */
if (!u_sess->sec_cxt.roleid_callback_registered) {
- CacheRegisterSyscacheCallback(AUTHOID, RoleidCallback, (Datum)0);
+ CacheRegisterSessionSyscacheCallback(AUTHOID, RoleidCallback, (Datum)0);
u_sess->sec_cxt.roleid_callback_registered = true;
}
diff --git a/src/common/backend/utils/mmgr/AsanMemoryAllocator.cpp b/src/common/backend/utils/mmgr/AsanMemoryAllocator.cpp
index 4a919f06d..b8f712501 100644
--- a/src/common/backend/utils/mmgr/AsanMemoryAllocator.cpp
+++ b/src/common/backend/utils/mmgr/AsanMemoryAllocator.cpp
@@ -824,4 +824,15 @@ void dumpAsanBlock(AsanSet set, StringInfoData* memoryBuf)
return;
}
+
+void GetAsanBlockInfo(AsanSet set, StringInfoData* memoryBuf)
+{
+ for (AsanBlock blk = set->blocks; blk != NULL; blk = blk->next) {
+ uint32 realSize = ASAN_BLOCKRELSZ(blk->requestSize);
+ appendStringInfo(memoryBuf, "%s:%d, %u\n", blk->file, blk->line, realSize);
+ }
+
+ return;
+}
+
#endif
diff --git a/src/common/backend/utils/mmgr/aset.cpp b/src/common/backend/utils/mmgr/aset.cpp
index cb954ea76..d24d354f1 100644
--- a/src/common/backend/utils/mmgr/aset.cpp
+++ b/src/common/backend/utils/mmgr/aset.cpp
@@ -125,7 +125,6 @@
* --------------------
*/
-#define ALLOC_CHUNKHDRSZ MAXALIGN(sizeof(AllocChunkData))
#ifdef MEMORY_CONTEXT_CHECKING
#define ALLOC_MAGICHDRSZ MAXALIGN(sizeof(AllocMagicData))
#else
@@ -143,27 +142,6 @@ typedef struct AllocMagicData {
} AllocMagicData;
#endif
-/*
- * AllocChunk
- * The prefix of each piece of memory in an AllocBlock
- *
- * NB: this MUST match StandardChunkHeader as defined by utils/memutils.h.
- */
-typedef struct AllocChunkData {
- /* aset is the owning aset if allocated, or the freelist link if free */
- void* aset;
- /* size is always the size of the usable space in the chunk */
- Size size;
-#ifdef MEMORY_CONTEXT_CHECKING
- /* when debugging memory usage, also store actual requested size */
- /* this is zero in a free chunk */
- Size requested_size;
- const char* file; /* __FILE__ of palloc/palloc0 call */
- int line; /* __LINE__ of palloc/palloc0 call */
- uint32 prenum; /* prefix magic number */
-#endif
-} AllocChunkData;
-
/*
* AllocPointerIsValid
* True iff pointer is valid allocation pointer.
@@ -232,7 +210,7 @@ static const unsigned char LogTable256[256] = {0,
#ifdef MEMORY_CONTEXT_CHECKING
#define CHECK_CONTEXT_OWNER(context) \
- Assert((context->session_id == u_sess->session_id) || (context->thread_id == gs_thread_self()))
+ Assert((context->thread_id == gs_thread_self() || (context->session_id == u_sess->session_id)))
#else
#define CHECK_CONTEXT_OWNER(context) ((void)0)
#endif
@@ -836,6 +814,8 @@ void GenericMemoryAllocator::AllocSetDelete(MemoryContext context)
template
void* GenericMemoryAllocator::AllocSetAlloc(MemoryContext context, Size align, Size size, const char* file, int line)
{
+ Assert(file != NULL);
+ Assert(line != 0);
AllocSet set = (AllocSet)context;
AllocBlock block;
AllocChunk chunk;
@@ -908,10 +888,12 @@ void* GenericMemoryAllocator::AllocSetAlloc(MemoryContext context, Size align, S
chunk = (AllocChunk)(((char*)block) + ALLOC_BLOCKHDRSZ);
chunk->aset = set;
chunk->size = chunk_size;
-#ifdef MEMORY_CONTEXT_CHECKING
- chunk->requested_size = size;
+#ifdef MEMORY_CONTEXT_TRACK
chunk->file = file;
chunk->line = line;
+#endif
+#ifdef MEMORY_CONTEXT_CHECKING
+ chunk->requested_size = size;
chunk->prenum = PremagicNum;
/* set mark to catch clobber of "unused" space */
if (size < chunk_size)
@@ -973,11 +955,12 @@ void* GenericMemoryAllocator::AllocSetAlloc(MemoryContext context, Size align, S
chunk->aset = (void*)set;
set->freeSpace -= (chunk->size + ALLOC_CHUNKHDRSZ);
-
-#ifdef MEMORY_CONTEXT_CHECKING
- chunk->requested_size = size;
+#ifdef MEMORY_CONTEXT_TRACK
chunk->file = file;
chunk->line = line;
+#endif
+#ifdef MEMORY_CONTEXT_CHECKING
+ chunk->requested_size = size;
chunk->prenum = PremagicNum;
/* set mark to catch clobber of "unused" space */
if (size < chunk->size)
@@ -1051,11 +1034,13 @@ void* GenericMemoryAllocator::AllocSetAlloc(MemoryContext context, Size align, S
availspace -= (availchunk + ALLOC_CHUNKHDRSZ);
chunk->size = availchunk;
+#ifdef MEMORY_CONTEXT_TRACK
+ chunk->file = NULL;
+ chunk->line = 0;
+#endif
#ifdef MEMORY_CONTEXT_CHECKING
chunk->requested_size = 0; /* mark it free */
chunk->prenum = 0;
- chunk->file = NULL;
- chunk->line = 0;
#endif
chunk->aset = (void*)set->freelist[a_fidx];
set->freelist[a_fidx] = chunk;
@@ -1146,10 +1131,12 @@ void* GenericMemoryAllocator::AllocSetAlloc(MemoryContext context, Size align, S
chunk->aset = (void*)set;
chunk->size = chunk_size;
-#ifdef MEMORY_CONTEXT_CHECKING
- chunk->requested_size = size;
+#ifdef MEMORY_CONTEXT_TRACK
chunk->file = file;
chunk->line = line;
+#endif
+#ifdef MEMORY_CONTEXT_CHECKING
+ chunk->requested_size = size;
chunk->prenum = PremagicNum;
/* set mark to catch clobber of "unused" space */
if (size < chunk->size)
@@ -1288,17 +1275,18 @@ void GenericMemoryAllocator::AllocSetFree(MemoryContext context, void* pointer)
int fidx = AllocSetFreeIndex(chunk->size);
chunk->aset = (void*)set->freelist[fidx];
-
set->freeSpace += chunk->size + ALLOC_CHUNKHDRSZ;
-#ifdef MEMORY_CONTEXT_CHECKING
- /* Reset requested_size to 0 in chunks that are on freelist */
- AllocMagicData* magic =
- (AllocMagicData*)(((char*)chunk) + ALLOC_CHUNKHDRSZ + MAXALIGN(chunk->requested_size) - ALLOC_MAGICHDRSZ);
- chunk->requested_size = 0;
+#ifdef MEMORY_CONTEXT_TRACK
chunk->file = NULL;
chunk->line = 0;
+#endif
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* Reset requested_size to 0 in chunks that are on freelist */
+ chunk->requested_size = 0;
chunk->prenum = 0;
+ AllocMagicData* magic =
+ (AllocMagicData*)(((char*)chunk) + ALLOC_CHUNKHDRSZ + MAXALIGN(chunk->requested_size) - ALLOC_MAGICHDRSZ);
magic->aset = NULL;
magic->size = 0;
magic->posnum = 0;
@@ -1371,16 +1359,17 @@ void* GenericMemoryAllocator::AllocSetRealloc(
*/
if (oldsize >= (size + ALLOC_MAGICHDRSZ)) {
size += ALLOC_MAGICHDRSZ;
+#ifdef MEMORY_CONTEXT_TRACK
+ chunk->file = file;
+ chunk->line = line;
+#endif
#ifdef MEMORY_CONTEXT_CHECKING
#ifdef RANDOMIZE_ALLOCATED_MEMORY
/* We can only fill the extra space if we know the prior request */
if (size > chunk->requested_size)
randomize_mem((char*)AllocChunkGetPointer(chunk) + chunk->requested_size, size - chunk->requested_size);
#endif
-
chunk->requested_size = size;
- chunk->file = file;
- chunk->line = line;
chunk->prenum = PremagicNum;
/* set mark to catch clobber of "unused" space */
if (size < oldsize)
@@ -1459,16 +1448,16 @@ void* GenericMemoryAllocator::AllocSetRealloc(
if (block->next)
block->next->prev = block;
chunk->size = chksize;
-
+#ifdef MEMORY_CONTEXT_TRACK
+ chunk->file = file;
+ chunk->line = line;
+#endif
#ifdef MEMORY_CONTEXT_CHECKING
#ifdef RANDOMIZE_ALLOCATED_MEMORY
/* We can only fill the extra space if we know the prior request */
randomize_mem((char*)AllocChunkGetPointer(chunk) + chunk->requested_size, size - chunk->requested_size);
#endif
-
chunk->requested_size = size;
- chunk->file = file;
- chunk->line = line;
chunk->prenum = PremagicNum;
/* set mark to catch clobber of "unused" space */
if (size < chunk->size)
@@ -1793,6 +1782,49 @@ void dumpAllocBlock(AllocSet set, StringInfoData* memoryBuf)
#endif /* MEMORY_CONTEXT_CHECKING */
+#ifdef MEMORY_CONTEXT_TRACK
+/*
+ * chunk walker
+ */
+static void GetAllocChunkInfo(AllocSet set, AllocBlock blk, StringInfoData* memoryBuf)
+{
+ char* bpoz = ((char*)blk) + ALLOC_BLOCKHDRSZ;
+ while (bpoz < blk->freeptr) {
+ AllocChunk chunk = (AllocChunk)bpoz;
+ Size chsize = chunk->size;
+
+ /* the chunk is free, so skip it */
+ if (chunk->aset != set) {
+ bpoz += ALLOC_CHUNKHDRSZ + chsize;
+ continue;
+ }
+
+ if (memoryBuf != NULL) {
+ appendStringInfo(memoryBuf, "%s:%d, %lu\n", chunk->file, chunk->line, chunk->size);
+ }
+
+ bpoz += ALLOC_CHUNKHDRSZ + chsize;
+ }
+}
+
+void GetAllocBlockInfo(AllocSet set, StringInfoData* memoryBuf)
+{
+ for (AllocBlock blk = set->blocks; blk != NULL; blk = blk->next) {
+ char* bpoz = ((char*)blk) + ALLOC_BLOCKHDRSZ;
+ long blk_used = blk->freeptr - bpoz;
+
+ /* empty block - empty can be keeper-block only (from AllocSetCheck()) */
+ if (!blk_used)
+ continue;
+
+ /* there are chunks in block */
+ GetAllocChunkInfo(set, blk, memoryBuf);
+ }
+
+ return;
+}
+
+#endif
/*
* alloc_trunk_size
* Given a width, calculate how many bytes are actually allocated
diff --git a/src/common/backend/utils/mmgr/mcxt.cpp b/src/common/backend/utils/mmgr/mcxt.cpp
index 348a03df8..f4b722e12 100644
--- a/src/common/backend/utils/mmgr/mcxt.cpp
+++ b/src/common/backend/utils/mmgr/mcxt.cpp
@@ -64,7 +64,6 @@ THR_LOCAL MemoryContext AlignMemoryContext = NULL;
static void MemoryContextStatsInternal(MemoryContext context, int level);
static void FreeMemoryContextList(List* context_list);
-static void* MemoryAllocFromContext(MemoryContext context, Size size, const char* file, int line);
#ifdef PGXC
void* allocTopCxt(size_t s);
@@ -73,7 +72,6 @@ void* allocTopCxt(size_t s);
/*****************************************************************************
* EXPORTED ROUTINES *
*****************************************************************************/
-
static inline void InsertMemoryAllocInfo(const void* pointer, MemoryContext context,
const char* file, int line, Size size)
{
@@ -115,7 +113,6 @@ static inline void RemoveMemoryContextInfo(MemoryContext context)
}
}
}
-
/*
* MemoryContextInit
@@ -370,6 +367,13 @@ void MemoryContextDelete(MemoryContext context)
if (!IsTopMemCxt(context)) {
PreventActionOnSealedContext(context);
+ } else {
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* before delete top memcxt, you should close lsc */
+ if (EnableGlobalSysCache() && context == t_thrd.top_mem_cxt && t_thrd.lsc_cxt.lsc != NULL) {
+ Assert(t_thrd.lsc_cxt.lsc->is_closed);
+ }
+#endif
}
MemoryContext old_context = MemoryContextSwitchTo(t_thrd.top_mem_cxt);
@@ -379,7 +383,7 @@ void MemoryContextDelete(MemoryContext context)
(void)MemoryContextSwitchTo(old_context);
/* u_sess->top_mem_cxt may be reused by other threads, set it null before the memory it points to be freed. */
- if (context == u_sess->top_mem_cxt) {
+ if (u_sess != NULL && context == u_sess->top_mem_cxt) {
u_sess->top_mem_cxt = NULL;
}
@@ -430,6 +434,13 @@ void MemoryContextResetAndDeleteChildren(MemoryContext context)
AssertArg(MemoryContextIsValid(context));
if (!IsTopMemCxt(context)) {
PreventActionOnSealedContext(context);
+ } else {
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* before delete top memcxt, you should close lsc */
+ if (EnableGlobalSysCache() && context == t_thrd.top_mem_cxt && t_thrd.lsc_cxt.lsc != NULL) {
+ Assert(t_thrd.lsc_cxt.lsc->is_closed);
+ }
+#endif
}
List context_list = {T_List, 0, NULL, NULL};
@@ -665,6 +676,10 @@ static void MemoryContextStatsInternal(MemoryContext context, int level)
void MemoryContextCheck(MemoryContext context, bool own_by_session)
{
MemoryContext child;
+
+ if (!g_instance.attr.attr_memory.enable_memory_context_check_debug) {
+ return;
+ }
if (unlikely(context == NULL)) {
elog(PANIC, "Switch to Invalid memory context");
}
@@ -952,16 +967,17 @@ void MemoryContextCheckMaxSize(MemoryContext context, Size size, const char* fil
void MemoryContextCheckSessionMemory(MemoryContext context, Size size, const char* file, int line)
{
/* libcomm permanent thread don't need to check session memory */
- if (STATEMENT_MAX_MEM && (t_thrd.shemem_ptr_cxt.mySessionMemoryEntry != NULL) &&
+ if ((t_thrd.shemem_ptr_cxt.mySessionMemoryEntry != NULL) &&
(t_thrd.comm_cxt.LibcommThreadType == LIBCOMM_NONE) && (context->level >= MEMORY_CONTEXT_CONTROL_LEVEL) &&
!t_thrd.int_cxt.CritSectionCount && !(AmPostmasterProcess()) && IsNormalProcessingMode()) {
int used = (t_thrd.shemem_ptr_cxt.mySessionMemoryEntry->queryMemInChunks << (chunkSizeInBits - BITS_IN_MB))
<< BITS_IN_KB;
- if (STATEMENT_MAX_MEM < used)
+ if (u_sess->attr.attr_sql.statement_max_mem < used)
ereport(ERROR,
(errcode(ERRCODE_INSUFFICIENT_RESOURCES),
errmsg(
- "Session used memory %d Kbytes is beyond the limitation %d Kbytes.", used, STATEMENT_MAX_MEM),
+ "Session used memory %d Kbytes is beyond the limitation %d Kbytes.", used,
+ u_sess->attr.attr_sql.statement_max_mem),
errdetail("Session estimated memory is %d Mbytes and MemoryContext %s request of size %lu "
"bytes.[file:%s,line:%d]",
t_thrd.shemem_ptr_cxt.mySessionMemoryEntry->estimate_memory,
@@ -972,7 +988,7 @@ void MemoryContextCheckSessionMemory(MemoryContext context, Size size, const cha
}
}
-static void* MemoryAllocFromContext(MemoryContext context, Size size, const char* file, int line)
+void* MemoryAllocFromContext(MemoryContext context, Size size, const char* file, int line)
{
void* ret = NULL;
if (!AllocSizeIsValid(size)) {
@@ -1000,7 +1016,9 @@ static void* MemoryAllocFromContext(MemoryContext context, Size size, const char
#endif
/* check if the session used memory is beyond the limitation */
- MemoryContextCheckSessionMemory(context, size, file, line);
+ if (unlikely(STATEMENT_MAX_MEM)) {
+ MemoryContextCheckSessionMemory(context, size, file, line);
+ }
InsertMemoryAllocInfo(ret, context, file, line, size);
@@ -1016,11 +1034,10 @@ static void* MemoryAllocFromContext(MemoryContext context, Size size, const char
void* MemoryContextAllocDebug(MemoryContext context, Size size, const char* file, int line)
{
AssertArg(MemoryContextIsValid(context));
-
PreventActionOnSealedContext(context);
+
return MemoryAllocFromContext(context, size, file, line);
}
-
/*
* MemoryContextAllocZero
* Like MemoryContextAlloc, but clears allocated memory
@@ -1033,9 +1050,9 @@ void* MemoryContextAllocZeroDebug(MemoryContext context, Size size, const char*
void* ret = NULL;
AssertArg(MemoryContextIsValid(context));
-
+#ifdef MEMORY_CONTEXT_CHECKING
PreventActionOnSealedContext(context);
-
+#endif
if (!AllocSizeIsValid(size)) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -1061,8 +1078,9 @@ void* MemoryContextAllocZeroDebug(MemoryContext context, Size size, const char*
#endif
/* check if the session used memory is beyond the limitation */
- MemoryContextCheckSessionMemory(context, size, file, line);
-
+ if (unlikely(STATEMENT_MAX_MEM)) {
+ MemoryContextCheckSessionMemory(context, size, file, line);
+ }
MemSetAligned(ret, 0, size);
InsertMemoryAllocInfo(ret, context, file, line, size);
@@ -1110,8 +1128,9 @@ void* MemoryContextAllocZeroAlignedDebug(MemoryContext context, Size size, const
#endif
/* check if the session used memory is beyond the limitation */
- MemoryContextCheckSessionMemory(context, size, file, line);
-
+ if (unlikely(STATEMENT_MAX_MEM)) {
+ MemoryContextCheckSessionMemory(context, size, file, line);
+ }
MemSetLoop(ret, 0, size);
InsertMemoryAllocInfo(ret, context, file, line, size);
@@ -1128,8 +1147,9 @@ void* palloc_extended(Size size, int flags)
void* ret = NULL;
AssertArg(MemoryContextIsValid(CurrentMemoryContext));
+#ifdef MEMORY_CONTEXT_CHECKING
PreventActionOnSealedContext(CurrentMemoryContext);
-
+#endif
if (!AllocSizeIsValid(size)) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -1150,8 +1170,9 @@ void* palloc_extended(Size size, int flags)
MemSetAligned(ret, 0, size);
/* check if the session used memory is beyond the limitation */
- MemoryContextCheckSessionMemory(CurrentMemoryContext, size, __FILE__, __LINE__);
-
+ if (unlikely(STATEMENT_MAX_MEM)) {
+ MemoryContextCheckSessionMemory(CurrentMemoryContext, size, __FILE__, __LINE__);
+ }
InsertMemoryAllocInfo(ret, CurrentMemoryContext, __FILE__, __LINE__, size);
return ret;
@@ -1194,11 +1215,12 @@ void pfree(void* pointer)
#endif
AssertArg(MemoryContextIsValid(context));
+#ifdef MEMORY_CONTEXT_CHECKING
if (!IsTopMemCxt(context)) {
/* No prevent on top memory context as they may be sealed. */
PreventActionOnSealedContext(context);
}
-
+#endif
RemoveMemoryAllocInfo(pointer, context);
(*context->methods->free_p)(context, pointer);
@@ -1246,8 +1268,9 @@ void* repalloc_noexcept_Debug(void* pointer, Size size, const char* file, int li
return NULL;
}
/* check if the session used memory is beyond the limitation */
- MemoryContextCheckSessionMemory(context, size, file, line);
-
+ if (unlikely(STATEMENT_MAX_MEM)) {
+ MemoryContextCheckSessionMemory(context, size, file, line);
+ }
InsertMemoryAllocInfo(ret, context, file, line, size);
return ret;
@@ -1308,8 +1331,9 @@ void* repallocDebug(void* pointer, Size size, const char* file, int line)
#endif
/* check if the session used memory is beyond the limitation */
- MemoryContextCheckSessionMemory(context, size, file, line);
-
+ if (unlikely(STATEMENT_MAX_MEM)) {
+ MemoryContextCheckSessionMemory(context, size, file, line);
+ }
InsertMemoryAllocInfo(ret, context, file, line, size);
return ret;
@@ -1350,8 +1374,9 @@ void* MemoryContextMemalignAllocDebug(MemoryContext context, Size align, Size si
#endif
/* check if the session used memory is beyond the limitation */
- MemoryContextCheckSessionMemory(context, size, file, line);
-
+ if (unlikely(STATEMENT_MAX_MEM)) {
+ MemoryContextCheckSessionMemory(context, size, file, line);
+ }
InsertMemoryAllocInfo(ret, context, file, line, size);
return ret;
@@ -1395,8 +1420,9 @@ void* MemoryContextAllocHugeDebug(MemoryContext context, Size size, const char*
#endif
/* check if the session used memory is beyond the limitation */
- MemoryContextCheckSessionMemory(context, size, file, line);
-
+ if (unlikely(STATEMENT_MAX_MEM)) {
+ MemoryContextCheckSessionMemory(context, size, file, line);
+ }
InsertMemoryAllocInfo(ret, context, file, line, size);
return ret;
@@ -1460,7 +1486,9 @@ void* repallocHugeDebug(void* pointer, Size size, const char* file, int line)
#endif
/* check if the session used memory is beyond the limitation */
- MemoryContextCheckSessionMemory(context, size, file, line);
+ if (unlikely(STATEMENT_MAX_MEM)) {
+ MemoryContextCheckSessionMemory(context, size, file, line);
+ }
InsertMemoryAllocInfo(ret, context, file, line, size);
@@ -1621,6 +1649,13 @@ void MemoryContextDestroyAtThreadExit(MemoryContext context)
MemoryContext pContext = context;
if (!IsTopMemCxt(context)) {
PreventActionOnSealedContext(context);
+ } else {
+#ifdef MEMORY_CONTEXT_CHECKING
+ /* before delete top memcxt, you should close lsc */
+ if (EnableGlobalSysCache() && context == t_thrd.top_mem_cxt && t_thrd.lsc_cxt.lsc != NULL) {
+ Assert(t_thrd.lsc_cxt.lsc->is_closed);
+ }
+#endif
}
if (pContext != NULL) {
diff --git a/src/common/backend/utils/mmgr/memprot.cpp b/src/common/backend/utils/mmgr/memprot.cpp
index 0749658e2..75522c1d3 100755
--- a/src/common/backend/utils/mmgr/memprot.cpp
+++ b/src/common/backend/utils/mmgr/memprot.cpp
@@ -114,17 +114,6 @@ bool gs_memory_enjection(void)
}
#endif
-bool compressed_mem_reserve(Size sz, bool protect)
-{
- return MemoryProtectFunctions::gs_memprot_reserve(sz, protect);
-}
-
-void compressed_mem_release(Size sz)
-{
- MemoryProtectFunctions::gs_memprot_release(sz);
-
-}
-
/*
* check if the node is on heavy memory status now?
* is strict is true, we'll do some pre-judgement.
@@ -918,36 +907,6 @@ int MemoryProtectFunctions::gs_posix_memalign(void** memptr, Size alignment, Siz
return ENOMEM; /* insufficient memory */
}
-/**
- * reseve memory for mmap of compressed table
- * @tparam mem_type MEM_SHRD is supported only
- * @param sz reserved size(bytes)
- * @param needProtect
- * @return success or not
- */
-template
-bool MemoryProtectFunctions::gs_memprot_reserve(Size sz, bool needProtect)
-{
- if (type != MEM_SHRD) {
- return false;
- }
- return memTracker_ReserveMem(sz, needProtect);
-}
-
-/**
- * release the momery allocated by gs_memprot_reserve
- * @tparam type MEM_SHRD is supported only
- * @param sz free size(bytes)
- */
-template
-void MemoryProtectFunctions::gs_memprot_release(Size sz)
-{
- if (type != MEM_SHRD) {
- return;
- }
- memTracker_ReleaseMem(sz);
-}
-
/* thread level initialization */
void gs_memprot_thread_init(void)
{
diff --git a/src/common/backend/utils/mmgr/portalmem.cpp b/src/common/backend/utils/mmgr/portalmem.cpp
index cb8cef96f..fddc2e39d 100755
--- a/src/common/backend/utils/mmgr/portalmem.cpp
+++ b/src/common/backend/utils/mmgr/portalmem.cpp
@@ -206,7 +206,7 @@ Portal CreatePortal(const char* name, bool allowDup, bool dupSilent, bool is_fro
ereport(ERROR, (errcode(ERRCODE_DUPLICATE_CURSOR), errmsg("cursor \"%s\" already exists", name)));
if (dupSilent == false)
ereport(WARNING, (errcode(ERRCODE_DUPLICATE_CURSOR), errmsg("closing existing cursor \"%s\"", name)));
- PortalDrop(portal, false, true);
+ PortalDrop(portal, false);
}
/* make new portal structure */
@@ -222,7 +222,6 @@ Portal CreatePortal(const char* name, bool allowDup, bool dupSilent, bool is_fro
/* create a resource owner for the portal */
portal->resowner = ResourceOwnerCreate(t_thrd.utils_cxt.CurTransactionResourceOwner, "Portal",
THREAD_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_EXECUTOR));
- RESOWNER_LOG("create", portal->resowner);
/* initialize portal fields that don't start off zero */
portal->status = PORTAL_NEW;
@@ -244,8 +243,11 @@ Portal CreatePortal(const char* name, bool allowDup, bool dupSilent, bool is_fro
CURSOR_ATTRIBUTE_NUMBER * sizeof(void*));
securec_check(rc, "\0", "\0");
portal->funcUseCount = 0;
+ portal->hasStreamForPlpgsql = false;
#ifndef ENABLE_MULTIPLE_NODES
portal->streamInfo.Reset();
+ portal->isAutoOutParam = false;
+ portal->isPkgCur = false;
#endif
/* put portal in table (sets portal->name) */
PortalHashTableInsert(portal, name);
@@ -370,11 +372,23 @@ void PortalCreateHoldStore(Portal portal)
* Create the memory context that is used for storage of the tuple set.
* Note this is NOT a child of the portal's heap memory.
*/
+#ifndef ENABLE_MULTIPLE_NODES
+ if (portal->isAutoOutParam) {
+ portal->holdContext = GetAvailableHoldContext(u_sess->plsql_cxt.auto_parent_session_pkgs->portalContext);
+ } else {
+ portal->holdContext = AllocSetContextCreate(u_sess->top_portal_cxt,
+ "PortalHoldContext",
+ ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE);
+ }
+#else
portal->holdContext = AllocSetContextCreate(u_sess->top_portal_cxt,
"PortalHoldContext",
ALLOCSET_DEFAULT_MINSIZE,
ALLOCSET_DEFAULT_INITSIZE,
ALLOCSET_DEFAULT_MAXSIZE);
+#endif
/*
* Create the tuple store, selecting cross-transaction temp files, and
@@ -495,7 +509,7 @@ void MarkPortalFailed(Portal portal)
* PortalDrop
* Destroy the portal.
*/
-void PortalDrop(Portal portal, bool isTopCommit, bool isInCreate)
+void PortalDrop(Portal portal, bool isTopCommit)
{
if (!PortalIsValid(portal)) {
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("portal is NULL")));
@@ -553,19 +567,10 @@ void PortalDrop(Portal portal, bool isTopCommit, bool isInCreate)
*/
if (portal->resowner && (!isTopCommit || portal->status == PORTAL_FAILED)) {
bool isCommit = (portal->status != PORTAL_FAILED);
- if (portal->resowner && isInCreate && ENABLE_SQL_BETA_FEATURE(RESOWNER_DEBUG)) {
- RESOWNER_LOG("delete for create", portal->resowner);
- ResourceOwnerRelease(portal->resowner, RESOURCE_RELEASE_BEFORE_LOCKS, isCommit, false);
- ResourceOwnerRelease(portal->resowner, RESOURCE_RELEASE_LOCKS, isCommit, false);
- ResourceOwnerRelease(portal->resowner, RESOURCE_RELEASE_AFTER_LOCKS, isCommit, false);
- portal->resowner = NULL;
- } else {
- RESOWNER_LOG("delete", portal->resowner);
- ResourceOwnerRelease(portal->resowner, RESOURCE_RELEASE_BEFORE_LOCKS, isCommit, false);
- ResourceOwnerRelease(portal->resowner, RESOURCE_RELEASE_LOCKS, isCommit, false);
- ResourceOwnerRelease(portal->resowner, RESOURCE_RELEASE_AFTER_LOCKS, isCommit, false);
- ResourceOwnerDelete(portal->resowner);
- }
+ ResourceOwnerRelease(portal->resowner, RESOURCE_RELEASE_BEFORE_LOCKS, isCommit, false);
+ ResourceOwnerRelease(portal->resowner, RESOURCE_RELEASE_LOCKS, isCommit, false);
+ ResourceOwnerRelease(portal->resowner, RESOURCE_RELEASE_AFTER_LOCKS, isCommit, false);
+ ResourceOwnerDelete(portal->resowner);
}
portal->resowner = NULL;
@@ -574,7 +579,12 @@ void PortalDrop(Portal portal, bool isTopCommit, bool isInCreate)
* conditions; since the tuplestore would have been using cross-
* transaction storage, its temp files need to be explicitly deleted.
*/
+#ifndef ENABLE_MULTIPLE_NODES
+ /* autonomous transactions procedure out param portal cleaned by its parent session */
+ if (portal->holdStore && !portal->isAutoOutParam) {
+#else
if (portal->holdStore) {
+#endif
MemoryContext oldcontext;
oldcontext = MemoryContextSwitchTo(portal->holdContext);
@@ -599,7 +609,11 @@ void PortalDrop(Portal portal, bool isTopCommit, bool isInCreate)
#endif
/* delete tuplestore storage, if any */
+#ifndef ENABLE_MULTIPLE_NODES
+ if (portal->holdContext && !portal->isAutoOutParam)
+#else
if (portal->holdContext)
+#endif
MemoryContextDelete(portal->holdContext);
/* release subsidiary storage */
@@ -614,6 +628,10 @@ void PortalDrop(Portal portal, bool isTopCommit, bool isInCreate)
u_sess->parser_cxt.param_info = NULL;
}
+#ifndef ENABLE_MULTIPLE_NODES
+ /* reset portal cursor attribute */
+ ResetCursorAtrribute(portal);
+#endif
/* release portal struct (it's in u_sess->portal_mem_cxt) */
pfree(portal);
}
@@ -650,7 +668,7 @@ void PortalHashTableDeleteAll(void)
/*
* "Hold" a portal. Prepare it for access by later transactions.
*/
-static void HoldPortal(Portal portal)
+void HoldPortal(Portal portal)
{
/*
* Note that PersistHoldablePortal() must release all resources
@@ -1211,6 +1229,7 @@ Datum pg_cursor(PG_FUNCTION_ARGS)
Portal portal = hentry->portal;
Datum values[6];
bool nulls[6];
+ char* mask_string = NULL;
/* report only "visible" entries */
if (!portal->visible)
@@ -1220,7 +1239,13 @@ Datum pg_cursor(PG_FUNCTION_ARGS)
securec_check(ss_rc, "\0", "\0");
values[0] = CStringGetTextDatum(portal->name);
- values[1] = CStringGetTextDatum(portal->sourceText);
+ mask_string = maskPassword(portal->sourceText);
+ if (mask_string == NULL) {
+ values[1] = CStringGetTextDatum(portal->sourceText);
+ } else {
+ values[1] = CStringGetTextDatum(mask_string);
+ pfree_ext(mask_string);
+ }
values[2] = BoolGetDatum(portal->cursorOptions & CURSOR_OPT_HOLD);
values[3] = BoolGetDatum(portal->cursorOptions & CURSOR_OPT_BINARY);
values[4] = BoolGetDatum(portal->cursorOptions & CURSOR_OPT_SCROLL);
@@ -1262,9 +1287,10 @@ bool ThereAreNoReadyPortals(void)
* @in mySubid: current transaction Id.
* @in funOid: function oid, 0 if in exception block.
* @in funUseCount:times of function had been used, 0 if in exception block.
+ * @in reset: wether reset cursor's option or not.
* Return: void
*/
-void ResetPortalCursor(SubTransactionId mySubid, Oid funOid, int funUseCount)
+void ResetPortalCursor(SubTransactionId mySubid, Oid funOid, int funUseCount, bool reset)
{
HASH_SEQ_STATUS status;
PortalHashEnt *hentry = NULL;
@@ -1290,7 +1316,7 @@ void ResetPortalCursor(SubTransactionId mySubid, Oid funOid, int funUseCount)
continue;
}
- ResetCursorOption(portal, true);
+ ResetCursorOption(portal, reset);
}
}
@@ -1337,7 +1363,7 @@ HoldPinnedPortals(void)
if (portal->status != PORTAL_READY)
ereport(ERROR, (errmsg("pinned portal(%s) is not ready to be auto-held, with status[%d]",
portal->name, portal->status)));
-
+
HoldPortal(portal);
portal->autoHeld = true;
}
diff --git a/src/common/backend/utils/resowner/resowner.cpp b/src/common/backend/utils/resowner/resowner.cpp
index d6499d7f6..6dbb7a099 100755
--- a/src/common/backend/utils/resowner/resowner.cpp
+++ b/src/common/backend/utils/resowner/resowner.cpp
@@ -28,6 +28,8 @@
#include "storage/predicate.h"
#include "storage/proc.h"
#include "storage/smgr/segment.h"
+#include "utils/knl_partcache.h"
+#include "utils/knl_relcache.h"
#include "utils/memutils.h"
#include "utils/rel.h"
#include "utils/rel_gs.h"
@@ -50,6 +52,35 @@ typedef struct ResourceOwnerData {
Buffer* buffers; /* dynamically allocated array */
int maxbuffers; /* currently allocated array size */
+
+ int nlocalcatclist;
+ LocalCatCList** localcatclists;
+ int maxlocalcatclists;
+
+ int nlocalcatctup;
+ LocalCatCTup** localcatctups;
+ int maxlocalcatctups;
+
+ int nglobalcatctup;
+ GlobalCatCTup** globalcatctups;
+ int maxglobalcatctups;
+
+ int nglobalcatclist;
+ GlobalCatCList** globalcatclists;
+ int maxglobalcatclist;
+
+ int nglobalbaseentry;
+ GlobalBaseEntry** globalbaseentries;
+ int maxglobalbaseentry;
+
+ int nglobaldbentry;
+ GlobalSysDBCacheEntry** globaldbentries;
+ int maxglobaldbentry;
+
+ int nglobalisexclusive;
+ volatile uint32** globalisexclusives;
+ int maxglobalisexclusive;
+
/* We have built-in support for remembering catcache references */
int ncatrefs; /* number of owned catcache pins */
HeapTuple* catrefs; /* dynamically allocated array */
@@ -111,6 +142,11 @@ typedef struct ResourceOwnerData {
pthread_mutex_t** pThdMutexs;
int maxPThdMutexs;
+ /* We have built-in support for remembering pthread_rwlock */
+ int nPthreadRWlock;
+ pthread_rwlock_t** pThdRWlocks;
+ int maxPThdRWlocks;
+
/* We have built-in support for remembering partition map references */
int npartmaprefs;
PartitionMap** partmaprefs;
@@ -128,15 +164,16 @@ typedef struct ResourceOwnerData {
} ResourceOwnerData;
THR_LOCAL ResourceOwner IsolatedResourceOwner = NULL;
-
-/*
- * List of add-on callbacks for resource releasing
- */
-typedef struct ResourceReleaseCallbackItem {
- struct ResourceReleaseCallbackItem* next;
- ResourceReleaseCallback callback;
- void* arg;
-} ResourceReleaseCallbackItem;
+#ifdef MEMORY_CONTEXT_CHECKING
+#define PrintGlobalSysCacheLeakWarning(owner, strinfo) \
+do { \
+ if (EnableLocalSysCache() && LOCAL_SYSDB_RESOWNER != (owner)) { \
+ ereport(WARNING, (errmsg("global syscache reference leak %s %s %d", strinfo, __FILE__, __LINE__))); \
+ } \
+} while(0)
+#else
+#define PrintGlobalSysCacheLeakWarning(owner, strinfo)
+#endif
/* Internal routines */
static void ResourceOwnerReleaseInternal(
@@ -167,18 +204,22 @@ ResourceOwner ResourceOwnerCreate(ResourceOwner parent, const char* name, Memory
{
ResourceOwner owner;
- owner = (ResourceOwner)MemoryContextAllocZero(memCxt, sizeof(ResourceOwnerData));
+ MemoryContext context = AllocSetContextCreate(memCxt,
+ "ResourceOwnerCxt",
+ ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE);
+ owner = (ResourceOwner)MemoryContextAllocZero(context, sizeof(ResourceOwnerData));
owner->name = name;
- owner->memCxt = memCxt;
+ owner->memCxt = context;
owner->valid = true;
-
if (parent) {
owner->parent = parent;
owner->nextchild = parent->firstchild;
parent->firstchild = owner;
}
- if (parent == NULL && strcmp(name, "TopTransaction") != 0)
+ if (parent == NULL && strcmp(name, "TopTransaction") != 0 && strcmp(name, "InitLocalSysCache") != 0)
IsolatedResourceOwner = owner;
return owner;
@@ -234,7 +275,6 @@ static void ResourceOwnerReleaseInternal(
{
ResourceOwner child;
ResourceOwner save;
- ResourceReleaseCallbackItem* item = NULL;
/* Recurse to handle descendants */
for (child = owner->firstchild; child != NULL; child = child->nextchild) {
@@ -316,16 +356,8 @@ static void ResourceOwnerReleaseInternal(
* As with buffer pins, warn if any are left at commit time, and
* release back-to-front for speed.
*/
- while (owner->nrelrefs > 0) {
- if (isCommit)
- PrintRelCacheLeakWarning(owner->relrefs[owner->nrelrefs - 1]);
- RelationClose(owner->relrefs[owner->nrelrefs - 1]);
- }
- while (owner->npartrefs > 0) {
- if (isCommit)
- PrintPartCacheLeakWarning(owner->partrefs[owner->npartrefs - 1]);
- PartitionClose(owner->partrefs[owner->npartrefs - 1]);
- }
+ ResourceOwnerReleaseRelationRef(owner, isCommit);
+ ResourceOwnerReleasePartitionRef(owner, isCommit);
// Ditto for pthread mutex
//
while (owner->nPthreadMutex > 0) {
@@ -333,6 +365,12 @@ static void ResourceOwnerReleaseInternal(
PrintPthreadMutexLeakWarning(owner->pThdMutexs[owner->nPthreadMutex - 1]);
PthreadMutexUnlock(owner, owner->pThdMutexs[owner->nPthreadMutex - 1]);
}
+ ResourceOwnerReleaseRWLock(owner, isCommit);
+ ResourceOwnerReleaseGlobalCatCList(owner, isCommit);
+ ResourceOwnerReleaseGlobalCatCTup(owner, isCommit);
+ ResourceOwnerReleaseGlobalBaseEntry(owner, isCommit);
+ ResourceOwnerReleaseGlobalDBEntry(owner, isCommit);
+ ResourceOwnerReleaseGlobalIsExclusive(owner, isCommit);
} else if (phase == RESOURCE_RELEASE_LOCKS) {
if (isTopLevel) {
/*
@@ -367,15 +405,19 @@ static void ResourceOwnerReleaseInternal(
* release back-to-front for speed.
*/
while (owner->ncatrefs > 0) {
+ Assert(!EnableLocalSysCache());
if (isCommit)
PrintCatCacheLeakWarning(owner->catrefs[owner->ncatrefs - 1]);
ReleaseCatCache(owner->catrefs[owner->ncatrefs - 1]);
}
+ ResourceOwnerReleaseLocalCatCList(owner, isCommit);
+ ResourceOwnerReleaseLocalCatCTup(owner, isCommit);
/* Ditto for catcache lists */
while (owner->ncatlistrefs > 0) {
+ Assert(!EnableLocalSysCache());
if (isCommit)
PrintCatCacheListLeakWarning(owner->catlistrefs[owner->ncatlistrefs - 1]);
- ReleaseCatCacheList(owner->catlistrefs[owner->ncatlistrefs - 1]);
+ ReleaseSysCacheList(owner->catlistrefs[owner->ncatlistrefs - 1]);
}
/* Ditto for plancache references */
while (owner->nplanrefs > 0) {
@@ -410,11 +452,10 @@ static void ResourceOwnerReleaseInternal(
MemoryContextDelete(memContext);
ResourceOwnerForgetGMemContext(t_thrd.utils_cxt.TopTransactionResourceOwner, memContext);
}
- }
- /* Let add-on modules get a chance too */
- for (item = t_thrd.utils_cxt.ResourceRelease_callbacks; item; item = item->next)
- (*item->callback)(phase, isCommit, isTopLevel, item->arg);
+ /* Clean up index scans too */
+ ReleaseResources_hash();
+ }
t_thrd.utils_cxt.CurrentResourceOwner = save;
}
@@ -452,9 +493,17 @@ static void ResourceOwnerFreeOwner(ResourceOwner owner, bool whole)
pfree(owner->fakepartrefs);
if (owner->globalMemContexts)
pfree(owner->globalMemContexts);
+ pfree_ext(owner->localcatclists);
+ pfree_ext(owner->localcatctups);
+ pfree_ext(owner->globalcatctups);
+ pfree_ext(owner->globalcatclists);
+ pfree_ext(owner->globalbaseentries);
+ pfree_ext(owner->globaldbentries);
+ pfree_ext(owner->globalisexclusives);
+ pfree_ext(owner->pThdRWlocks);
}
- if (whole)
- pfree(owner);
+ if (whole && owner->memCxt)
+ MemoryContextDelete(owner->memCxt);
}
/*
@@ -469,20 +518,7 @@ void ResourceOwnerDelete(ResourceOwner owner)
Assert(owner != t_thrd.utils_cxt.CurrentResourceOwner);
/* And it better not own any resources, either */
- Assert(owner->nbuffers == 0);
- Assert(owner->ncatrefs == 0);
- Assert(owner->ncatlistrefs == 0);
- Assert(owner->nrelrefs == 0);
- Assert(owner->npartrefs == 0);
- Assert(owner->nfakerelrefs == 0);
- Assert(owner->nfakepartrefs == 0);
- Assert(owner->nplanrefs == 0);
- Assert(owner->ntupdescs == 0);
- Assert(owner->nsnapshots == 0);
- Assert(owner->nfiles == 0);
- Assert(owner->nDataCacheSlots == 0);
- Assert(owner->nMetaCacheSlots == 0);
- Assert(owner->nPthreadMutex == 0);
+ Assert(CurrentResourceOwnerIsEmpty(owner));
/*
* Delete children. The recursive call will delink the child from me, so
@@ -575,45 +611,6 @@ void ResourceOwnerNewParent(ResourceOwner owner, ResourceOwner newparent)
}
}
-/*
- * Register or deregister callback functions for resource cleanup
- *
- * These functions are intended for use by dynamically loaded modules.
- * For built-in modules we generally just hardwire the appropriate calls.
- *
- * Note that the callback occurs post-commit or post-abort, so the callback
- * functions can only do noncritical cleanup.
- */
-void RegisterResourceReleaseCallback(ResourceReleaseCallback callback, void* arg)
-{
- ResourceReleaseCallbackItem* item = NULL;
-
- item = (ResourceReleaseCallbackItem*)MemoryContextAlloc(
- THREAD_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_STORAGE), sizeof(ResourceReleaseCallbackItem));
- item->callback = callback;
- item->arg = arg;
- item->next = t_thrd.utils_cxt.ResourceRelease_callbacks;
- t_thrd.utils_cxt.ResourceRelease_callbacks = item;
-}
-
-void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback, const void* arg)
-{
- ResourceReleaseCallbackItem* item = NULL;
- ResourceReleaseCallbackItem* prev = NULL;
-
- prev = NULL;
- for (item = t_thrd.utils_cxt.ResourceRelease_callbacks; item; prev = item, item = item->next) {
- if (item->callback == callback && item->arg == arg) {
- if (prev != NULL)
- prev->next = item->next;
- else
- t_thrd.utils_cxt.ResourceRelease_callbacks = item->next;
- pfree(item);
- break;
- }
- }
-}
-
/*
* Make sure there is room for at least one more entry in a ResourceOwner's
* buffer array.
@@ -1159,7 +1156,6 @@ void ResourceOwnerEnlargeFakepartRefs(ResourceOwner owner)
void ResourceOwnerRememberFakepartRef(ResourceOwner owner, Partition fakepart)
{
- ResourceOwnerEnlargeFakepartRefs(owner);
Assert(owner->nfakepartrefs < owner->maxfakepartrefs);
owner->fakepartrefs[owner->nfakepartrefs] = fakepart;
owner->nfakepartrefs++;
@@ -1272,7 +1268,8 @@ void ResourceOwnerForgetPlanCacheRef(ResourceOwner owner, CachedPlan* plan)
return;
}
}
- ereport(ERROR,
+ int elevel = t_thrd.proc_cxt.proc_exit_inprogress ? WARNING : ERROR;
+ ereport(elevel,
(errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
errmsg("plancache reference is not owned by resource owner %s", owner->name)));
}
@@ -1420,15 +1417,13 @@ bool ResourceOwnerForgetSnapshot(ResourceOwner owner, Snapshot snapshot, bool er
}
}
- bool allValid = true;
for (ResourceOwner child = owner->firstchild; child != NULL; child = child->nextchild) {
- allValid = (allValid && child->valid);
if (ResourceOwnerForgetSnapshot(child, snapshot, false)) {
return true;
}
}
- if (ereport && allValid) {
+ if (ereport && u_sess->plsql_cxt.spi_xact_context != NULL) {
ereport(ERROR,
(errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
errmsg("snapshot is not owned by resource owner %s", owner->name)));
@@ -1801,3 +1796,543 @@ bool ResourceOwnerIsValid(ResourceOwner owner)
return owner->valid;
}
+/* Make sure there is room for at least one more entry in a ResourceOwner's
+ * pthread rwlock array.
+ * This is separate from actually inserting an entry because if we run out
+ * of memory, it's critical to do so *before* acquiring the resource.
+ */
+void ResourceOwnerEnlargePthreadRWlock(ResourceOwner owner)
+{
+ int newmax;
+ if (owner->nPthreadRWlock < owner->maxPThdRWlocks)
+ return; /* nothing to do */
+ if (owner->pThdRWlocks == NULL) {
+ newmax = 16;
+ owner->pThdRWlocks = (pthread_rwlock_t**)MemoryContextAlloc(owner->memCxt,
+ newmax * sizeof(pthread_rwlock_t*));
+ owner->maxPThdRWlocks = newmax;
+ } else {
+ newmax = owner->maxPThdRWlocks * 2;
+ owner->pThdRWlocks = (pthread_rwlock_t**)repalloc(owner->pThdRWlocks, newmax * sizeof(pthread_rwlock_t*));
+ owner->maxPThdRWlocks = newmax;
+ }
+}
+
+/* ResourceOwnerRememberPthreadRWlock
+ * Remember that a pthread rwlock is owned by a ResourceOwner
+ */
+void ResourceOwnerRememberPthreadRWlock(ResourceOwner owner, pthread_rwlock_t* pRWlock)
+{
+ Assert(owner->nPthreadRWlock < owner->maxPThdRWlocks);
+ owner->pThdRWlocks[owner->nPthreadRWlock] = pRWlock;
+ owner->nPthreadRWlock++;
+}
+/* ResourceOwnerForgetPthreadRWlock
+ * Forget that a pthread mutex is owned by a ResourceOwner
+ */
+void ResourceOwnerForgetPthreadRWlock(ResourceOwner owner, pthread_rwlock_t* pRWlock)
+{
+ pthread_rwlock_t** rwlocks = owner->pThdRWlocks;
+ int ns1 = owner->nPthreadRWlock - 1;
+ int i;
+ for (i = ns1; i >= 0; i--) {
+ if (rwlocks[i] == pRWlock) {
+ while (i < ns1) {
+ rwlocks[i] = rwlocks[i + 1];
+ i++;
+ }
+ owner->nPthreadRWlock = ns1;
+ return;
+ }
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
+ errmsg("pthread rwlock is not owned by resource owner %s", owner->name)));
+}
+
+void ResourceOwnerEnlargeLocalCatCList(ResourceOwner owner)
+{
+ int newmax;
+ if (owner->nlocalcatclist < owner->maxlocalcatclists)
+ return; /* nothing to do */
+ if (owner->localcatclists == NULL) {
+ newmax = 16;
+ owner->localcatclists = (LocalCatCList**)MemoryContextAlloc(owner->memCxt,
+ newmax * sizeof(LocalCatCList*));
+ owner->maxlocalcatclists = newmax;
+ } else {
+ newmax = owner->maxlocalcatclists * 2;
+ owner->localcatclists = (LocalCatCList**)repalloc(owner->localcatclists, newmax * sizeof(LocalCatCList*));
+ owner->maxlocalcatclists = newmax;
+ }
+}
+
+void ResourceOwnerRememberLocalCatCList(ResourceOwner owner, LocalCatCList* list)
+{
+ Assert(owner->nlocalcatclist < owner->maxlocalcatclists);
+ owner->localcatclists[owner->nlocalcatclist] = list;
+ owner->nlocalcatclist++;
+}
+void ResourceOwnerForgetLocalCatCList(ResourceOwner owner, LocalCatCList* list)
+{
+ LocalCatCList** localcatclist = owner->localcatclists;
+ int nc1 = owner->nlocalcatclist - 1;
+ int i;
+ for (i = nc1; i >= 0; i--) {
+ if (localcatclist[i] == list) {
+ while (i < nc1) {
+ localcatclist[i] = localcatclist[i + 1];
+ i++;
+ }
+ owner->nlocalcatclist = nc1;
+ return;
+ }
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
+ errmsg("localcatcache list is not owned by resource owner %s", owner->name)));
+}
+void ResourceOwnerEnlargeLocalCatCTup(ResourceOwner owner)
+{
+ int newmax;
+ if (owner->nlocalcatctup < owner->maxlocalcatctups)
+ return; /* nothing to do */
+ if (owner->localcatctups == NULL) {
+ newmax = 16;
+ owner->localcatctups = (LocalCatCTup**)MemoryContextAlloc(owner->memCxt,
+ newmax * sizeof(LocalCatCTup*));
+ owner->maxlocalcatctups = newmax;
+ } else {
+ newmax = owner->maxlocalcatctups * 2;
+ owner->localcatctups = (LocalCatCTup**)repalloc(owner->localcatctups, newmax * sizeof(LocalCatCTup*));
+ owner->maxlocalcatctups = newmax;
+ }
+}
+void ResourceOwnerRememberLocalCatCTup(ResourceOwner owner, LocalCatCTup* tup)
+{
+ Assert(owner->nlocalcatctup < owner->maxlocalcatctups);
+ owner->localcatctups[owner->nlocalcatctup] = tup;
+ owner->nlocalcatctup++;
+}
+LocalCatCTup* ResourceOwnerForgetLocalCatCTup(ResourceOwner owner, HeapTuple tup)
+{
+ LocalCatCTup** localcatctup = owner->localcatctups;
+ LocalCatCTup* find = NULL;
+ int nc1 = owner->nlocalcatctup - 1;
+ int i;
+ for (i = nc1; i >= 0; i--) {
+ if (&localcatctup[i]->global_ct->tuple == tup) {
+ find = localcatctup[i];
+ while (i < nc1) {
+ localcatctup[i] = localcatctup[i + 1];
+ i++;
+ }
+ owner->nlocalcatctup = nc1;
+ return find;
+ }
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
+ errmsg("localcatcache tuple is not owned by resource owner %s", owner->name)));
+ return NULL; /* keep compiler quiet */
+}
+
+void ResourceOwnerEnlargeGlobalCatCTup(ResourceOwner owner)
+{
+ int newmax;
+ if (owner->nglobalcatctup < owner->maxglobalcatctups)
+ return; /* nothing to do */
+ if (owner->globalcatctups == NULL) {
+ newmax = 16;
+ owner->globalcatctups = (GlobalCatCTup**)MemoryContextAlloc(owner->memCxt,
+ newmax * sizeof(GlobalCatCTup*));
+ owner->maxglobalcatctups = newmax;
+ } else {
+ newmax = owner->maxglobalcatctups * 2;
+ owner->globalcatctups = (GlobalCatCTup**)repalloc(owner->globalcatctups, newmax * sizeof(GlobalCatCTup*));
+ owner->maxglobalcatctups = newmax;
+ }
+}
+void ResourceOwnerRememberGlobalCatCTup(ResourceOwner owner, GlobalCatCTup* tup)
+{
+ Assert(owner->nglobalcatctup < owner->maxglobalcatctups);
+ owner->globalcatctups[owner->nglobalcatctup] = tup;
+ owner->nglobalcatctup++;
+}
+void ResourceOwnerForgetGlobalCatCTup(ResourceOwner owner, GlobalCatCTup* tup)
+{
+ GlobalCatCTup** global_cts = owner->globalcatctups;
+ int nc1 = owner->nglobalcatctup - 1;
+ int i;
+ for (i = nc1; i >= 0; i--) {
+ if (global_cts[i] == tup) {
+ while (i < nc1) {
+ global_cts[i] = global_cts[i + 1];
+ i++;
+ }
+ owner->nglobalcatctup = nc1;
+ return;
+ }
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
+ errmsg("bad global tuple is not owned by resource owner %s", owner->name)));
+}
+void ResourceOwnerEnlargeGlobalCatCList(ResourceOwner owner)
+{
+ int newmax;
+ if (owner->nglobalcatclist < owner->maxglobalcatclist)
+ return; /* nothing to do */
+ if (owner->globalcatclists == NULL) {
+ newmax = 16;
+ owner->globalcatclists = (GlobalCatCList**)MemoryContextAlloc(owner->memCxt,
+ newmax * sizeof(GlobalCatCList*));
+ owner->maxglobalcatclist = newmax;
+ } else {
+ newmax = owner->maxglobalcatclist * 2;
+ owner->globalcatclists = (GlobalCatCList**)repalloc(owner->globalcatclists, newmax * sizeof(GlobalCatCList*));
+ owner->maxglobalcatclist = newmax;
+ }
+}
+void ResourceOwnerRememberGlobalCatCList(ResourceOwner owner, GlobalCatCList* list)
+{
+ Assert(owner->nglobalcatclist < owner->maxglobalcatclist);
+ owner->globalcatclists[owner->nglobalcatclist] = list;
+ owner->nglobalcatclist++;
+}
+void ResourceOwnerForgetGlobalCatCList(ResourceOwner owner, GlobalCatCList* list)
+{
+ GlobalCatCList** global_lists = owner->globalcatclists;
+ int nc1 = owner->nglobalcatclist - 1;
+ int i;
+ for (i = nc1; i >= 0; i--) {
+ if (global_lists[i] == list) {
+ while (i < nc1) {
+ global_lists[i] = global_lists[i + 1];
+ i++;
+ }
+ owner->nglobalcatclist = nc1;
+ return;
+ }
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
+ errmsg("bad global list is not owned by resource owner %s", owner->name)));
+}
+void ResourceOwnerEnlargeGlobalBaseEntry(ResourceOwner owner)
+{
+ int newmax;
+ if (owner->nglobalbaseentry < owner->maxglobalbaseentry)
+ return; /* nothing to do */
+ if (owner->globalbaseentries == NULL) {
+ newmax = 16;
+ owner->globalbaseentries = (GlobalBaseEntry **)MemoryContextAlloc(owner->memCxt,
+ newmax * sizeof(GlobalBaseEntry *));
+ owner->maxglobalbaseentry = newmax;
+ } else {
+ newmax = owner->maxglobalbaseentry * 2;
+ owner->globalbaseentries =
+ (GlobalBaseEntry **)repalloc(owner->globalbaseentries, newmax * sizeof(GlobalBaseEntry *));
+ owner->maxglobalbaseentry = newmax;
+ }
+}
+void ResourceOwnerRememberGlobalBaseEntry(ResourceOwner owner, GlobalBaseEntry* entry)
+{
+ Assert(owner->nglobalbaseentry < owner->maxglobalbaseentry);
+ owner->globalbaseentries[owner->nglobalbaseentry] = entry;
+ owner->nglobalbaseentry++;
+}
+void ResourceOwnerForgetGlobalBaseEntry(ResourceOwner owner, GlobalBaseEntry* entry)
+{
+ GlobalBaseEntry** global_entries = owner->globalbaseentries;
+ int nc1 = owner->nglobalbaseentry - 1;
+ int i;
+ for (i = nc1; i >= 0; i--) {
+ if (global_entries[i] == entry) {
+ while (i < nc1) {
+ global_entries[i] = global_entries[i + 1];
+ i++;
+ }
+ owner->nglobalbaseentry = nc1;
+ return;
+ }
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
+ errmsg("the global base entry is not owned by resource owner %s", owner->name)));
+}
+
+void ResourceOwnerReleaseRWLock(ResourceOwner owner, bool isCommit)
+{
+ while (owner->nPthreadRWlock > 0) {
+ if (isCommit) {
+ PrintGlobalSysCacheLeakWarning(owner, "RWLock");
+ }
+ /* unlock do -- */
+ PthreadRWlockUnlock(owner, owner->pThdRWlocks[owner->nPthreadRWlock - 1]);
+ }
+}
+
+void ResourceOwnerReleaseLocalCatCTup(ResourceOwner owner, bool isCommit)
+{
+ while (owner->nlocalcatctup > 0) {
+ LocalCatCTup *ct = owner->localcatctups[owner->nlocalcatctup - 1];
+ if (isCommit) {
+ PrintGlobalSysCacheLeakWarning(owner, "LocalCatCTup");
+ }
+ ct->Release();
+ owner->nlocalcatctup--;
+ }
+}
+
+void ResourceOwnerReleaseLocalCatCList(ResourceOwner owner, bool isCommit)
+{
+ while (owner->nlocalcatclist > 0) {
+ LocalCatCList *cl = owner->localcatclists[owner->nlocalcatclist - 1];
+ if (isCommit) {
+ PrintGlobalSysCacheLeakWarning(owner, "LocalCatCList");
+ }
+ cl->Release();
+ owner->nlocalcatclist--;
+ }
+}
+
+void ResourceOwnerReleaseRelationRef(ResourceOwner owner, bool isCommit)
+{
+ while (owner->nrelrefs > 0) {
+ Relation rel = owner->relrefs[owner->nrelrefs - 1];
+ if (isCommit) {
+ PrintGlobalSysCacheLeakWarning(owner, "Relation");
+ if (!EnableLocalSysCache()) {
+ PrintRelCacheLeakWarning(rel);
+ }
+ }
+ /* close do -- */
+ RelationClose(rel);
+ }
+}
+
+void ResourceOwnerReleasePartitionRef(ResourceOwner owner, bool isCommit)
+{
+ while (owner->npartrefs > 0) {
+ Partition part = owner->partrefs[owner->npartrefs - 1];
+ if (isCommit) {
+ PrintGlobalSysCacheLeakWarning(owner, "Partition");
+ PrintPartCacheLeakWarning(part);
+ }
+ /* close do -- */
+ PartitionClose(part);
+ }
+}
+
+void ResourceOwnerReleaseGlobalCatCTup(ResourceOwner owner, bool isCommit)
+{
+ while (owner->nglobalcatctup > 0) {
+ GlobalCatCTup* global_ct = owner->globalcatctups[owner->nglobalcatctup - 1];
+ if (isCommit) {
+ PrintGlobalSysCacheLeakWarning(owner, "GlobalCatCTup");
+ }
+ global_ct->Release();
+ owner->nglobalcatctup--;
+ }
+}
+
+void ResourceOwnerReleaseGlobalCatCList(ResourceOwner owner, bool isCommit)
+{
+ while (owner->nglobalcatclist > 0) {
+ GlobalCatCList* global_cl = owner->globalcatclists[owner->nglobalcatclist - 1];
+ if (isCommit) {
+ PrintGlobalSysCacheLeakWarning(owner, "GlobalCatCList");
+ }
+ global_cl->Release();
+ owner->nglobalcatclist--;
+}
+}
+
+void ResourceOwnerReleaseGlobalBaseEntry(ResourceOwner owner, bool isCommit)
+{
+ while (owner->nglobalbaseentry > 0) {
+ GlobalBaseEntry *entry = owner->globalbaseentries[owner->nglobalbaseentry - 1];
+ if (isCommit) {
+ PrintGlobalSysCacheLeakWarning(owner, "GlobalBaseEntry");
+ }
+ if (unlikely(entry->refcount == 0)) {
+ /* palloc fail */
+ entry->FreeError();
+ } else {
+ entry->Release();
+ }
+ owner->nglobalbaseentry--;
+ }
+}
+
+void ResourceOwnerEnlargeGlobalDBEntry(ResourceOwner owner)
+{
+ int newmax;
+ if (owner->nglobaldbentry < owner->maxglobaldbentry)
+ return; /* nothing to do */
+ if (owner->globaldbentries == NULL) {
+ newmax = 16;
+ owner->globaldbentries = (GlobalSysDBCacheEntry **)MemoryContextAlloc(owner->memCxt,
+ newmax * sizeof(GlobalSysDBCacheEntry *));
+ owner->maxglobaldbentry = newmax;
+ } else {
+ newmax = owner->maxglobaldbentry * 2;
+ owner->globaldbentries =
+ (GlobalSysDBCacheEntry **)repalloc(owner->globaldbentries, newmax * sizeof(GlobalSysDBCacheEntry *));
+ owner->maxglobaldbentry = newmax;
+ }
+}
+
+extern void ResourceOwnerRememberGlobalDBEntry(ResourceOwner owner, GlobalSysDBCacheEntry* entry)
+{
+ Assert(owner->nglobaldbentry < owner->maxglobaldbentry);
+ owner->globaldbentries[owner->nglobaldbentry] = entry;
+ owner->nglobaldbentry++;
+}
+
+extern void ResourceOwnerForgetGlobalDBEntry(ResourceOwner owner, GlobalSysDBCacheEntry* entry)
+{
+ Assert(entry->m_dbOid!= InvalidOid);
+ GlobalSysDBCacheEntry** global_entries = owner->globaldbentries;
+ int nc1 = owner->nglobaldbentry - 1;
+ int i;
+ for (i = nc1; i >= 0; i--) {
+ if (global_entries[i] == entry) {
+ while (i < nc1) {
+ global_entries[i] = global_entries[i + 1];
+ i++;
+ }
+ owner->nglobaldbentry = nc1;
+ return;
+ }
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
+ errmsg("the global rel entry is not owned by resource owner %s", owner->name)));
+}
+
+extern void ResourceOwnerReleaseGlobalDBEntry(ResourceOwner owner, bool isCommit)
+{
+ Assert(owner->nglobaldbentry <= 1);
+ while (owner->nglobaldbentry > 0) {
+ GlobalSysDBCacheEntry *entry = owner->globaldbentries[owner->nglobaldbentry - 1];
+ if (isCommit) {
+ /* print some debug info */
+ PrintGlobalSysCacheLeakWarning(owner, "GlobalDBEntry");
+ }
+ if (unlikely(entry->m_refcount == 0)) {
+ // palloc failed entry
+ entry->Free(entry);
+ } else {
+ entry->Release();
+ }
+ owner->nglobaldbentry--;
+ }
+}
+
+void ResourceOwnerEnlargeGlobalIsExclusive(ResourceOwner owner)
+{
+ int newmax;
+ if (owner->nglobalisexclusive < owner->maxglobalisexclusive)
+ return; /* nothing to do */
+ if (owner->globalisexclusives == NULL) {
+ newmax = 16;
+ owner->globalisexclusives = (volatile uint32 **)MemoryContextAlloc(owner->memCxt, newmax * sizeof(uint32 *));
+ owner->maxglobalisexclusive = newmax;
+ } else {
+ newmax = owner->maxglobalisexclusive * 2;
+ owner->globalisexclusives =
+ (volatile uint32 **)repalloc(owner->globalisexclusives, newmax * sizeof(uint32 *));
+ owner->maxglobalisexclusive = newmax;
+ }
+}
+
+extern void ResourceOwnerRememberGlobalIsExclusive(ResourceOwner owner, volatile uint32 *isexclusive)
+{
+ Assert(owner->nglobalisexclusive < owner->maxglobalisexclusive);
+ Assert(*isexclusive == 1);
+ owner->globalisexclusives[owner->nglobalisexclusive] = isexclusive;
+ owner->nglobalisexclusive++;
+}
+
+extern void ResourceOwnerForgetGlobalIsExclusive(ResourceOwner owner, volatile uint32 *isexclusive)
+{
+ volatile uint32 **global_isexclusives = owner->globalisexclusives;
+ int nc1 = owner->nglobalisexclusive - 1;
+ int i;
+ for (i = nc1; i >= 0; i--) {
+ if (global_isexclusives[i] == isexclusive) {
+ while (i < nc1) {
+ global_isexclusives[i] = global_isexclusives[i + 1];
+ i++;
+ }
+ owner->nglobalisexclusive = nc1;
+ return;
+ }
+ }
+ ereport(ERROR,
+ (errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
+ errmsg("the global isexclusive is not owned by resource owner %s", owner->name)));
+}
+
+extern void ResourceOwnerReleaseGlobalIsExclusive(ResourceOwner owner, bool isCommit)
+{
+ Assert(owner->nglobalisexclusive <= 1);
+ while (owner->nglobalisexclusive > 0) {
+ volatile uint32 *isexclusive = owner->globalisexclusives[owner->nglobalisexclusive - 1];
+ if (isCommit) {
+ /* print some debug info */
+ PrintGlobalSysCacheLeakWarning(owner, "Global IsExclusive");
+ }
+ Assert(*isexclusive == 1);
+ atomic_compare_exchange_u32(isexclusive, 1, 0);
+ owner->nglobalisexclusive--;
+ }
+}
+
+bool CurrentResourceOwnerIsEmpty(ResourceOwner owner)
+{
+ if (owner == NULL || !owner->valid) {
+ return true;
+ }
+ Assert(owner->nbuffers == 0);
+ Assert(owner->nlocalcatclist == 0);
+ Assert(owner->nlocalcatctup == 0);
+ Assert(owner->nglobalcatctup == 0);
+ Assert(owner->nglobalcatclist == 0);
+ Assert(owner->nglobalbaseentry == 0);
+ Assert(owner->nglobaldbentry == 0);
+ Assert(owner->nglobalisexclusive == 0);
+ Assert(owner->ncatrefs == 0);
+ Assert(owner->ncatlistrefs == 0);
+ Assert(owner->nrelrefs == 0);
+ Assert(owner->npartrefs == 0);
+ Assert(owner->nfakerelrefs == 0);
+ Assert(owner->nfakepartrefs == 0);
+ Assert(owner->nplanrefs == 0);
+ Assert(owner->ntupdescs == 0);
+ Assert(owner->nsnapshots == 0);
+ Assert(owner->nfiles == 0);
+ Assert(owner->nDataCacheSlots == 0);
+ Assert(owner->nMetaCacheSlots == 0);
+ Assert(owner->nPthreadMutex == 0);
+ Assert(owner->nPthreadRWlock == 0);
+ Assert(owner->npartmaprefs == 0);
+ Assert(owner->nglobalMemContext == 0);
+ return true;
+}
+/*
+ * ResourceOwnerReleaseAllPlanCacheRefs
+ * Release the plancache references (only) held by this owner.
+ *
+ * We might eventually add similar functions for other resource types,
+ * but for now, only this is needed.
+ */
+void ResourceOwnerReleaseAllPlanCacheRefs(ResourceOwner owner)
+{
+ ResourceOwner save = t_thrd.utils_cxt.CurrentResourceOwner;
+ t_thrd.utils_cxt.CurrentResourceOwner = owner;
+ ResourceOwnerDecrementNPlanRefs(owner, true);
+ t_thrd.utils_cxt.CurrentResourceOwner = save;
+}
diff --git a/src/common/backend/utils/sort/tuplesort.cpp b/src/common/backend/utils/sort/tuplesort.cpp
index 860cc1e9b..cbe46b212 100644
--- a/src/common/backend/utils/sort/tuplesort.cpp
+++ b/src/common/backend/utils/sort/tuplesort.cpp
@@ -110,7 +110,6 @@
#include
#include "access/nbtree.h"
-#include "access/hash.h"
#include "access/tableam.h"
#include "access/ustore/knl_utuple.h"
#include "access/tableam.h"
@@ -416,7 +415,6 @@ struct Tuplesortstate {
* These variables are specific to the IndexTuple case; they are set by
* tuplesort_begin_index_xxx and used only by the IndexTuple routines.
*/
- Relation heapRel; /* table the index is being built on */
Relation indexRel; /* index being built */
/* These are specific to the index_btree subcase: */
@@ -424,9 +422,7 @@ struct Tuplesortstate {
bool enforceUnique; /* complain if we find duplicate tuples */
/* These are specific to the index_hash subcase: */
- uint32 high_mask; /* masks for sortable part of hash code */
- uint32 low_mask;
- uint32 max_buckets;
+ uint32 hash_mask; /* mask for sortable part of hash code */
/*
* These variables are specific to the Datum case; they are set by
@@ -974,8 +970,7 @@ Tuplesortstate* tuplesort_begin_index_btree(
}
Tuplesortstate* tuplesort_begin_index_hash(
- Relation heapRel, Relation indexRel, uint32 high_mask, uint32 low_mask,
- uint32 max_buckets, int workMem, bool randomAccess, int maxMem)
+ Relation indexRel, uint32 hash_mask, int workMem, bool randomAccess, int maxMem)
{
Tuplesortstate* state = tuplesort_begin_common(workMem, randomAccess);
MemoryContext oldcontext;
@@ -985,12 +980,11 @@ Tuplesortstate* tuplesort_begin_index_hash(
#ifdef TRACE_SORT
if (u_sess->attr.attr_common.trace_sort) {
elog(LOG,
- "begin index sort: high_mask = 0x%x, low_mask = 0x%x, "
- "max_buckets = 0x%x, workMem = %d, randomAccess = %c",
- high_mask,
- low_mask,
- max_buckets,
- workMem, randomAccess ? 't' : 'f');
+ "begin index sort: hash_mask = 0x%x, workMem = %d, randomAccess = %c, maxMem = %d",
+ hash_mask,
+ workMem,
+ randomAccess ? 't' : 'f',
+ maxMem);
}
#endif
@@ -1005,12 +999,9 @@ Tuplesortstate* tuplesort_begin_index_hash(
#endif
state->reversedirection = reversedirection_index_hash;
- state->heapRel = heapRel;
state->indexRel = indexRel;
- state->high_mask = high_mask;
- state->low_mask = low_mask;
- state->max_buckets = max_buckets;
+ state->hash_mask = hash_mask;
state->maxMem = maxMem * 1024L;
(void)MemoryContextSwitchTo(oldcontext);
@@ -1445,21 +1436,12 @@ void TuplesortPutheaptuple(Tuplesortstate* state, HeapTuple tup)
* it from caller-supplied values.
*/
void tuplesort_putindextuplevalues(
- Tuplesortstate* state, Relation rel, ItemPointer self, Datum* values, const bool* isnull, IndexTransInfo* transInfo)
+ Tuplesortstate* state, Relation rel, ItemPointer self, Datum* values, const bool* isnull)
{
MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
SortTuple stup;
stup.tupindex = 0;
stup.tuple = index_form_tuple(RelationGetDescr(rel), values, isnull);
- if (transInfo != NULL) {
- /* create a larger IndexTuple with corresponding xmin/xmax */
- IndexTuple itup = CopyIndexTupleAndReserveSpace((IndexTuple)stup.tuple, sizeof(TransactionId) * 2);
- IndexTransInfo *tupleInfo = (IndexTransInfo*)(((char*)itup) + IndexTupleSize((IndexTuple)stup.tuple));
- *tupleInfo = *transInfo;
- /* replace the original IndexTuple */
- pfree(stup.tuple);
- stup.tuple = itup;
- }
((IndexTuple)stup.tuple)->t_tid = *self;
USEMEM(state, GetMemoryChunkSpace(stup.tuple));
@@ -3828,8 +3810,8 @@ static int comparetup_index_btree(const SortTuple* a, const SortTuple* b, Tuples
static int comparetup_index_hash(const SortTuple* a, const SortTuple* b, Tuplesortstate* state)
{
- Bucket bucket1;
- Bucket bucket2;
+ uint32 hash1;
+ uint32 hash2;
IndexTuple tuple1;
IndexTuple tuple2;
@@ -3838,17 +3820,13 @@ static int comparetup_index_hash(const SortTuple* a, const SortTuple* b, Tupleso
* that the first column of the index tuple is the hash key.
*/
Assert(!a->isnull1);
- bucket1 = _hash_hashkey2bucket(DatumGetUInt32(a->datum1),
- state->max_buckets, state->high_mask,
- state->low_mask);
+ hash1 = DatumGetUInt32(a->datum1) & state->hash_mask;
Assert(!b->isnull1);
- bucket2 = _hash_hashkey2bucket(DatumGetUInt32(b->datum1),
- state->max_buckets, state->high_mask,
- state->low_mask);
+ hash2 = DatumGetUInt32(b->datum1) & state->hash_mask;
- if (bucket1 > bucket2) {
+ if (hash1 > hash2) {
return 1;
- } else if (bucket1 < bucket2) {
+ } else if (hash1 < hash2) {
return -1;
}
diff --git a/src/common/backend/utils/time/combocid.cpp b/src/common/backend/utils/time/combocid.cpp
index 998d28f51..0a9535a31 100644
--- a/src/common/backend/utils/time/combocid.cpp
+++ b/src/common/backend/utils/time/combocid.cpp
@@ -89,7 +89,6 @@ CommandId HeapTupleHeaderGetCmin(HeapTupleHeader tup, Page page)
{
CommandId cid = HeapTupleHeaderGetRawCommandId(tup);
- Assert(!(tup->t_infomask & HEAP_MOVED));
Assert(TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXmin(page, tup)));
if (tup->t_infomask & HEAP_COMBOCID)
@@ -115,7 +114,6 @@ CommandId HeapTupleGetCmax(HeapTuple tup)
HeapTupleHeader htup = tup->t_data;
CommandId cid = HeapTupleHeaderGetRawCommandId(htup);
- Assert(!(htup->t_infomask & HEAP_MOVED));
Assert(TransactionIdIsCurrentTransactionId(HeapTupleGetUpdateXid(tup)));
if (htup->t_infomask & HEAP_COMBOCID)
@@ -128,7 +126,6 @@ CommandId HeapTupleHeaderGetCmax(HeapTupleHeader tup, Page page)
{
CommandId cid = HeapTupleHeaderGetRawCommandId(tup);
- Assert(!(tup->t_infomask & HEAP_MOVED));
Assert(TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetUpdateXid(page, tup)));
if (tup->t_infomask & HEAP_COMBOCID)
@@ -142,7 +139,6 @@ bool CheckStreamCombocid(HeapTupleHeader tup, CommandId current_cid, Page page)
{
CommandId cid = HeapTupleHeaderGetRawCommandId(tup);
- Assert(!(tup->t_infomask & HEAP_MOVED));
Assert(TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXmin(page, tup)));
/*
diff --git a/src/common/backend/utils/time/snapmgr.cpp b/src/common/backend/utils/time/snapmgr.cpp
index 77ae806a5..754bc54f3 100644
--- a/src/common/backend/utils/time/snapmgr.cpp
+++ b/src/common/backend/utils/time/snapmgr.cpp
@@ -64,7 +64,6 @@
#endif
SnapshotData CatalogSnapshotData = {SNAPSHOT_MVCC};
-extern THR_LOCAL bool need_reset_xmin;
/*
* Elements of the active snapshot stack.
*
@@ -201,18 +200,6 @@ bool XidVisibleInSnapshot(TransactionId xid, Snapshot snapshot, TransactionIdSta
snapshot->xmax)));
#endif
- /*
- * Any xid >= xmax is in-progress (or aborted, but we don't distinguish
- * that here).
- *
- * We can't do anything useful with xmin, because the xmin only tells us
- * whether we see it as completed. We have to check the transaction log to
- * see if the transaction committed or aborted, in any case.
- */
- if (GTM_MODE && TransactionIdFollowsOrEquals(xid, snapshot->xmax)) {
- return false;
- }
-
loop:
csn = TransactionIdGetCommitSeqNo(xid, false, true, false, snapshot);
@@ -283,6 +270,51 @@ loop:
}
}
+bool UHeapXidVisibleInSnapshot(TransactionId xid, Snapshot snapshot,
+ TransactionIdStatus *hintstatus, Buffer buffer, bool *sync)
+{
+ if (!GTM_LITE_MODE || snapshot->gtm_snapshot_type == GTM_SNAPSHOT_TYPE_LOCAL) {
+ /*
+ * Make a quick range check to eliminate most XIDs without looking at the
+ * CSN log.
+ */
+ if (TransactionIdPrecedes(xid, snapshot->xmin)) {
+ return true;
+ }
+
+ /*
+ * Any xid >= xmax is in-progress (or aborted, but we don't distinguish
+ * that here.
+ */
+ if (GTM_MODE && TransactionIdFollowsOrEquals(xid, snapshot->xmax)) {
+ return false;
+ }
+ }
+
+ return XidVisibleInSnapshot(xid, snapshot, hintstatus, buffer, sync);
+}
+
+bool XidVisibleInDecodeSnapshot(TransactionId xid, Snapshot snapshot, TransactionIdStatus* hintstatus, Buffer buffer)
+{
+ volatile CommitSeqNo csn;
+ *hintstatus = XID_INPROGRESS;
+
+ csn = TransactionIdGetCommitSeqNo(xid, false, true, false, snapshot);
+ if (COMMITSEQNO_IS_COMMITTED(csn)) {
+ *hintstatus = XID_COMMITTED;
+ if (csn < snapshot->snapshotcsn) {
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ if (csn == COMMITSEQNO_ABORTED) {
+ *hintstatus = XID_ABORTED;
+ }
+ }
+ return false;
+}
+
/*
* CommittedXidVisibleInSnapshot
* Is the given XID visible according to the snapshot?
@@ -304,14 +336,6 @@ bool CommittedXidVisibleInSnapshot(TransactionId xid, Snapshot snapshot, Buffer
*/
if (TransactionIdPrecedes(xid, snapshot->xmin))
return true;
-
- /*
- * Any xid >= xmax is in-progress (or aborted, but we don't distinguish
- * that here.
- */
- if (GTM_MODE && TransactionIdFollowsOrEquals(xid, snapshot->xmax)) {
- return false;
- }
}
loop:
@@ -377,6 +401,32 @@ loop:
return false;
}
+bool CommittedXidVisibleInDecodeSnapshot(TransactionId xid, Snapshot snapshot, Buffer buffer)
+{
+ CommitSeqNo csn;
+
+ csn = TransactionIdGetCommitSeqNo(xid, true, true, false, snapshot);
+ if (COMMITSEQNO_IS_COMMITTING(csn)) {
+ return false;
+ } else if (!COMMITSEQNO_IS_COMMITTED(csn)) {
+ ereport(WARNING,
+ (errmsg("transaction/csn %lu/%lu was hinted as "
+ "committed, but was not marked as committed in "
+ "the transaction log",
+ xid, csn)));
+ /*
+ * We have contradicting evidence on whether the transaction committed or
+ * not. Let's assume that it did. That seems better than erroring out.
+ */
+ return true;
+ }
+
+ if (csn < snapshot->snapshotcsn) {
+ return true;
+ } else {
+ return false;
+ }
+}
/*
* GetTransactionSnapshot
@@ -966,7 +1016,7 @@ static void SnapshotResetXmin(void)
if (u_sess->utils_cxt.RegisteredSnapshots == 0 && u_sess->utils_cxt.ActiveSnapshot == NULL) {
t_thrd.pgxact->xmin = InvalidTransactionId;
t_thrd.pgxact->csn_min = InvalidCommitSeqNo;
- need_reset_xmin = true;
+ t_thrd.pgxact->csn_dr = InvalidCommitSeqNo;
}
}
diff --git a/src/common/interfaces/ecpg/preproc/parse.pl b/src/common/interfaces/ecpg/preproc/parse.pl
index eadaa6494..14877b3e6 100644
--- a/src/common/interfaces/ecpg/preproc/parse.pl
+++ b/src/common/interfaces/ecpg/preproc/parse.pl
@@ -48,10 +48,13 @@ my %replace_string = (
'INCLUDING_ALL' => 'including all',
'RENAME_PARTITION' => 'rename partition',
'PARTITION_FOR' => 'partition for',
+ 'SUBPARTITION_FOR' => 'subpartition for',
'ADD_PARTITION' => 'add partition',
'DROP_PARTITION' => 'drop partition',
'REBUILD_PARTITION' => 'rebuild partition',
'MODIFY_PARTITION' => 'modify partition',
+ 'ADD_SUBPARTITION' => 'add subpartition',
+ 'DROP_SUBPARTITION' => 'drop subpartition',
'TYPECAST' => '::',
'DOT_DOT' => '..',
'COLON_EQUALS' => ':=',);
diff --git a/src/common/interfaces/libpq/CMakeLists.txt b/src/common/interfaces/libpq/CMakeLists.txt
index d30140599..1528af3b3 100755
--- a/src/common/interfaces/libpq/CMakeLists.txt
+++ b/src/common/interfaces/libpq/CMakeLists.txt
@@ -1,9 +1,10 @@
#This is the main CMAKE for build all components.
+if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
set(CMAKE_MODULE_PATH
${${CMAKE_CURRENT_SOURCE_DIR}}/jdbc
)
add_subdirectory(jdbc)
-
+endif()
#execute_process(
# COMMAND flex -CF -b -p -o scan.cpp scan.l
# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/frontend_parser
@@ -97,8 +98,10 @@ set(TGT_pq_INC
${LIBEDIT_INCLUDE_PATH}
${ZLIB_INCLUDE_PATH}
${PROJECT_SRC_DIR}/include/libpq
+if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
${JAVA_HOME}/include
${JAVA_HOME}/include/linux
+endif()
)
set(pq_DEF_OPTIONS ${MACRO_OPTIONS} -DFRONTEND -DFRONTEND_PARSER -DUNSAFE_STAT_OK -DSO_MAJOR_VERSION=5)
@@ -108,7 +111,11 @@ add_static_libtarget(pq TGT_pq_SRC TGT_pq_INC "${pq_DEF_OPTIONS}" "${pq_COMPILE_
# so pq
set(pq_LINK_OPTIONS ${LIB_LINK_OPTIONS})
add_shared_libtarget(pq TGT_pq_SRC TGT_pq_INC "${pq_DEF_OPTIONS}" "${pq_COMPILE_OPTIONS}" "${pq_LINK_OPTIONS}")
-target_link_libraries(pq PRIVATE com_err_gauss crypto gssapi_krb5_gauss gssrpc_gauss k5crypto_gauss krb5_gauss krb5support_gauss securec ssl)
+if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
+ target_link_libraries(pq PRIVATE com_err_gauss crypto gssapi_krb5_gauss gssrpc_gauss k5crypto_gauss krb5_gauss krb5support_gauss securec ssl)
+else()
+ target_link_libraries(pq PRIVATE crypto securec ssl)
+endif()
target_link_directories(pq PUBLIC
${LIBOPENSSL_LIB_PATH} ${KERBEROS_LIB_PATH} ${SECURE_LIB_PATH}
${PROJECT_SRC_DIR}/common/port ${PROJECT_SRC_DIR}/gstrace/common
@@ -122,6 +129,7 @@ install(TARGETS pq LIBRARY DESTINATION lib)
install(TARGETS pq_static ARCHIVE DESTINATION lib)
# libpq_ce.so
+if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
execute_process(COMMAND rm -rf ${CMAKE_CURRENT_SOURCE_DIR}/libpq_ce)
execute_process(COMMAND mkdir -p ${CMAKE_CURRENT_SOURCE_DIR}/libpq_ce)
execute_process(
@@ -193,7 +201,12 @@ add_static_objtarget(libpq_ce TGT_libpq_ce_SRC TGT_pq_ce_INC "${libpq_ce_DEF_OPT
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/client_logic_hooks/cmk_entity_manager_hooks TGT_cmk_entity_manager_hooks_SRC)
if(NOT "${ENABLE_UT}" STREQUAL "ON")
if(NOT "${ENABLE_MULTIPLE_NODES}_${ENABLE_PRIVATEGAUSS}" STREQUAL "OFF_OFF")
- list(REMOVE_ITEM TGT_cmk_entity_manager_hooks_SRC ${CMAKE_CURRENT_SOURCE_DIR}/client_logic_hooks/cmk_entity_manager_hooks/register_local_kms.cpp)
+ if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
+ list(REMOVE_ITEM TGT_cmk_entity_manager_hooks_SRC ${CMAKE_CURRENT_SOURCE_DIR}/client_logic_hooks/cmk_entity_manager_hooks/register_local_kms.cpp)
+ else()
+ list(REMOVE_ITEM TGT_cmk_entity_manager_hooks_SRC ${CMAKE_CURRENT_SOURCE_DIR}/client_logic_hooks/cmk_entity_manager_hooks/register_huawei_kms.cpp)
+ list(REMOVE_ITEM TGT_cmk_entity_manager_hooks_SRC ${CMAKE_CURRENT_SOURCE_DIR}/client_logic_hooks/cmk_entity_manager_hooks/register_gs_ktool.cpp)
+ endif()
else()
list(REMOVE_ITEM TGT_cmk_entity_manager_hooks_SRC ${CMAKE_CURRENT_SOURCE_DIR}/client_logic_hooks/cmk_entity_manager_hooks/register_huawei_kms.cpp)
list(REMOVE_ITEM TGT_cmk_entity_manager_hooks_SRC ${CMAKE_CURRENT_SOURCE_DIR}/client_logic_hooks/cmk_entity_manager_hooks/register_gs_ktool.cpp)
@@ -267,9 +280,15 @@ set(pq_ce_LINK_OPTIONS ${LIB_LINK_OPTIONS})
add_shared_libtarget(pq_ce TGT_pq_ce_SRC TGT_pq_ce_INC "${pq_ce_DEF_OPTIONS}" "${pq_ce_COMPILE_OPTIONS}" "${pq_ce_LINK_OPTIONS}")
set(pq_ce_LINK_LIBS libpq_ce cmk_entity_manager_hooks encryption_hooks client_logic_common client_logic_expressions client_logic_cache client_logic_processor client_logic_fmt client_logic_hooks client_logic_data_fetcher frontend_parser)
if(NOT "${ENABLE_MULTIPLE_NODES}_${ENABLE_PRIVATEGAUSS}" STREQUAL "OFF_OFF")
- set(pq_ce_LINK_LIBS ${pq_ce_LINK_LIBS} -lgs_ktool -lkmc)
+ if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
+ set(pq_ce_LINK_LIBS ${pq_ce_LINK_LIBS} -lgs_ktool -lkmc)
+ endif()
+endif()
+if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
+ target_link_libraries(pq_ce PRIVATE ${pq_ce_LINK_LIBS} -lcurl -lcjson -lssl -lcrypto -l${SECURE_C_CHECK} -lpthread -lgssapi_krb5_gauss -lgssrpc_gauss -lkrb5_gauss -lkrb5support_gauss -lk5crypto_gauss -lcom_err_gauss)
+else()
+ target_link_libraries(pq_ce PRIVATE ${pq_ce_LINK_LIBS} -lcurl -lcjson -lssl -lcrypto -l${SECURE_C_CHECK} -lpthread)
endif()
-target_link_libraries(pq_ce PRIVATE ${pq_ce_LINK_LIBS} -lcurl -lcjson -lssl -lcrypto -lsecurec -lpthread -lgssapi_krb5_gauss -lgssrpc_gauss -lkrb5_gauss -lkrb5support_gauss -lk5crypto_gauss -lcom_err_gauss)
add_dependencies(pq_ce libpq_ce cmk_entity_manager_hooks encryption_hooks client_logic_common client_logic_expressions client_logic_cache client_logic_processor client_logic_fmt client_logic_hooks client_logic_data_fetcher frontend_parser)
target_link_directories(pq_ce PUBLIC
${SECURE_LIB_PATH}
@@ -281,7 +300,9 @@ target_link_directories(pq_ce PUBLIC
${CMAKE_BINARY_DIR}/lib
)
if(NOT "${ENABLE_MULTIPLE_NODES}_${ENABLE_PRIVATEGAUSS}" STREQUAL "OFF_OFF")
- add_dependencies(pq_ce gs_ktool)
+ if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
+ add_dependencies(pq_ce gs_ktool)
+ endif()
endif()
SET_TARGET_PROPERTIES(pq_ce PROPERTIES VERSION 5.5)
add_custom_command(TARGET pq_ce POST_BUILD
@@ -289,6 +310,21 @@ add_custom_command(TARGET pq_ce POST_BUILD
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lib
)
install(TARGETS pq_ce LIBRARY DESTINATION lib)
+else()
+SET(TGT_pq_ce_INC
+ ${PROJECT_SRC_DIR}/include/libpq
+ ${LIBOPENSSL_INCLUDE_PATH}
+ ${ZLIB_INCLUDE_PATH}
+ ${LIBCURL_INCLUDE_PATH}
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+set(pq_ce_COMPILE_OPTIONS ${OPTIMIZE_OPTIONS} ${OS_OPTIONS} ${PROTECT_OPTIONS} ${WARNING_OPTIONS} ${LIB_SECURE_OPTIONS} ${CHECK_OPTIONS} -fstack-protector-all)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/client_logic_common TGT_client_logic_common_SRC)
+set(TGT_client_logic_common_cstrings_map_SRC ${CMAKE_CURRENT_SOURCE_DIR}/client_logic_common/cstrings_map.cpp)
+set(client_logic_common_DEF_OPTIONS ${MACRO_OPTIONS} -DFRONTEND -DFRONTEND_PARSER -DHAVE_CE)
+add_static_objtarget(libpq_cstrings_map TGT_client_logic_common_cstrings_map_SRC TGT_pq_ce_INC "${client_logic_common_DEF_OPTIONS}" "${pq_ce_COMPILE_OPTIONS}" "")
+endif() #end of not build pq_ce
# gauss pq ogject
list(APPEND TGT_libpq_SRC
@@ -324,6 +360,8 @@ endif()
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/pg_service.conf.sample
DESTINATION share/postgresql/
)
-install_symlink(libpq_ce.so.5.5 libpq_ce.so.5 ${prefix_home}/lib)
+if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
+ install_symlink(libpq_ce.so.5.5 libpq_ce.so.5 ${prefix_home}/lib)
+endif()
install_symlink(libpq.so.5.5 libpq.so.5 ${prefix_home}/lib)
diff --git a/src/common/interfaces/libpq/Makefile b/src/common/interfaces/libpq/Makefile
index 625caebbf..58ce13ee7 100644
--- a/src/common/interfaces/libpq/Makefile
+++ b/src/common/interfaces/libpq/Makefile
@@ -26,12 +26,16 @@ override CPPFLAGS += -DPGXC -I$(srcdir) -I$(top_builddir)/src/ -I$(top_builddir)
override CPPFLAGS += -I$(top_builddir)/$(subdir)/client_logic_hooks
override CPPFLAGS += -I$(top_builddir)/$(subdir)/client_logic_hooks/cmk_entity_manager_hooks
override CPPFLAGS += -I$(top_builddir)/$(subdir)/client_logic_hooks/encryption_hooks
+ifeq ($(enable_lite_mode), no)
override CPPFLAGS += -I$(CJSON_INCLUDE_PATH) -I$(LIBCURL_INCLUDE_PATH) -L$(CJSON_LIB_PATH) -L$(LIBCURL_LIB_PATH) -lcjson -lcurl
+endif
ifeq "$(ENABLE_CE)" "1"
override CPPFLAGS += -DHAVE_CE -DWORDS_BIGENDIAN
ifneq ($(enable_multiple_nodes)_$(enable_privategauss), no_no)
-override CPPFLAGS += -L$(top_builddir)/../distribute/bin/gs_ktool/ -lgs_ktool -L$(LIBKMC_LIB_PATH) -lkmc
+ ifneq ($(enable_lite_mode), yes)
+ override CPPFLAGS += -L$(top_builddir)/../distribute/bin/gs_ktool/ -lgs_ktool -L$(LIBKMC_LIB_PATH) -lkmc
+ endif
endif
endif
@@ -98,9 +102,12 @@ endif
# shared library link. (The order in which you list them here doesn't
# matter.)
ifneq ($(PORTNAME), win32)
-SHLIB_LINK += $(filter -lcrypt -ldes -lcom_err -lcrypto -lssl -lk5crypto -lkrb5 -lgssapi_krb5 -lgss -lgssapi -lsocket -lnsl -lresolv -lintl -lsecurec, $(LIBS)) $(LDAP_LIBS_FE) $(PTHREAD_LIBS) -lgssapi_krb5_gauss -lgssrpc_gauss -lkrb5_gauss -lkrb5support_gauss -lk5crypto_gauss -lcom_err_gauss
+SHLIB_LINK += $(filter -lcrypt -ldes -lcom_err -lcrypto -lssl -lk5crypto -lkrb5 -lgssapi_krb5 -lgss -lgssapi -lsocket -lnsl -lresolv -lintl -l$(SECURE_C_CHECK), $(LIBS)) $(LDAP_LIBS_FE) $(PTHREAD_LIBS)
else
-SHLIB_LINK += $(filter -lcrypt -ldes -lcom_err -lcrypto -lssl -lk5crypto -lkrb5 -lgssapi32 -lsocket -lnsl -lresolv -lintl -lsecurec $(PTHREAD_LIBS), $(LIBS)) $(LDAP_LIBS_FE) -lgssapi_krb5_gauss -lgssrpc_gauss -lkrb5_gauss -lkrb5support_gauss -lk5crypto_gauss -lcom_err_gauss
+SHLIB_LINK += $(filter -lcrypt -ldes -lcom_err -lcrypto -lssl -lk5crypto -lkrb5 -lgssapi32 -lsocket -lnsl -lresolv -lintl -l$(SECURE_C_CHECK) $(PTHREAD_LIBS), $(LIBS)) $(LDAP_LIBS_FE)
+endif
+ifeq ($(enable_lite_mode), no)
+ SHLIB_LINK += -lgssapi_krb5_gauss -lgssrpc_gauss -lkrb5_gauss -lkrb5support_gauss -lk5crypto_gauss -lcom_err_gauss
endif
ifeq ($(PORTNAME), win32)
SHLIB_LINK += -lshfolder -lwsock32 -lws2_32 -lsecur32 $(filter -leay32 -lssleay32 -lcomerr32 -lkrb5_32, $(LIBS))
@@ -123,7 +130,12 @@ endif
ifneq ($(enable_ut), yes)
ifneq ($(enable_multiple_nodes)_$(enable_privategauss), no_no)
-OBJS := $(filter-out client_logic_hooks/cmk_entity_manager_hooks/register_local_kms.o, $(OBJS))
+ifneq ($(enable_lite_mode), yes)
+ OBJS := $(filter-out client_logic_hooks/cmk_entity_manager_hooks/register_local_kms.o, $(OBJS))
+else
+ OBJS := $(filter-out client_logic_hooks/cmk_entity_manager_hooks/register_huawei_kms.o, $(OBJS))
+ OBJS := $(filter-out client_logic_hooks/cmk_entity_manager_hooks/register_gs_ktool.o, $(OBJS))
+endif
else
OBJS := $(filter-out client_logic_hooks/cmk_entity_manager_hooks/register_huawei_kms.o, $(OBJS))
OBJS := $(filter-out client_logic_hooks/cmk_entity_manager_hooks/register_gs_ktool.o, $(OBJS))
@@ -146,9 +158,11 @@ OBJS:=$(CE_OBJS)
NAME:=pq_ce
gs_ktool:
+ifneq ($(enable_lite_mode), yes)
ifneq ($(enable_multiple_nodes)_$(enable_privategauss), no_no)
$(MAKE) -C $(top_builddir)/../distribute/bin/gs_ktool
endif
+endif
libpq_ce/fe-protocol3.o libpq_ce/fe-exec.o: client_logic_cache/types_to_oid.h
libpq_ce/fe-%.o: fe-%.cpp
diff --git a/src/common/interfaces/libpq/cl_state.cpp b/src/common/interfaces/libpq/cl_state.cpp
index 7b12a3649..5f6e6409b 100644
--- a/src/common/interfaces/libpq/cl_state.cpp
+++ b/src/common/interfaces/libpq/cl_state.cpp
@@ -49,7 +49,6 @@ PGClientLogic::PGClientLogic(PGconn *conn, JNIEnv *java_env, jobject jdbc_handle
droppedColumnSettings_size(0),
droppedColumnSettings_allocated(0),
isInvalidOperationOnColumn(false),
- should_refresh_function(false),
isDuringRefreshCacheOnError(false),
is_external_err(false),
cacheRefreshType(CacheRefreshType::CACHE_ALL),
diff --git a/src/common/interfaces/libpq/client_logic_cache/cache_loader.cpp b/src/common/interfaces/libpq/client_logic_cache/cache_loader.cpp
index 38d228ddf..078f7c1cf 100644
--- a/src/common/interfaces/libpq/client_logic_cache/cache_loader.cpp
+++ b/src/common/interfaces/libpq/client_logic_cache/cache_loader.cpp
@@ -21,6 +21,7 @@
* -------------------------------------------------------------------------
*/
#include
+#include
#include "cache_loader.h"
#include "client_logic_common/client_logic_utils.h"
#include "cache_refresh_type.h"
@@ -444,7 +445,6 @@ bool CacheLoader::fill_global_settings_map(PGconn *conn)
int arg_key_num = data_fetcher.get_column_index("key");
int arg_value_num = data_fetcher.get_column_index("value");
int change_epoch_num = data_fetcher.get_column_index("change_epoch");
-
CachedGlobalSetting *cached_global_setting(NULL);
Oid object_oid_prev(0);
while (data_fetcher.next()) {
@@ -471,7 +471,7 @@ bool CacheLoader::fill_global_settings_map(PGconn *conn)
bool is_new_object(false);
if (!object_oid_prev || object_oid != object_oid_prev) {
cached_global_setting =
- new (std::nothrow) CachedGlobalSetting(object_oid, get_database_name(), object_name_space, object_name);
+ new(std::nothrow) CachedGlobalSetting(object_oid, get_database_name(), object_name_space, object_name);
if (cached_global_setting == NULL) {
fprintf(stderr, "failed to allocate memory for client master key\n");
return false;
@@ -577,7 +577,7 @@ bool CacheLoader::fill_column_settings_info_cache(PGconn *conn)
bool is_new_object(false);
if (!object_oid_prev || object_oid != object_oid_prev) {
column_setting =
- new (std::nothrow) CachedColumnSetting(object_oid, get_database_name(), object_name_space, object_name);
+ new(std::nothrow) CachedColumnSetting(object_oid, get_database_name(), object_name_space, object_name);
if (column_setting == NULL) {
fprintf(stderr, "failed to allocate memory for column encryption key\n");
return false;
@@ -692,7 +692,7 @@ bool CacheLoader::fill_cached_columns(PGconn *conn)
Oid data_type_oid = (Oid)atoi(data_fetcher[orig_type_oid_num]);
int data_type_mod = atoi(data_fetcher[orig_type_mod_num]);
- CachedColumn *cached_column = new (std::nothrow) CachedColumn(my_oid, table_oid, database_name, schema_name,
+ CachedColumn *cached_column = new(std::nothrow) CachedColumn(my_oid, table_oid, database_name, schema_name,
table_name, column_name, column_position, data_type_oid, data_type_mod);
if (cached_column == NULL) {
fprintf(stderr, "failed to new CachedColumn object\n");
@@ -736,7 +736,7 @@ const bool CacheLoader::fill_cached_types(PGconn *conn)
m_cached_types_list.clear();
while (data_fetcher.next()) {
Oid oid_value = (Oid)atoi(data_fetcher[typid_num]);
- CachedType *curr_type = new (std::nothrow) CachedType(oid_value, data_fetcher[typname_num],
+ CachedType *curr_type = new(std::nothrow) CachedType(oid_value, data_fetcher[typname_num],
data_fetcher[schema_num], data_fetcher[db_num], conn->client_logic->m_cached_column_manager);
if (curr_type == NULL) {
fprintf(stderr, "failed to new CachedType object\n");
@@ -749,11 +749,11 @@ const bool CacheLoader::fill_cached_types(PGconn *conn)
bool CacheLoader::fill_cached_procs(PGconn *conn)
{
- const char *query = "select func_id, prorettype_orig, proargcachedcol, proallargtypes_orig,proname,"
- "pronargs,proargtypes,proallargtypes,proargnames,nspname,current_database() as dbname "
+ const char *query = "select func_id, proargcachedcol, proallargtypes_orig,proname,"
+ "pronargs,proargtypes,proallargtypes,proargnames,proargmodes,nspname,current_database() as dbname, "
+ "EXTRACT(epoch from gs_proc.last_change) as change_epoch "
"from gs_encrypted_proc gs_proc join pg_proc on gs_proc.func_id = pg_proc.oid "
" join pg_namespace ON (pg_namespace.oid = pronamespace);";
-
DataFetcher data_fetcher = conn->client_logic->m_data_fetcher_manager->get_data_fetcher();
if (!data_fetcher.load(query)) {
fprintf(stderr, "fill_cached_procs - query to initialize failed or did not return data\n");
@@ -761,50 +761,54 @@ bool CacheLoader::fill_cached_procs(PGconn *conn)
}
// getting the index of each column in the response
int func_oid_num = data_fetcher.get_column_index("func_id");
- int origin_ret_type_num = data_fetcher.get_column_index("prorettype_orig");
int cached_col_num = data_fetcher.get_column_index("proargcachedcol");
int alltypes_orig_num = data_fetcher.get_column_index("proallargtypes_orig");
int proname_num = data_fetcher.get_column_index("proname");
int pronargs_num = data_fetcher.get_column_index("pronargs");
int proargtypes_num = data_fetcher.get_column_index("proargtypes");
int proallargtypes_num = data_fetcher.get_column_index("proallargtypes");
+ int proargmodes_num = data_fetcher.get_column_index("proargmodes");
int proargnames_num = data_fetcher.get_column_index("proargnames");
int dbname_num = data_fetcher.get_column_index("dbname");
int schema_num = data_fetcher.get_column_index("nspname");
-
+ int change_epoch_num = data_fetcher.get_column_index("change_epoch");
m_proc_list.clear();
while (data_fetcher.next()) {
- CachedProc *curr_proc = new (std::nothrow) CachedProc();
+ update_last_change_epoch(data_fetcher[change_epoch_num]);
+ CachedProc *curr_proc = new(std::nothrow) CachedProc(conn);
if (curr_proc == NULL) {
fprintf(stderr, "failed to new CachedProc object\n");
return false;
}
- /* 10: base is decimal */
- curr_proc->m_func_id = strtoul(data_fetcher[func_oid_num], NULL, 10);
+ curr_proc->m_func_id = strtoul(data_fetcher[func_oid_num], NULL, NUMBER_BASE);
curr_proc->m_proname = strdup(data_fetcher[proname_num]);
curr_proc->m_pronargs = atoi(data_fetcher[pronargs_num]);
- curr_proc->m_prorettype_orig = strtoul(data_fetcher[origin_ret_type_num], NULL, 10);
curr_proc->m_dbname = strdup(data_fetcher[dbname_num]);
curr_proc->m_schema_name = strdup(data_fetcher[schema_num]);
if (data_fetcher[cached_col_num] != NULL && strlen(data_fetcher[cached_col_num]) > 0) {
- parse_oid_array(data_fetcher[cached_col_num], &curr_proc->m_proargcachedcol);
+ parse_oid_array(conn, data_fetcher[cached_col_num], &curr_proc->m_proargcachedcol);
}
if (data_fetcher[proargtypes_num] != NULL && strlen(data_fetcher[proargtypes_num]) > 0) {
- parse_oid_array(data_fetcher[proargtypes_num], &curr_proc->m_proargtypes);
+ parse_oid_array(conn, data_fetcher[proargtypes_num], &curr_proc->m_proargtypes);
}
if (data_fetcher[alltypes_orig_num] != NULL && strlen(data_fetcher[alltypes_orig_num]) > 0) {
- curr_proc->m_nallargtypes_orig =
- parse_oid_array(data_fetcher[alltypes_orig_num], &curr_proc->m_proallargtypes_orig);
+ curr_proc->m_nallargtypes =
+ parse_oid_array(conn, data_fetcher[alltypes_orig_num], &curr_proc->m_proallargtypes_orig);
}
if (data_fetcher[proallargtypes_num] != NULL && strlen(data_fetcher[proallargtypes_num]) > 0) {
- parse_oid_array(data_fetcher[proallargtypes_num], &curr_proc->m_proallargtypes);
+ parse_oid_array(conn, data_fetcher[proallargtypes_num], &curr_proc->m_proallargtypes);
}
if (data_fetcher[proargnames_num] != NULL && strlen(data_fetcher[proargnames_num]) > 0) {
- curr_proc->m_nallargtypes = parse_char_array(data_fetcher[proargnames_num], &curr_proc->m_proargnames);
+ curr_proc->m_nargnames =
+ parse_string_array(conn, data_fetcher[proargnames_num], &curr_proc->m_proargnames);
+ }
+ if (data_fetcher[proargmodes_num] != NULL && strlen(data_fetcher[proargmodes_num]) > 0) {
+ parse_char_array(conn, data_fetcher[proargmodes_num], &curr_proc->m_proargmodes);
}
curr_proc->set_original_ids();
- /* add to maps */
+
+ // add to maps
m_proc_list.add(curr_proc);
}
return true;
diff --git a/src/common/interfaces/libpq/client_logic_cache/cache_loader.h b/src/common/interfaces/libpq/client_logic_cache/cache_loader.h
index 842c47e0e..afa500f50 100644
--- a/src/common/interfaces/libpq/client_logic_cache/cache_loader.h
+++ b/src/common/interfaces/libpq/client_logic_cache/cache_loader.h
@@ -167,7 +167,6 @@ private:
tables from the server */
DatabaseType m_compat_type; /* server SQL compatibility */
NameData m_current_database_name;
-
double m_change_epoch = 0; /* time stamp of the latest client logic configuration fetched from the server */
void update_last_change_epoch(const char *time_since_epoc);
double get_local_max_time_stamp() const;
@@ -175,6 +174,7 @@ private:
private:
static const int m_FQDN_MAX_SIZE = NAMEDATALEN * 4;
+ static const int NUMBER_BASE = 10;
};
#endif /* CACHE_LOADER_H */
diff --git a/src/common/interfaces/libpq/client_logic_cache/cached_proc.cpp b/src/common/interfaces/libpq/client_logic_cache/cached_proc.cpp
index 3c9406839..9f7960252 100755
--- a/src/common/interfaces/libpq/client_logic_cache/cached_proc.cpp
+++ b/src/common/interfaces/libpq/client_logic_cache/cached_proc.cpp
@@ -25,10 +25,20 @@
#include "libpq-int.h"
#include "client_logic_common/client_logic_utils.h"
+/*
+ * @Description checks if param is used as output parameter
+ * @Param param_mode
+ * @Return true if param is output param, else false
+ */
+static const bool is_output_param(const char param_mode)
+{
+ return param_mode == FUNC_PARAM_OUT || param_mode == FUNC_PARAM_INOUT || param_mode == FUNC_PARAM_TABLE;
+}
+
CachedProc::~CachedProc()
{
if (m_proargnames) {
- for (size_t i = 0; i < m_nallargtypes; i++) {
+ for (size_t i = 0; i < m_nargnames; i++) {
if (m_proargnames[i])
libpq_free(m_proargnames[i]);
}
@@ -41,6 +51,7 @@ CachedProc::~CachedProc()
libpq_free(m_proargtypes);
libpq_free(m_proallargtypes);
libpq_free(m_proallargtypes_orig);
+ libpq_free(m_proargmodes);
if (m_original_ids) {
libpq_free(m_original_ids);
m_original_ids = NULL;
@@ -52,8 +63,8 @@ void CachedProc::set_original_ids()
if (m_original_ids == NULL) {
m_original_ids = (int*)malloc(get_num_processed_args() * sizeof(int));
if (m_original_ids == NULL) {
- fprintf(stderr, "cannot allocate memory for m_original_ids\n");
- exit(EXIT_FAILURE);
+ printfPQExpBuffer(&m_conn->errorMessage, libpq_gettext("cannot allocate memory for m_original_ids\n"));
+ return;
}
for (size_t i = 0; i < get_num_processed_args(); i++) {
m_original_ids[i] = get_original_id(i);
@@ -63,12 +74,13 @@ void CachedProc::set_original_ids()
const Oid CachedProc::get_original_id(const size_t idx) const
{
- if (idx >= m_nallargtypes_orig || !m_proallargtypes) {
+ if (idx >= m_nallargtypes || !m_proallargtypes) {
return InvalidOid;
}
size_t index = 0;
- for (size_t i = 0; i < m_nallargtypes_orig; i++) {
- if (is_clientlogic_datatype(m_proallargtypes[i])) {
+ for (size_t i = 0; i < m_nallargtypes; i++) {
+ /* Since this function is for use on response, for deprocessing the result set, input parms should be skipped */
+ if (is_clientlogic_datatype(m_proallargtypes[i]) && is_output_param(m_proargmodes[i])) {
if (index == idx) {
return m_proallargtypes_orig[i];
}
diff --git a/src/common/interfaces/libpq/client_logic_cache/cached_proc.h b/src/common/interfaces/libpq/client_logic_cache/cached_proc.h
index 3596d9316..393cd40b6 100755
--- a/src/common/interfaces/libpq/client_logic_cache/cached_proc.h
+++ b/src/common/interfaces/libpq/client_logic_cache/cached_proc.h
@@ -28,24 +28,25 @@
#include "cached_column.h"
#include "icached_rec.h"
/*
- * select func_id, prorettype_orig, proargcachedcol, proallargtypes_orig,
+ * select func_id, proargcachedcol, proallargtypes_orig,
* proname,pronargs,proargtypes,proallargtypes,proargnames,nspname from gs_encrypted_proc gs_proc join pg_proc on
* gs_proc.func_id = pg_proc.oid join pg_namespace ON (pg_namespace.oid = pronamespace);
*/
class CachedProc : public ICachedRec {
public:
- CachedProc()
- : m_func_id(0),
+ CachedProc(PGconn* const conn)
+ : m_conn(conn),
+ m_func_id(0),
m_proname(NULL),
m_pronargs(0),
- m_prorettype_orig(0),
m_proargcachedcol(NULL),
m_proargtypes(NULL),
m_nallargtypes(0),
- m_nallargtypes_orig(0),
m_proallargtypes(NULL),
m_proallargtypes_orig(NULL),
+ m_nargnames(0),
m_proargnames(NULL),
+ m_proargmodes(NULL),
m_schema_name(NULL),
m_dbname(NULL),
m_refcount(0) {};
@@ -59,22 +60,23 @@ public:
void set_original_ids();
const size_t get_num_processed_args() const override
{
- return m_nallargtypes_orig;
+ return m_nallargtypes;
}
+ PGconn* const m_conn;
Oid m_func_id;
char* m_proname;
int m_pronargs;
- Oid m_prorettype_orig;
Oid* m_proargcachedcol;
Oid* m_proargtypes;
size_t m_nallargtypes;
- size_t m_nallargtypes_orig;
Oid* m_proallargtypes;
Oid* m_proallargtypes_orig;
+ size_t m_nargnames;
char** m_proargnames;
+ char* m_proargmodes; /*argmod of param might be OUT, INOUT, IN, VARIADIC or TABLE*/
char* m_schema_name;
char* m_dbname;
size_t m_refcount;
};
-#endif
\ No newline at end of file
+#endif
diff --git a/src/common/interfaces/libpq/client_logic_common/client_logic_utils.cpp b/src/common/interfaces/libpq/client_logic_common/client_logic_utils.cpp
index a716225ca..065a6848c 100755
--- a/src/common/interfaces/libpq/client_logic_common/client_logic_utils.cpp
+++ b/src/common/interfaces/libpq/client_logic_common/client_logic_utils.cpp
@@ -1,312 +1,323 @@
-/*
- * Copyright (c) 2020 Huawei Technologies Co.,Ltd.
- *
- * openGauss is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- *
- * http://license.coscl.org.cn/MulanPSL2
- *
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- * -------------------------------------------------------------------------
- *
- * client_logic_utils.cpp
- *
- * IDENTIFICATION
- * src\common\interfaces\libpq\client_logic_common\client_logic_utils.cpp
- *
- * -------------------------------------------------------------------------
- */
-
-#include
-#include
-#include "client_logic_utils.h"
-#include "securec.h"
-typedef uintptr_t Datum;
-#include "nodes/primnodes.h"
-#include "libpq-int.h"
-#define HTONLL(x) ((1 == htonl(1)) ? (x) : ((((uint64_t)htonl((x)&0xFFFFFFFFUL)) << 32) | htonl((uint32_t)((x) >> 32))))
-#define NTOHLL(x) ((1 == ntohl(1)) ? (x) : ((((uint64_t)ntohl((x)&0xFFFFFFFFUL)) << 32) | ntohl((uint32_t)((x) >> 32))))
-
-bool is_clientlogic_datatype(const Oid o)
-{
- return (o == BYTEAWITHOUTORDERWITHEQUALCOLOID || o == BYTEAWITHOUTORDERCOLOID);
-}
-/*
- * Get the string without space
- */
-char *del_blanks(char *str, const int str_len)
-{
- char *source = NULL;
- char *dest = NULL;
- char *cpy_str = NULL;
- errno_t rc = 0;
-
- if (str == NULL || str_len <= 0) {
- return NULL;
- }
-
- cpy_str = (char *)malloc(str_len + 1);
- if (cpy_str == NULL) {
- return NULL;
- }
- rc = memset_s(cpy_str, str_len + 1, 0, str_len + 1);
- securec_check_c(rc, "\0", "\0");
- source = str;
- dest = cpy_str;
- while (source != NULL && isspace((int)*source)) {
- source++;
- }
- if (*source == '\0') {
- free(cpy_str);
- cpy_str = NULL;
- return NULL;
- }
-
- for (; *source != '\0'; source++) {
- if (!isspace((int)*source)) {
- *dest = *source;
- dest++;
- }
- }
-
- *dest = '\0';
- return cpy_str;
-}
-
-
-bool concat_col_fqdn(const char *catalogname, const char *schemaname, const char *relname, const char *colname,
- char *fqdn)
-{
- if (!fqdn || !colname) {
- return false;
- }
- bool ret = concat_table_fqdn(catalogname, schemaname, relname, fqdn);
- if (ret) {
- check_strncat_s(strncat_s(fqdn, NAMEDATALEN, ".", 1));
- } else {
- fqdn[0] = '\0';
- }
- check_strncat_s(strncat_s(fqdn, NAMEDATALEN, colname, strlen(colname)));
- return true;
-}
-
-bool concat_table_fqdn(const char *catalogname, const char *schemaname, const char *relname, char *fqdn)
-{
- if (!fqdn) {
- return false;
- }
-
- fqdn[0] = '\0';
- if (catalogname && catalogname[0] != '\0') {
- check_strncat_s(strncat_s(fqdn, NAMEDATALEN, catalogname, strlen(catalogname)));
- check_strncat_s(strncat_s(fqdn, NAMEDATALEN, ".", 1));
- } else {
- fqdn[0] = '\0';
- return false;
- }
-
- if (schemaname && schemaname[0] != '\0') {
- check_strncat_s(strncat_s(fqdn, NAMEDATALEN, schemaname, strlen(schemaname)));
- check_strncat_s(strncat_s(fqdn, NAMEDATALEN, ".", 1));
- } else {
- fqdn[0] = '\0';
- return false;
- }
-
- if (relname && relname[0] != '\0') {
- check_strncat_s(strncat_s(fqdn, NAMEDATALEN, relname, strlen(relname)));
- } else {
- fqdn[0] = '\0';
- return false;
- }
-
- return true;
-}
-
-void free_obj_list(ObjName *obj_list)
-{
- ObjName *cur_obj = obj_list;
- ObjName *to_free = NULL;
-
- while (cur_obj != NULL) {
- to_free = cur_obj;
- cur_obj = cur_obj->next;
- free(to_free);
- to_free = NULL;
- }
-
- obj_list = NULL;
-}
-
-ObjName *obj_list_append(ObjName *obj_list, const char *new_obj_name)
-{
- ObjName *new_obj = NULL;
- ObjName *last_obj = obj_list;
- errno_t rc = 0;
-
- if (new_obj_name == NULL || strlen(new_obj_name) >= OBJ_NAME_BUF_LEN) {
- free_obj_list(obj_list);
- return NULL;
- }
-
- new_obj = (ObjName *)malloc(sizeof(ObjName));
- if (new_obj == NULL) {
- free_obj_list(obj_list);
- return NULL;
- }
-
- rc = strcpy_s(new_obj->obj_name, sizeof(new_obj->obj_name), new_obj_name);
- securec_check_c(rc, "", "");
- new_obj->next = NULL;
-
- if (obj_list == NULL) {
- return new_obj;
- }
-
- while (last_obj->next != NULL) {
- last_obj = last_obj->next;
- }
-
- last_obj->next = new_obj;
- return obj_list;
-}
-/**
- * helper function to parse a string array of Oids and types.
- * It searches for possible separator with are ',' or ' ' space and count its occurrences
- * @param input input array
- * @return the numbers of seperators in the input string
- */
-size_t count_sep_in_str(const char *input)
-{
- size_t result = 0;
- if (input == NULL || strlen(input) == 0) {
- return result;
- }
- for (size_t index = 0; index < strlen(input); ++index) {
- if (input[index] == ',' || input[index] == ' ') {
- ++result;
- }
- }
- return result;
-}
-/**
- * Parses a char array coming from the database server when loading the cache
- * It is in the form of {elem,elem,elem ...} or "elem elem elem elem"
- * Note that this method allocates the memory for the items_out parameters and it is up to the caller to free it
- * @param[in] input the input array string
- * @param[out] items_out vector of items allocated by this method
- * @return the numbers of items in items_out
- */
-size_t parse_char_array(const char *input, char ***items_out)
-{
- *items_out = NULL;
- char **items = NULL;
- size_t output_length = 0;
-
- if (input == NULL ||
- strlen(input) == 0) { /* there are 2 characters for opening and closing brakets {item1,item2....itemn} */
- return output_length;
- }
- int start_offset = 0;
- if (input[0] == '{') {
- start_offset = 1;
- /* if input length < 3, it has no item */
- if (strlen(input) < 3) {
- return output_length;
- }
- }
- size_t count_of_column = count_sep_in_str(input);
- output_length = count_of_column + 1;
- size_t elem_index = 0;
- items = (char **)malloc(output_length * sizeof(char *));
- if (items == NULL) {
- fprintf(stderr, "Error: out of memory\n");
- output_length = 0;
- return output_length;
- }
- *items_out = items;
- check_memset_s(memset_s(items, output_length * sizeof(char *), 0, output_length * sizeof(char *)));
- size_t begin_index = start_offset;
- size_t last_index = 0;
- /* Ignoring the brackets if exists {item1,item2....itemn} */
- for (size_t index = start_offset; index < strlen(input); ++index) {
- last_index = index;
- if (input[index] == ',' || input[index] == ' ' || input[index] == '}') {
- if (elem_index < output_length) {
- size_t item_len = index - begin_index;
- items[elem_index] = (char *)malloc((item_len + 1) * sizeof(char));
- if (items[elem_index] == NULL) {
- fprintf(stderr, "Error: out of memory\n");
- for (size_t i = 0; i < elem_index; i++) {
- libpq_free(items[i]);
- }
- libpq_free(items);
- output_length = 0;
- return output_length;
- }
- check_strncpy_s(strncpy_s(items[elem_index], item_len + 1, input + begin_index, item_len));
- items[elem_index][index - begin_index] = 0;
- } else {
- fprintf(stderr, "Error: index out of bound on parse_char_array %s\n", input);
- }
- begin_index = index + 1;
- ++elem_index;
- }
- }
- if (start_offset == 0) { /* Handle the last item */
- if (elem_index < output_length) {
- size_t item_len = last_index - begin_index + 1;
- items[elem_index] = (char *)malloc((item_len + 1) * sizeof(char));
- if (items[elem_index] == NULL) {
- fprintf(stderr, "Error: out of memory\n");
- for (size_t i = 0; i < elem_index; i++) {
- libpq_free(items[i]);
- }
- libpq_free(items);
- output_length = 0;
- return output_length;
- }
- check_strncpy_s(strncpy_s(items[elem_index], item_len + 1, input + begin_index, item_len));
- items[elem_index][last_index - begin_index + 1] = 0;
- }
- }
- return output_length;
-}
-/**
- * Parses a char array coming from the database server when loading the cache
- * It is in the form of {oid1,oid2,...oidn) or "oid1 oid2 ... oidn"
- * Note that this method allocates the memory for the items_out parameters and it is up to the caller to free it
- * @param[in] input the input array string
- * @param[out] items_out vector of items allocated by this method
- * @return the numbers of items in items_out*
- */
-size_t parse_oid_array(const char *input, Oid **items_out)
-{
- *items_out = NULL;
- char **items_char = NULL;
- Oid *items = NULL;
- size_t output_length = parse_char_array(input, &items_char);
- if (output_length > 0) {
- items = (Oid *)malloc(output_length * sizeof(Oid));
- if (items == NULL) {
- fprintf(stderr, "Error: out of memory\n");
- for (size_t index = 0; index < output_length; ++index) {
- free(items_char[index]);
- }
- free(items_char);
- output_length = 0;
- return output_length;
- }
- *items_out = items;
- for (size_t index = 0; index < output_length; ++index) {
- items[index] = (Oid)atoi(items_char[index]);
- free(items_char[index]);
- }
- }
- free(items_char);
- return output_length;
-}
+/*
+ * Copyright (c) 2020 Huawei Technologies Co.,Ltd.
+ *
+ * openGauss is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ *
+ * http://license.coscl.org.cn/MulanPSL2
+ *
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * -------------------------------------------------------------------------
+ *
+ * client_logic_utils.cpp
+ *
+ * IDENTIFICATION
+ * src\common\interfaces\libpq\client_logic_common\client_logic_utils.cpp
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#include
+#include
+#include "client_logic_utils.h"
+#include "securec.h"
+typedef uintptr_t Datum;
+#include "nodes/primnodes.h"
+#include "libpq-int.h"
+#define HTONLL(x) ((1 == htonl(1)) ? (x) : ((((uint64_t)htonl((x)&0xFFFFFFFFUL)) << 32) | htonl((uint32_t)((x) >> 32))))
+#define NTOHLL(x) ((1 == ntohl(1)) ? (x) : ((((uint64_t)ntohl((x)&0xFFFFFFFFUL)) << 32) | ntohl((uint32_t)((x) >> 32))))
+
+static const size_t MIN_SIZE_WITH_ELEMENTS = 3;
+
+bool is_clientlogic_datatype(const Oid o)
+{
+ return (o == BYTEAWITHOUTORDERWITHEQUALCOLOID || o == BYTEAWITHOUTORDERCOLOID);
+}
+/*
+ * Get the string without space
+ */
+char *del_blanks(char *str, const int str_len)
+{
+ char *source = NULL;
+ char *dest = NULL;
+ char *cpy_str = NULL;
+ errno_t rc = 0;
+
+ if (str == NULL || str_len <= 0) {
+ return NULL;
+ }
+
+ cpy_str = (char *)malloc(str_len + 1);
+ if (cpy_str == NULL) {
+ return NULL;
+ }
+ rc = memset_s(cpy_str, str_len + 1, 0, str_len + 1);
+ securec_check_c(rc, "\0", "\0");
+ source = str;
+ dest = cpy_str;
+ while (source != NULL && isspace((int)*source)) {
+ source++;
+ }
+ if (*source == '\0') {
+ free(cpy_str);
+ cpy_str = NULL;
+ return NULL;
+ }
+
+ for (; *source != '\0'; source++) {
+ if (!isspace((int)*source)) {
+ *dest = *source;
+ dest++;
+ }
+ }
+
+ *dest = '\0';
+ return cpy_str;
+}
+
+
+bool concat_col_fqdn(const char *catalogname, const char *schemaname, const char *relname, const char *colname,
+ char *fqdn)
+{
+ if (!fqdn || !colname) {
+ return false;
+ }
+ bool ret = concat_table_fqdn(catalogname, schemaname, relname, fqdn);
+ if (ret) {
+ check_strncat_s(strncat_s(fqdn, NAMEDATALEN, ".", 1));
+ } else {
+ fqdn[0] = '\0';
+ }
+ check_strncat_s(strncat_s(fqdn, NAMEDATALEN, colname, strlen(colname)));
+ return true;
+}
+
+bool concat_table_fqdn(const char *catalogname, const char *schemaname, const char *relname, char *fqdn)
+{
+ if (!fqdn) {
+ return false;
+ }
+
+ fqdn[0] = '\0';
+ if (catalogname && catalogname[0] != '\0') {
+ check_strncat_s(strncat_s(fqdn, NAMEDATALEN, catalogname, strlen(catalogname)));
+ check_strncat_s(strncat_s(fqdn, NAMEDATALEN, ".", 1));
+ } else {
+ fqdn[0] = '\0';
+ return false;
+ }
+
+ if (schemaname && schemaname[0] != '\0') {
+ check_strncat_s(strncat_s(fqdn, NAMEDATALEN, schemaname, strlen(schemaname)));
+ check_strncat_s(strncat_s(fqdn, NAMEDATALEN, ".", 1));
+ } else {
+ fqdn[0] = '\0';
+ return false;
+ }
+
+ if (relname && relname[0] != '\0') {
+ check_strncat_s(strncat_s(fqdn, NAMEDATALEN, relname, strlen(relname)));
+ } else {
+ fqdn[0] = '\0';
+ return false;
+ }
+
+ return true;
+}
+
+void free_obj_list(ObjName *obj_list)
+{
+ ObjName *cur_obj = obj_list;
+ ObjName *to_free = NULL;
+
+ while (cur_obj != NULL) {
+ to_free = cur_obj;
+ cur_obj = cur_obj->next;
+ free(to_free);
+ to_free = NULL;
+ }
+
+ obj_list = NULL;
+}
+
+ObjName *obj_list_append(ObjName *obj_list, const char *new_obj_name)
+{
+ ObjName *new_obj = NULL;
+ ObjName *last_obj = obj_list;
+ errno_t rc = 0;
+
+ if (new_obj_name == NULL || strlen(new_obj_name) >= OBJ_NAME_BUF_LEN) {
+ free_obj_list(obj_list);
+ return NULL;
+ }
+
+ new_obj = (ObjName *)malloc(sizeof(ObjName));
+ if (new_obj == NULL) {
+ free_obj_list(obj_list);
+ return NULL;
+ }
+
+ rc = strcpy_s(new_obj->obj_name, sizeof(new_obj->obj_name), new_obj_name);
+ securec_check_c(rc, "", "");
+ new_obj->next = NULL;
+
+ if (obj_list == NULL) {
+ return new_obj;
+ }
+
+ while (last_obj->next != NULL) {
+ last_obj = last_obj->next;
+ }
+
+ last_obj->next = new_obj;
+ return obj_list;
+}
+/**
+ * helper function to parse a string array of Oids and types.
+ * It searches for possible separator with are ',' or ' ' space and count its occurrences
+ * @param input input array
+ * @return the numbers of seperators in the input string
+ */
+size_t count_sep_in_str(const char *input)
+{
+ size_t result = 0;
+ if (input == NULL || strlen(input) == 0) {
+ return result;
+ }
+ for (size_t index = 0; index < strlen(input); ++index) {
+ if (input[index] == ',' || input[index] == ' ') {
+ ++result;
+ }
+ }
+ return result;
+}
+
+/**
+ * Parses a char array coming from the database server when loading the cache
+ * It is in the form of {elem,elem,elem ...} or "elem elem elem elem"
+ * Note that this method allocates the memory for the items_out parameters and it is up to the caller to free it
+ * @param[in] input the input array string
+ * @param[out] items_out vector of items allocated by this method
+ * @return the numbers of items in items_out
+ */
+size_t parse_string_array(PGconn* const conn, const char *input, char ***items_out)
+{
+ *items_out = NULL;
+ char **items = NULL;
+ size_t output_length = 0;
+
+ if (input == NULL || strlen(input) == 0) {
+ /* there are 2 characters for opening and closing brakets {item1,item2....itemn} */
+ return output_length;
+ }
+ size_t start_offset = 0;
+ if (input[0] == '{') {
+ start_offset = 1;
+ if (strlen(input) < MIN_SIZE_WITH_ELEMENTS) {
+ return output_length;
+ }
+ }
+ size_t count_of_column = count_sep_in_str(input);
+ output_length = count_of_column + 1;
+ size_t elem_index = 0;
+ items = (char **)malloc(output_length * sizeof(char*));
+ *items_out = items;
+ if (items == NULL) {
+ printfPQExpBuffer(&conn->errorMessage, libpq_gettext("Error: out of memory?\n"));
+ output_length = 0;
+ return output_length;
+ }
+ check_memset_s(memset_s(items, output_length * sizeof(char *), 0, output_length * sizeof(char*)));
+ size_t begin_index = start_offset;
+ size_t last_index = start_offset;
+ for (size_t index = start_offset; index < strlen(input); ++index) {
+ // Ignoring the bracket if exists {item1,item2....itemn}
+ last_index = index;
+ if (input[index] == ',' || input[index] == ' ' || input[index] == '}') {
+ if (elem_index < output_length) {
+ size_t item_len = index - begin_index;
+ items[elem_index] = (char *)malloc((item_len + 1) * sizeof(char));
+ check_strncpy_s(strncpy_s(items[elem_index], item_len + 1, input + begin_index, item_len));
+ items[elem_index][index - begin_index] = 0;
+ } else {
+ printfPQExpBuffer(&conn->errorMessage,
+ libpq_gettext("Error: index out of bound on parse_string_array %s\n"), input);
+ }
+ begin_index = index + 1;
+ ++elem_index;
+ }
+ }
+ if (start_offset == 0) { // Handle the last item
+ if (elem_index < output_length) {
+ size_t item_len = last_index + 1 - begin_index;
+ items[elem_index] = (char *)malloc((item_len + 1) * sizeof(char));
+ check_strncpy_s(strncpy_s(items[elem_index], item_len + 1, input + begin_index, item_len));
+ items[elem_index][item_len] = 0;
+ }
+ }
+ return output_length;
+}
+
+/**
+ * Parses a char array coming from the database server when loading the cache
+ * It is in the form of {'c','i',..'o'} or "c i ... o"
+ * Note that this method allocates the memory for the items_out parameters and it is up to the caller to free it
+ * @param[in] input the input array string
+ * @param[out] items_out vector of items allocated by this method
+ * @return the numbers of items in items_out*
+ */
+size_t parse_char_array(PGconn* const conn, const char *input, char **items_out)
+{
+ *items_out = NULL;
+ char **items_char = NULL;
+ char *items = NULL;
+ size_t output_length = parse_string_array(conn, input, &items_char);
+ if (output_length > 0) {
+ items = (char*)malloc(output_length * sizeof(char));
+ *items_out = items;
+ for (size_t index = 0; index < output_length; ++index) {
+ items[index] = *(items_char[index]);
+ free(items_char[index]);
+ }
+ }
+ free(items_char);
+ return output_length;
+}
+/**
+ * Parses a oid array coming from the database server when loading the cache
+ * It is in the form of {oid1,oid2,...oidn) or "oid1 oid2 ... oidn"
+ * Note that this method allocates the memory for the items_out parameters and it is up to the caller to free it
+ * @param[in] input the input array string
+ * @param[out] items_out vector of items allocated by this method
+ * @return the numbers of items in items_out*
+ */
+size_t parse_oid_array(PGconn* const conn, const char *input, Oid **items_out)
+{
+ *items_out = NULL;
+ char **items_char = NULL;
+ Oid *items = NULL;
+ size_t output_length = parse_string_array(conn, input, &items_char);
+ if (output_length > 0) {
+ items = (Oid *)malloc(output_length * sizeof(Oid));
+ if (items == NULL) {
+ printfPQExpBuffer(&conn->errorMessage, libpq_gettext("Error: out of memory\n"));
+ for (size_t index = 0; index < output_length; ++index) {
+ free(items_char[index]);
+ }
+ free(items_char);
+ output_length = 0;
+ return output_length;
+ }
+ *items_out = items;
+ for (size_t index = 0; index < output_length; ++index) {
+ items[index] = (Oid)atoi(items_char[index]);
+ free(items_char[index]);
+ }
+ }
+ free(items_char);
+ return output_length;
+}
diff --git a/src/common/interfaces/libpq/client_logic_common/client_logic_utils.h b/src/common/interfaces/libpq/client_logic_common/client_logic_utils.h
index edb0a1df3..3ef8b19a4 100755
--- a/src/common/interfaces/libpq/client_logic_common/client_logic_utils.h
+++ b/src/common/interfaces/libpq/client_logic_common/client_logic_utils.h
@@ -29,7 +29,7 @@
#include "client_logic_cache/dataTypes.def"
struct RangeVar;
typedef unsigned int Oid;
-
+typedef struct pg_conn PGconn;
const int OBJ_NAME_BUF_LEN = 256;
/* Array header structures */
typedef struct {
@@ -62,9 +62,10 @@ template inline bool is_const(T const & x)
return true;
}
char *del_blanks(char *str, const int str_len);
-size_t parse_char_array(const char *input, char ***items_out);
-size_t parse_oid_array(const char *input, Oid **items_out);
-
+size_t count_char_in_str(const char *input, char niddle);
+size_t parse_string_array(PGconn* const conn, const char *input, char ***items_out);
+size_t parse_char_array(PGconn* const conn, const char *input, char **items_out);
+size_t parse_oid_array(PGconn* const conn, const char *input, Oid **items_out);
extern void free_obj_list(ObjName *obj_list);
extern ObjName *obj_list_append(ObjName *obj_list, const char *new_obj_name);
diff --git a/src/common/interfaces/libpq/client_logic_common/cstrings_map.cpp b/src/common/interfaces/libpq/client_logic_common/cstrings_map.cpp
index 1ec1fa422..b702f7525 100644
--- a/src/common/interfaces/libpq/client_logic_common/cstrings_map.cpp
+++ b/src/common/interfaces/libpq/client_logic_common/cstrings_map.cpp
@@ -68,7 +68,7 @@ void CStringsMap::set(const char *key, const char *value, size_t valsize)
{
Assert(key && value);
size_t key_index = index(key);
- if (valsize == 0) {
+ if (valsize == SIZE_MAX) {
valsize = strlen(value);
}
if (valsize > MAX_VAL_LEN) {
diff --git a/src/common/interfaces/libpq/client_logic_common/pg_client_logic_params.cpp b/src/common/interfaces/libpq/client_logic_common/pg_client_logic_params.cpp
index 6a6d007ca..e88f9f132 100644
--- a/src/common/interfaces/libpq/client_logic_common/pg_client_logic_params.cpp
+++ b/src/common/interfaces/libpq/client_logic_common/pg_client_logic_params.cpp
@@ -21,95 +21,20 @@
* -------------------------------------------------------------------------
*/
-#include "libpq-int.h"
#include "client_logic_common/pg_client_logic_params.h"
#include
-PGClientLogicParams::PGClientLogicParams(const PGClientLogicParams &other)
-{
- init(other);
-}
-
-void PGClientLogicParams::init(const PGClientLogicParams &other)
-{
- nParams = other.nParams;
- new_param_values = NULL;
- adjusted_query = other.adjusted_query;
- adjusted_query_size = other.adjusted_query_size;
- adjusted_paramTypes = NULL;
- copy_sizes = NULL;
- adjusted_param_lengths = NULL;
- adjusted_param_values = NULL;
- new_query = NULL;
- new_query_size = other.new_query_size;
- if (other.new_query != NULL && other.new_query_size > 0) {
- new_query = (char *)calloc(new_query_size + 1, sizeof(char));
- if (new_query == NULL) {
- printf("out of memory\n");
- exit(EXIT_FAILURE);
- }
- check_strncpy_s(strncpy_s(new_query, new_query_size + 1, other.new_query, other.new_query_size));
- new_query[new_query_size] = '\0';
- }
- if (other.nParams && other.copy_sizes) {
- copy_sizes = (size_t *)calloc(other.nParams, sizeof(size_t));
- if (copy_sizes == NULL) {
- printf("out of memory\n");
- exit(EXIT_FAILURE);
- }
- check_memcpy_s(
- memcpy_s(copy_sizes, nParams * sizeof(size_t), other.copy_sizes, other.nParams * sizeof(size_t)));
- }
- if (other.new_param_values) {
- new_param_values = (unsigned char **)calloc(other.nParams, sizeof(unsigned char *));
- if (new_param_values == NULL) {
- printf("out of memory\n");
- exit(EXIT_FAILURE);
- }
- for (size_t i = 0; i < other.nParams; ++i) {
- if (copy_sizes != NULL && copy_sizes[i]) {
- new_param_values[i] = (unsigned char *)calloc(other.copy_sizes[i], sizeof(unsigned char));
- if (new_param_values[i] == NULL) {
- printf("out of memory\n");
- exit(EXIT_FAILURE);
- }
- check_memcpy_s(memcpy_s(new_param_values[i], copy_sizes[i] * sizeof(unsigned char),
- other.new_param_values[i], other.copy_sizes[i]));
- } else {
- new_param_values[i] = NULL;
- }
- }
- }
- if (other.adjusted_paramTypes) {
- adjusted_paramTypes = (Oid *)calloc(other.nParams, sizeof(Oid));
- if (adjusted_paramTypes == NULL) {
- printf("out of memory\n");
- exit(EXIT_FAILURE);
- }
- check_memcpy_s(memcpy_s(adjusted_paramTypes, nParams * sizeof(Oid), other.adjusted_paramTypes,
- other.nParams * sizeof(Oid)));
- }
- if (other.adjusted_param_lengths) {
- adjusted_param_lengths = (int *)calloc(other.nParams, sizeof(int));
- if (adjusted_param_lengths == NULL) {
- printf("out of memory\n");
- exit(EXIT_FAILURE);
- }
- check_memcpy_s(memcpy_s(adjusted_param_lengths, nParams * sizeof(int), other.adjusted_param_lengths,
- other.nParams * sizeof(int)));
- }
-}
-
PGClientLogicParams::~PGClientLogicParams()
{
for (size_t i = 0; i < nParams; i++) {
- libpq_free(new_param_values[i]);
+ if (copy_sizes && copy_sizes[i]) {
+ libpq_free(new_param_values[i]);
+ }
}
libpq_free(new_param_values);
libpq_free(copy_sizes);
libpq_free(adjusted_paramTypes);
-
libpq_free(adjusted_param_values);
libpq_free(adjusted_param_lengths);
libpq_free(new_query);
-}
\ No newline at end of file
+}
diff --git a/src/common/interfaces/libpq/client_logic_common/pg_client_logic_params.h b/src/common/interfaces/libpq/client_logic_common/pg_client_logic_params.h
index 7e72076c4..6268cbdd4 100644
--- a/src/common/interfaces/libpq/client_logic_common/pg_client_logic_params.h
+++ b/src/common/interfaces/libpq/client_logic_common/pg_client_logic_params.h
@@ -37,8 +37,7 @@ typedef struct PGClientLogicParams {
adjusted_param_values(NULL),
adjusted_param_lengths(NULL),
copy_sizes(NULL) {};
- PGClientLogicParams(const PGClientLogicParams &other);
- void init(const PGClientLogicParams &other);
+ PGClientLogicParams(const PGClientLogicParams &other) = delete;
~PGClientLogicParams();
char *new_query;
size_t new_query_size;
diff --git a/src/common/interfaces/libpq/client_logic_data_fetcher/jni_conn_cursor.cpp b/src/common/interfaces/libpq/client_logic_data_fetcher/jni_conn_cursor.cpp
index 76505db57..b74e8910f 100644
--- a/src/common/interfaces/libpq/client_logic_data_fetcher/jni_conn_cursor.cpp
+++ b/src/common/interfaces/libpq/client_logic_data_fetcher/jni_conn_cursor.cpp
@@ -23,7 +23,9 @@
#include "jni_conn_cursor.h"
#include "libpq-int.h"
+#ifndef ENABLE_LITE_MODE
#include
+#endif
static const int DATA_INDEX = 2;
diff --git a/src/common/interfaces/libpq/client_logic_data_fetcher/lib_pq_cursor.cpp b/src/common/interfaces/libpq/client_logic_data_fetcher/lib_pq_cursor.cpp
index 30cd75b56..7ae94600c 100644
--- a/src/common/interfaces/libpq/client_logic_data_fetcher/lib_pq_cursor.cpp
+++ b/src/common/interfaces/libpq/client_logic_data_fetcher/lib_pq_cursor.cpp
@@ -24,6 +24,8 @@
#include "lib_pq_cursor.h"
#include "stdio.h"
#include "libpq/libpq-fe.h"
+#include "libpq/libpq-int.h"
+
/* *
* Constructor
@@ -54,6 +56,11 @@ bool LibPQCursor::load(const char *query)
{
m_conn->client_logic->disable_once = true;
m_data_handler = PQexec(m_conn, query);
+ if (!m_data_handler) {
+ printfPQExpBuffer(&m_conn->errorMessage, libpq_gettext("Client encryption cache query: '%s' failed\n"), query);
+ m_data_handler = NULL;
+ return false;
+ }
/* check status */
if (PQresultStatus(m_data_handler) != PGRES_TUPLES_OK) {
fprintf(stderr, "Client encryption cache query: '%s' failed with error : %d, '%s'\n", query,
@@ -116,4 +123,4 @@ void LibPQCursor::clear_result()
PQclear(m_data_handler);
m_data_handler = NULL;
}
-}
\ No newline at end of file
+}
diff --git a/src/common/interfaces/libpq/client_logic_fmt/biginteger.cpp b/src/common/interfaces/libpq/client_logic_fmt/biginteger.cpp
deleted file mode 100644
index dae1d22de..000000000
--- a/src/common/interfaces/libpq/client_logic_fmt/biginteger.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (c) 2020 Huawei Technologies Co.,Ltd.
- *
- * openGauss is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- *
- * http://license.coscl.org.cn/MulanPSL2
- *
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- * -------------------------------------------------------------------------
- *
- * biginteger.cpp
- *
- * IDENTIFICATION
- * src\common\interfaces\libpq\client_logic_fmt\biginteger.cpp
- *
- * -------------------------------------------------------------------------
- */
-
-#include "biginteger.h"
-#define MAXBI64LEN 25
-#define MAXBI128LEN 45
-
-static const char *int64_min_str = "-9223372036854775808";
-static const char *int128_min_str = "-170141183460469231731687303715884105728";
-bool bi64_out(int64 data, int scale, char *buf)
-{
- Assert(scale >= 0 && scale <= MAXINT64DIGIT);
- uint64 val_u64 = 0;
-
- errno_t rc = EOK;
- /* data == INT64_MIN */
- if (unlikely(data == (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1))) {
- /*
- * Avoid problems with the most negative integer not being representable
- * as a positive integer.
- */
- if (scale > 0) {
- int len = strlen(int64_min_str) - scale;
- rc = memcpy_s(buf, MAXBI64LEN, int64_min_str, len);
- /* check the return value of security function */
- securec_check_c(rc, "\0", "\0");
- buf[len] = '.';
- rc = memcpy_s(buf + len + 1, MAXBI64LEN - len - 1, int64_min_str + len, scale + 1);
- /* check the return value of security function */
- securec_check_c(rc, "\0", "\0");
- } else {
- rc = memcpy_s(buf, MAXBI64LEN, int64_min_str, strlen(int64_min_str) + 1);
- /* check the return value of security function */
- securec_check_c(rc, "\0", "\0");
- }
- return true;
- }
-
- int64 pre_val = 0;
- int64 post_val = 0;
-
- /* data is positive */
- if (data >= 0) {
- val_u64 = data;
- pre_val = val_u64 / (uint64)get_scale_multiplier(scale);
- post_val = val_u64 % (uint64)get_scale_multiplier(scale);
- if (likely(scale > 0)) {
- /* ignore preceding 0, eg: value is 0.1, output is '.1' */
- if (pre_val == 0 && post_val != 0) {
- rc = sprintf_s(buf, MAXBI64LEN, ".%0*ld", scale, post_val);
- } else {
- rc = sprintf_s(buf, MAXBI64LEN, "%ld.%0*ld", pre_val, scale, post_val);
- }
- } else {
- rc = sprintf_s(buf, MAXBI64LEN, "%ld", pre_val);
- }
- /* check the return value of security function */
- securec_check_ss_c(rc, "\0", "\0");
- } else {
- /* data is negative */
- val_u64 = -data;
- pre_val = val_u64 / (uint64)get_scale_multiplier(scale);
- post_val = val_u64 % (uint64)get_scale_multiplier(scale);
- if (likely(scale > 0)) {
- /* ignore preceding 0, eg: value is -0.1, output is '-.1' */
- if (pre_val == 0 && post_val != 0) {
- rc = sprintf_s(buf, MAXBI64LEN, "-.%0*ld", scale, post_val);
- } else {
- rc = sprintf_s(buf, MAXBI64LEN, "-%ld.%0*ld", pre_val, scale, post_val);
- }
- } else {
- rc = sprintf_s(buf, MAXBI64LEN, "-%ld", pre_val);
- }
- /* check the return value of security function */
- securec_check_ss_c(rc, "\0", "\0");
- }
-
- return true;
-}
-/*
- * @Description: print int128 data to string, because of current GCC doesn't provide
- * solution to print int128 data, we provide this function.
- *
- * @IN preceding_zero: mark whether print preceding zero or not
- * @IN data: int128 data
- * @OUT str: the output string buffer
- * @IN len: the length of string buffer
- * @IN scale:when preceding_zero is true, scale is the standard output width size
- * @Return: print succeed or not
- */
-template static int int128_to_string(int128 data, char *str, int len, int scale)
-{
- Assert(data >= 0);
- Assert(scale >= 0 && scale <= MAXINT128DIGIT);
-
- errno_t rc = EOK;
- /* turn to int64 */
- if (INT128_INT64_EQ(data)) {
- if (preceding_zero) {
- rc = sprintf_s(str, len, "%0*ld", scale, (int64)data);
- } else {
- rc = sprintf_s(str, len, "%ld", (int64)data);
- }
- securec_check_ss_c(rc, "\0", "\0");
- return rc;
- }
-
- /* get the absolute value of data, it's useful for sprintf */
- int128 num = data;
- int64 leading = 0;
- int64 trailing = 0;
- trailing = num % P10_INT64;
- num = num / P10_INT64;
- /* two int64 num can represent the int128 data */
- if (INT128_INT64_EQ(num)) {
- leading = (int64)num;
- if (preceding_zero) {
- const int trailing_digits = 18;
- Assert(scale > trailing_digits);
- rc = sprintf_s(str, len, "%0*ld%018ld", scale - trailing_digits, leading, trailing);
- } else {
- rc = sprintf_s(str, len, "%ld%018ld", leading, trailing);
- }
- securec_check_ss_c(rc, "\0", "\0");
- return rc;
- }
-
- /* two int64 num can't represent int128data, use 3 int64 numbers */
- int64 middle = num % P10_INT64;
- num = num / P10_INT64;
- leading = (int64)num;
- /* both the middle and trailing digits have 18 digits */
- if (preceding_zero) {
- const int middle_trailing_digits = 36;
- Assert(scale > middle_trailing_digits);
- rc = sprintf_s(str, len, "%0*ld%018ld%018ld", scale - middle_trailing_digits, leading, middle, trailing);
- } else {
- rc = sprintf_s(str, len, "%ld%018ld%018ld", leading, middle, trailing);
- }
- securec_check_ss_c(rc, "\0", "\0");
- return rc;
-}
-
-/*
- * @Description: print bi128 data to string like numeric_out.
- *
- * @IN data: int128 data
- * @IN scale: the scale of bi128 data
- * @Return: Output string for numeric data type
- */
-bool bi128_out(int128 data, int scale, char *buf)
-{
- Assert(scale >= 0 && scale <= MAXINT128DIGIT);
-
- /* data == INT128_MIN */
- if (unlikely(data == INT128_MIN)) {
- errno_t rc = EOK;
- /*
- * Avoid problems with the most negative integer not being representable
- * as a positive integer.
- */
- if (scale > 0) {
- int len = strlen(int128_min_str) - scale;
- rc = memcpy_s(buf, MAXBI128LEN, int128_min_str, len);
- /* check the return value of security function */
- securec_check_c(rc, "\0", "\0");
- buf[len] = '.';
- rc = memcpy_s(buf + len + 1, MAXBI128LEN - len - 1, int128_min_str + len, scale + 1);
- /* check the return value of security function */
- securec_check_c(rc, "\0", "\0");
- } else {
- rc = memcpy_s(buf, MAXBI128LEN, int128_min_str, strlen(int128_min_str) + 1);
- /* check the return value of security function */
- securec_check_c(rc, "\0", "\0");
- }
- return true;
- }
-
- int128 pre_val = 0;
- int128 post_val = 0;
-
- /* data is positive */
- if (data >= 0) {
- pre_val = data / get_scale_multiplier(scale);
- post_val = data % get_scale_multiplier(scale);
- if (likely(scale > 0)) {
- if (pre_val == 0 && post_val != 0) {
- buf[0] = '.';
- int128_to_string(post_val, buf + 1, MAXBI128LEN - 1, scale);
- } else {
- int128_to_string(pre_val, buf, MAXBI128LEN, 0);
- int len = strlen(buf);
- buf[len] = '.';
- int128_to_string(post_val, buf + len + 1, MAXBI128LEN - len - 1, scale);
- }
- } else {
- int128_to_string(pre_val, buf, MAXBI128LEN, 0);
- }
- } else { /* data is negative */
- data = -data;
- pre_val = data / get_scale_multiplier(scale);
- post_val = data % get_scale_multiplier(scale);
- buf[0] = '-';
- if (likely(scale > 0)) {
- if (pre_val == 0 && post_val != 0) {
- buf[1] = '.';
- int128_to_string(post_val, buf + 2, MAXBI128LEN - 2, scale); /* 2 is buf[0] and buf[1] */
- } else {
- int128_to_string(pre_val, buf + 1, MAXBI128LEN - 1, 0);
- int len = strlen(buf);
- buf[len] = '.';
- int128_to_string(post_val, buf + len + 1, MAXBI128LEN - len - 1, scale);
- }
- } else {
- int128_to_string(pre_val, buf + 1, MAXBI128LEN - 1, 0);
- }
- }
- return true;
-}
diff --git a/src/common/interfaces/libpq/client_logic_fmt/biginteger.h b/src/common/interfaces/libpq/client_logic_fmt/biginteger.h
deleted file mode 100644
index 395091c70..000000000
--- a/src/common/interfaces/libpq/client_logic_fmt/biginteger.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2020 Huawei Technologies Co.,Ltd.
- *
- * openGauss is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- *
- * http://license.coscl.org.cn/MulanPSL2
- *
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- * -------------------------------------------------------------------------
- *
- * biginteger.h
- *
- * IDENTIFICATION
- * src\common\interfaces\libpq\client_logic_fmt\biginteger.h
- *
- * -------------------------------------------------------------------------
- */
-
-#ifndef BIGINTEGER_H
-#define BIGINTEGER_H
-
-#include "postgres_fe.h"
-#define MAXINT64DIGIT 19
-#define MAXINT128DIGIT 38
-#define INT128_INT64_EQ(data) ((data) == (int128)((int64)(data)))
-#define P10_INT64 1000000000000000000LL /* 18 zeroes */
-
-inline int128 get_scale_multiplier(int scale)
-{
- Assert(scale >= 0 && scale <= MAXINT128DIGIT);
- static const int128 values[] = {
- static_cast(1LL),
- static_cast(10LL),
- static_cast(100LL),
- static_cast(1000LL),
- static_cast(10000LL),
- static_cast(100000LL),
- static_cast(1000000LL),
- static_cast(10000000LL),
- static_cast(100000000LL),
- static_cast(1000000000LL),
- static_cast(10000000000LL),
- static_cast(100000000000LL),
- static_cast(1000000000000LL),
- static_cast(10000000000000LL),
- static_cast(100000000000000LL),
- static_cast(1000000000000000LL),
- static_cast(10000000000000000LL),
- static_cast(100000000000000000LL),
- static_cast(1000000000000000000LL),
- static_cast(1000000000000000000LL) * 10LL,
- static_cast(1000000000000000000LL) * 100LL,
- static_cast(1000000000000000000LL) * 1000LL,
- static_cast(1000000000000000000LL) * 10000LL,
- static_cast(1000000000000000000LL) * 100000LL,
- static_cast(1000000000000000000LL) * 1000000LL,
- static_cast(1000000000000000000LL) * 10000000LL,
- static_cast(1000000000000000000LL) * 100000000LL,
- static_cast(1000000000000000000LL) * 1000000000LL,
- static_cast(1000000000000000000LL) * 10000000000LL,
- static_cast(1000000000000000000LL) * 100000000000LL,
- static_cast(1000000000000000000LL) * 1000000000000LL,
- static_cast(1000000000000000000LL) * 10000000000000LL,
- static_cast(1000000000000000000LL) * 100000000000000LL,
- static_cast