Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit 0dd809a

Browse files
Modified catalog. Need to fix tests
1 parent d052644 commit 0dd809a

File tree

8 files changed

+164
-110
lines changed

8 files changed

+164
-110
lines changed

src/catalog/catalog.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#include <include/catalog/column_stats_catalog.h>
1314
#include "catalog/catalog.h"
1415

1516
#include "catalog/column_catalog.h"
@@ -157,6 +158,18 @@ void Catalog::BootstrapSystemCatalogs(storage::Database *database,
157158
CATALOG_SCHEMA_NAME, IndexType::BWTREE, IndexConstraintType::DEFAULT,
158159
false, {TableCatalog::ColumnId::DATABASE_OID}, pool_.get(), txn);
159160

161+
system_catalogs->GetIndexCatalog()->InsertIndex(
162+
COLUMN_STATS_CATALOG_SKEY0_OID, COLUMN_STATS_CATALOG_NAME "_skey0",
163+
COLUMN_STATS_CATALOG_OID, CATALOG_SCHEMA_NAME, IndexType::BWTREE,
164+
IndexConstraintType::UNIQUE, true,
165+
{ColumnStatsCatalog::ColumnId::TABLE_ID,
166+
ColumnStatsCatalog::ColumnId::COLUMN_ID}, pool_.get(), txn);
167+
system_catalogs->GetIndexCatalog()->InsertIndex(
168+
COLUMN_STATS_CATALOG_SKEY1_OID, COLUMN_STATS_CATALOG_NAME "_skey1",
169+
COLUMN_STATS_CATALOG_OID, CATALOG_SCHEMA_NAME, IndexType::BWTREE,
170+
IndexConstraintType::UNIQUE, true,
171+
{ColumnStatsCatalog::ColumnId::TABLE_ID}, pool_.get(), txn);
172+
160173
// Insert records(default + pg_catalog namespace) into pg_namespace
161174
system_catalogs->GetSchemaCatalog()->InsertSchema(
162175
CATALOG_SCHEMA_OID, CATALOG_SCHEMA_NAME, pool_.get(), txn);
@@ -180,6 +193,9 @@ void Catalog::BootstrapSystemCatalogs(storage::Database *database,
180193
system_catalogs->GetTableCatalog()->InsertTable(
181194
COLUMN_CATALOG_OID, COLUMN_CATALOG_NAME, CATALOG_SCHEMA_NAME,
182195
database_oid, pool_.get(), txn);
196+
system_catalogs->GetTableCatalog()->InsertTable(
197+
COLUMN_STATS_CATALOG_OID, COLUMN_STATS_CATALOG_NAME,
198+
CATALOG_SCHEMA_NAME, database_oid, pool_.get(), txn);
183199
}
184200

185201
void Catalog::Bootstrap() {

src/catalog/column_stats_catalog.cpp

Lines changed: 67 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "catalog/column_stats_catalog.h"
1414

1515
#include "catalog/catalog.h"
16+
#include "catalog/schema.h"
1617
#include "executor/logical_tile.h"
1718
#include "optimizer/stats/column_stats_collector.h"
1819
#include "storage/data_table.h"
@@ -21,52 +22,81 @@
2122
namespace peloton {
2223
namespace catalog {
2324

24-
ColumnStatsCatalog *ColumnStatsCatalog::GetInstance(
25-
concurrency::TransactionContext *txn) {
26-
static ColumnStatsCatalog column_stats_catalog{txn};
27-
return &column_stats_catalog;
28-
}
25+
ColumnStatsCatalog::ColumnStatsCatalog(
26+
storage::Database *pg_catalog,
27+
UNUSED_ATTRIBUTE type::AbstractPool *pool,
28+
UNUSED_ATTRIBUTE concurrency::TransactionContext *txn)
29+
: AbstractCatalog(COLUMN_STATS_CATALOG_OID, COLUMN_STATS_CATALOG_NAME,
30+
InitializeSchema().release(), pg_catalog) {
31+
// Add indexes for pg_column_stats
32+
AddIndex({ColumnId::TABLE_ID, ColumnId::COLUMN_ID},
33+
COLUMN_STATS_CATALOG_SKEY0_OID, COLUMN_STATS_CATALOG_NAME "_skey0",
34+
IndexConstraintType::UNIQUE);
35+
AddIndex({ColumnId::TABLE_ID}, COLUMN_STATS_CATALOG_SKEY1_OID,
36+
COLUMN_STATS_CATALOG_NAME "_skey1", IndexConstraintType::DEFAULT);
2937

30-
ColumnStatsCatalog::ColumnStatsCatalog(concurrency::TransactionContext *txn)
31-
: AbstractCatalog("CREATE TABLE " CATALOG_DATABASE_NAME
32-
"." CATALOG_SCHEMA_NAME "." COLUMN_STATS_CATALOG_NAME
33-
" ("
34-
"database_id INT NOT NULL, "
35-
"table_id INT NOT NULL, "
36-
"column_id INT NOT NULL, "
37-
"num_rows INT NOT NULL, "
38-
"cardinality DECIMAL NOT NULL, "
39-
"frac_null DECIMAL NOT NULL, "
40-
"most_common_vals VARCHAR, "
41-
"most_common_freqs VARCHAR, "
42-
"histogram_bounds VARCHAR, "
43-
"column_name VARCHAR, "
44-
"has_index BOOLEAN);",
45-
txn) {
46-
// unique key: (database_id, table_id, column_id)
47-
Catalog::GetInstance()->CreateIndex(
48-
CATALOG_DATABASE_NAME, CATALOG_SCHEMA_NAME, COLUMN_STATS_CATALOG_NAME,
49-
{0, 1, 2}, COLUMN_STATS_CATALOG_NAME "_skey0", true, IndexType::BWTREE,
50-
txn);
51-
// non-unique key: (database_id, table_id)
52-
Catalog::GetInstance()->CreateIndex(
53-
CATALOG_DATABASE_NAME, CATALOG_SCHEMA_NAME, COLUMN_STATS_CATALOG_NAME,
54-
{0, 1}, COLUMN_STATS_CATALOG_NAME "_skey1", false, IndexType::BWTREE,
55-
txn);
5638
}
5739

5840
ColumnStatsCatalog::~ColumnStatsCatalog() {}
5941

42+
std::unique_ptr<catalog::Schema> ColumnStatsCatalog::InitializeSchema() {
43+
44+
const std::string not_null_constraint_name = "notnull";
45+
const auto not_null_constraint = catalog::Constraint(
46+
ConstraintType::NOTNULL, not_null_constraint_name);
47+
48+
auto table_id_column = catalog::Column(
49+
type::TypeId::INTEGER, type::Type::GetTypeSize(type::TypeId::INTEGER),
50+
"table_id", true);
51+
table_id_column.AddConstraint(not_null_constraint);
52+
auto column_id_column = catalog::Column(
53+
type::TypeId::INTEGER, type::Type::GetTypeSize(type::TypeId::INTEGER),
54+
"column_id", true);
55+
column_id_column.AddConstraint(not_null_constraint);
56+
auto num_rows_column = catalog::Column(
57+
type::TypeId::INTEGER, type::Type::GetTypeSize(type::TypeId::INTEGER),
58+
"num_rows", true);
59+
num_rows_column.AddConstraint(not_null_constraint);
60+
auto cardinality_column = catalog::Column(
61+
type::TypeId::DECIMAL, type::Type::GetTypeSize(type::TypeId::DECIMAL),
62+
"cardinality", true);
63+
cardinality_column.AddConstraint(not_null_constraint);
64+
auto frac_null_column = catalog::Column(
65+
type::TypeId::DECIMAL, type::Type::GetTypeSize(type::TypeId::DECIMAL),
66+
"frac_null", true);
67+
frac_null_column.AddConstraint(not_null_constraint);
68+
auto most_common_vals_column = catalog::Column(
69+
type::TypeId::VARCHAR, type::Type::GetTypeSize(type::TypeId::VARCHAR),
70+
"most_common_vals", false);
71+
auto most_common_freqs_column = catalog::Column(
72+
type::TypeId::VARCHAR, type::Type::GetTypeSize(type::TypeId::VARCHAR),
73+
"most_common_freqs", false);
74+
auto histogram_bounds_column = catalog::Column(
75+
type::TypeId::VARCHAR, type::Type::GetTypeSize(type::TypeId::VARCHAR),
76+
"histogram_bounds", false);
77+
auto column_name_column = catalog::Column(
78+
type::TypeId::VARCHAR, type::Type::GetTypeSize(type::TypeId::VARCHAR),
79+
"column_name", false);
80+
auto has_index_column = catalog::Column(
81+
type::TypeId::BOOLEAN, type::Type::GetTypeSize(type::TypeId::BOOLEAN),
82+
"has_index", true);
83+
84+
std::unique_ptr<catalog::Schema> column_stats_schema(new catalog::Schema(
85+
{table_id_column, column_id_column, num_rows_column, cardinality_column,
86+
frac_null_column, most_common_vals_column, most_common_freqs_column,
87+
histogram_bounds_column, column_name_column, has_index_column}));
88+
return column_stats_schema;
89+
}
90+
6091
bool ColumnStatsCatalog::InsertColumnStats(
61-
oid_t database_id, oid_t table_id, oid_t column_id, int num_rows,
92+
oid_t table_id, oid_t column_id, int num_rows,
6293
double cardinality, double frac_null, std::string most_common_vals,
6394
std::string most_common_freqs, std::string histogram_bounds,
6495
std::string column_name, bool has_index, type::AbstractPool *pool,
6596
concurrency::TransactionContext *txn) {
6697
std::unique_ptr<storage::Tuple> tuple(
6798
new storage::Tuple(catalog_table_->GetSchema(), true));
6899

69-
auto val_db_id = type::ValueFactory::GetIntegerValue(database_id);
70100
auto val_table_id = type::ValueFactory::GetIntegerValue(table_id);
71101
auto val_column_id = type::ValueFactory::GetIntegerValue(column_id);
72102
auto val_num_row = type::ValueFactory::GetIntegerValue(num_rows);
@@ -96,7 +126,6 @@ bool ColumnStatsCatalog::InsertColumnStats(
96126
type::ValueFactory::GetVarcharValue(column_name);
97127
type::Value val_has_index = type::ValueFactory::GetBooleanValue(has_index);
98128

99-
tuple->SetValue(ColumnId::DATABASE_ID, val_db_id, nullptr);
100129
tuple->SetValue(ColumnId::TABLE_ID, val_table_id, nullptr);
101130
tuple->SetValue(ColumnId::COLUMN_ID, val_column_id, nullptr);
102131
tuple->SetValue(ColumnId::NUM_ROWS, val_num_row, nullptr);
@@ -113,20 +142,19 @@ bool ColumnStatsCatalog::InsertColumnStats(
113142
}
114143

115144
bool ColumnStatsCatalog::DeleteColumnStats(
116-
oid_t database_id, oid_t table_id, oid_t column_id,
117-
concurrency::TransactionContext *txn) {
145+
oid_t table_id, oid_t column_id,
146+
concurrency::TransactionContext *txn) {
118147
oid_t index_offset = IndexId::SECONDARY_KEY_0; // Secondary key index
119148

120149
std::vector<type::Value> values;
121-
values.push_back(type::ValueFactory::GetIntegerValue(database_id).Copy());
122150
values.push_back(type::ValueFactory::GetIntegerValue(table_id).Copy());
123151
values.push_back(type::ValueFactory::GetIntegerValue(column_id).Copy());
124152

125153
return DeleteWithIndexScan(index_offset, values, txn);
126154
}
127155

128156
std::unique_ptr<std::vector<type::Value>> ColumnStatsCatalog::GetColumnStats(
129-
oid_t database_id, oid_t table_id, oid_t column_id,
157+
oid_t table_id, oid_t column_id,
130158
concurrency::TransactionContext *txn) {
131159
std::vector<oid_t> column_ids(
132160
{ColumnId::NUM_ROWS, ColumnId::CARDINALITY, ColumnId::FRAC_NULL,
@@ -135,7 +163,6 @@ std::unique_ptr<std::vector<type::Value>> ColumnStatsCatalog::GetColumnStats(
135163
oid_t index_offset = IndexId::SECONDARY_KEY_0; // Secondary key index
136164

137165
std::vector<type::Value> values;
138-
values.push_back(type::ValueFactory::GetIntegerValue(database_id).Copy());
139166
values.push_back(type::ValueFactory::GetIntegerValue(table_id).Copy());
140167
values.push_back(type::ValueFactory::GetIntegerValue(column_id).Copy());
141168

@@ -175,7 +202,7 @@ std::unique_ptr<std::vector<type::Value>> ColumnStatsCatalog::GetColumnStats(
175202

176203
// Return value: number of column stats
177204
size_t ColumnStatsCatalog::GetTableStats(
178-
oid_t database_id, oid_t table_id, concurrency::TransactionContext *txn,
205+
oid_t table_id, concurrency::TransactionContext *txn,
179206
std::map<oid_t, std::unique_ptr<std::vector<type::Value>>>
180207
&column_stats_map) {
181208
std::vector<oid_t> column_ids(
@@ -186,7 +213,6 @@ size_t ColumnStatsCatalog::GetTableStats(
186213
oid_t index_offset = IndexId::SECONDARY_KEY_1; // Secondary key index
187214

188215
std::vector<type::Value> values;
189-
values.push_back(type::ValueFactory::GetIntegerValue(database_id).Copy());
190216
values.push_back(type::ValueFactory::GetIntegerValue(table_id).Copy());
191217

192218
auto result_tiles =

src/catalog/system_catalogs.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "catalog/system_catalogs.h"
1414
#include "catalog/column_catalog.h"
15+
#include "catalog/column_stats_catalog.h"
1516
#include "catalog/index_catalog.h"
1617
#include "catalog/table_catalog.h"
1718
#include "storage/data_table.h"
@@ -35,6 +36,7 @@ SystemCatalogs::SystemCatalogs(storage::Database *database,
3536
pg_query_metrics_(nullptr) {
3637
oid_t database_oid = database->GetOid();
3738
pg_attribute_ = new ColumnCatalog(database, pool, txn);
39+
pg_column_stats_ = new ColumnStatsCatalog(database, pool, txn);
3840
pg_namespace_ = new SchemaCatalog(database, pool, txn);
3941
pg_table_ = new TableCatalog(database, pool, txn);
4042
pg_index_ = new IndexCatalog(database, pool, txn);
@@ -45,7 +47,8 @@ SystemCatalogs::SystemCatalogs(storage::Database *database,
4547
{CATALOG_DATABASE_OID, DATABASE_CATALOG_OID},
4648
{database_oid, TABLE_CATALOG_OID},
4749
{database_oid, SCHEMA_CATALOG_OID},
48-
{database_oid, INDEX_CATALOG_OID}};
50+
{database_oid, INDEX_CATALOG_OID},
51+
{database_oid, COLUMN_STATS_CATALOG_OID}};
4952

5053
for (int i = 0; i < (int)shared_tables.size(); i++) {
5154
oid_t column_id = 0;
@@ -68,6 +71,7 @@ SystemCatalogs::~SystemCatalogs() {
6871
delete pg_table_;
6972
delete pg_attribute_;
7073
delete pg_namespace_;
74+
delete pg_column_stats_;
7175
if (pg_trigger_) delete pg_trigger_;
7276
// if (pg_proc) delete pg_proc;
7377
if (pg_table_metrics_) delete pg_table_metrics_;

src/include/catalog/catalog_defaults.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,17 @@ namespace catalog {
2626
#define CATALOG_DATABASE_NAME "peloton"
2727

2828
// Catalog tables
29-
// 5 basic catalog tables
29+
// basic catalog tables
3030
#define DATABASE_CATALOG_NAME "pg_database"
3131
#define SCHEMA_CATALOG_NAME "pg_namespace"
3232
#define TABLE_CATALOG_NAME "pg_table"
3333
#define INDEX_CATALOG_NAME "pg_index"
3434
#define COLUMN_CATALOG_NAME "pg_attribute"
35+
#define COLUMN_STATS_CATALOG_NAME "pg_column_stats"
3536

3637
// Local oids from START_OID = 0 to START_OID + OID_OFFSET are reserved
3738
#define OID_OFFSET 100
38-
#define CATALOG_TABLES_COUNT 8
39+
#define CATALOG_TABLES_COUNT 9
3940

4041
// Oid mask for each type
4142
#define DATABASE_OID_MASK (static_cast<oid_t>(catalog::CatalogType::DATABASE))
@@ -62,6 +63,7 @@ namespace catalog {
6263
#define TABLE_CATALOG_OID (2 | TABLE_OID_MASK)
6364
#define INDEX_CATALOG_OID (3 | TABLE_OID_MASK)
6465
#define COLUMN_CATALOG_OID (4 | TABLE_OID_MASK)
66+
#define COLUMN_STATS_CATALOG_OID (5 | TABLE_OID_MASK)
6567

6668
// Reserved pg_column index oid
6769
#define COLUMN_CATALOG_PKEY_OID (0 | INDEX_OID_MASK)
@@ -86,6 +88,10 @@ namespace catalog {
8688
#define TABLE_CATALOG_SKEY0_OID (11 | INDEX_OID_MASK)
8789
#define TABLE_CATALOG_SKEY1_OID (12 | INDEX_OID_MASK)
8890

91+
// Reserved pg_column_stats index oid
92+
#define COLUMN_STATS_CATALOG_SKEY0_OID (13 | INDEX_OID_MASK)
93+
#define COLUMN_STATS_CATALOG_SKEY1_OID (14 | INDEX_OID_MASK)
94+
8995
// Use upper 8 bits indicating catalog type
9096
#define CATALOG_TYPE_OFFSET 24
9197

0 commit comments

Comments
 (0)