Changeset: c8295f0f5f82 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c8295f0f5f82
Modified Files:
sql/include/sql_catalog.h
sql/server/rel_schema.c
sql/server/sql_mvc.c
sql/server/sql_mvc.h
sql/storage/sql_storage.h
sql/storage/store.c
Branch: arrays
Log Message:
min, max, step made char* and treated similar to default value in columns
_dimensions table created and updated in catalog
diffs (truncated from 668 to 300 lines):
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -452,16 +452,10 @@ typedef struct sql_column {
void *data;
} sql_column;
-//dimension needs atom. Since is stores pointers to atom there is no
-//need to find the type. The important is to know that there is a
-//type atom
-typedef struct atom atom;
-
typedef struct sql_dimension {
sql_base base;
sql_subtype type;
int dimnr; //the order of the dimension
- char *def; //I think this is for default values
char *storage_type;
size_t dcount; /* what does it do? */
@@ -473,13 +467,14 @@ typedef struct sql_dimension {
//the exact type is found through the type field of the struct
//Niels said to use atom. In this case do I need the information about
the type?
//maybe I need to to check that the values when inserting a new cell
are of the correct type
- atom *min;
- atom *step;
- atom *max;
-
+ char *min;
+ char *step;
+ char *max;
+ char *def; //default value
+
lng lvl1_repeatsNum; //number of times each value of the dimension is
repeated before being increased
lng lvl2_repeatsNum; //number of times all values of the dimension are
repeated as a group (including the duplicated values defined by repeatNum)
- lng elementsNum; //the distinct number of elements in this dimension,
i.e. the nu,ber of indices
+ lng elementsNum; //the distinct number of elements in this dimension,
i.e. the number of indices
struct sql_table *t;
// void *data; //it does not have data since it is not materialised
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -433,6 +433,117 @@ column_options(mvc *sql, dlist *opt_list
return SQL_OK;
}
+static int dimension_range(mvc *sql, symbol *range, sql_dimension* dim) {
+ char *err = NULL;
+ char *r = NULL;
+
+ switch(dlist_length(range->data.lval)) {
+ case 0:
+ dim->unbounded_min = 1;
+ dim->unbounded_max = 1;
+
+ dim->min = NULL;
+ dim->step = NULL;
+ dim->max = NULL;
+ break;
+ case 1: {
+ char *min = "0";
+ char *step = "1";
+ dim->min = min;
+ dim->step = step;
+ r = symbol2string(sql, range->data.lval->h->data.sym, &err);
+ if (!r) {
+ (void) sql_error(sql, 02, "42000!incorrect max value
'%s'\n", err?err:"");
+ if (err) _DELETE(err);
+ return SQL_ERR;
+ } else {
+ int m = atoi(r) - 1;
+ sprintf(r, "%d", m);
+ dim->max = r;
+ }
+ break;
+ }
+ case 2:
+ dim->unbounded_max = 1;
+ r = symbol2string(sql, range->data.lval->h->data.sym, &err);
+ if (!r) {
+ (void) sql_error(sql, 02, "42000!incorrect min value
'%s'\n", err?err:"");
+ if (err) _DELETE(err);
+ return SQL_ERR;
+ } else
+ dim->min = r;
+ r = symbol2string(sql, range->data.lval->h->next->data.sym,
&err);
+ if (!r) {
+ (void) sql_error(sql, 02, "42000!incorrect step value
'%s'\n", err?err:"");
+ if (err) _DELETE(err);
+ return SQL_ERR;
+ } else
+ dim->step = r;
+ dim->max = NULL;
+ break;
+ case 3:
+ r = symbol2string(sql, range->data.lval->h->data.sym, &err);
+ if (!r) {
+ (void) sql_error(sql, 02, "42000!incorrect min value
'%s'\n", err?err:"");
+ if (err) _DELETE(err);
+ return SQL_ERR;
+ } else
+ dim->min = r;
+ r = symbol2string(sql, range->data.lval->h->next->data.sym,
&err);
+ if (!r) {
+ (void) sql_error(sql, 02, "42000!incorrect step value
'%s'\n", err?err:"");
+ if (err) _DELETE(err);
+ return SQL_ERR;
+ } else
+ dim->step = r;
+ r = symbol2string(sql, range->data.lval->h->next->next->data.sym,
&err);
+ if (!r) {
+ (void) sql_error(sql, 02, "42000!incorrect max value
'%s'\n", err?err:"");
+ if (err) _DELETE(err);
+ return SQL_ERR;
+ } else
+ dim->max = r;
+ break;
+ }
+#if 0
+ if(!dim->unbounded_min && !dim->unbounded_max) {
+ switch(dim->type->localtype) {
+ case TYPE_bte:
+ dim->elementsNum = floor((dim->max->data.val.btval -
dim->min->data.val.btval )/ dim->step->data.val.btval)+1;
+ break;
+ case TYPE_sht:
+ dim->elementsNum = floor((dim->max->data.val.shval -
dim->min->data.val.shval )/ dim->step->data.val.shval)+1;
+ break;
+ case TYPE_int:
+ dim->elementsNum = floor((dim->max->data.val.ival -
dim->min->data.val.ival )/ dim->step->data.val.ival)+1;
+ break;
+ case TYPE_wrd:
+ dim->elementsNum = floor((dim->max->data.val.wval -
dim->min->data.val.wval )/ dim->step->data.val.wval)+1;
+ break;
+ case TYPE_oid:
+ dim->elementsNum = floor((dim->max->data.val.oval -
dim->min->data.val.oval )/ dim->step->data.val.oval)+1;
+ break;
+ case TYPE_lng:
+ dim->elementsNum = floor((dim->max->data.val.lval -
dim->min->data.val.lval )/ dim->step->data.val.lval)+1;
+ break;
+ case TYPE_dbl:
+ dim->elementsNum = floor((dim->max->data.val.dval -
dim->min->data.val.dval )/ dim->step->data.val.dval)+1;
+ break;
+ case TYPE_flt:
+ dim->elementsNum = floor((dim->max->data.val.fval -
dim->min->data.val.fval )/ dim->step->data.val.fval)+1;
+ break;
+ default:
+ fprintf(stderr, "Dimension of unknown type");
+ return NULL;
+ }
+ }
+ else
+ dim->elementsNum = 0; //unbounded does not have elements. It should be
checked and updated at each insertion
+#endif
+ return SQL_OK;
+}
+
+
static int
table_foreign_key(mvc *sql, char *name, symbol *s, sql_schema *ss, sql_table
*t)
{
@@ -574,7 +685,6 @@ create_dimension(mvc *sql, symbol *s, sq
char *dname = l->h->data.sval;
sql_subtype *dtype = &l->h->next->data.typeval;
symbol *ranges_sym = l->h->next->next->data.sym;
- list *range = sa_list(sql->sa);
(void)ss;
@@ -582,7 +692,6 @@ create_dimension(mvc *sql, symbol *s, sq
if (dname && dtype) {
sql_dimension *dim = NULL;
- dnode *range_value = NULL;
dim = find_sql_dimension(t, dname); //check whether the name
has already been used
if (dim) {
@@ -598,20 +707,9 @@ create_dimension(mvc *sql, symbol *s, sq
}
}
- for(range_value = ranges_sym->data.lval->h ; range_value ;
range_value = range_value->next) {
- atom *val = NULL;
-
- assert(range_value->data.sym->token == SQL_COLUMN);
- val = sql_bind_arg(sql,
range_value->data.sym->data.lval->h->data.i_val);
+ dim = mvc_create_dimension(sql, t, dname, dtype);
- //check whether the type of the value for the range is
compatible with the type of the dimension
- //I do not do any casting here, just making sure that
the types are compatible
- if(!rel_check_type(sql, dtype, exp_atom(sql->sa, val),
type_cast))
- return SQL_ERR;
- list_append(range, val);
- }
-
- dim = mvc_create_dimension(sql, t, dname, dtype, range);
+ dimension_range(sql, l->h->next->next->data.sym, dim);
}
return SQL_OK;
}
@@ -926,7 +1024,7 @@ sql_rel* rel_create_array(mvc *sql, sql_
}
//compute the repeats of the dimensional columns
- compute_repeats(sql, t);
+ //compute_repeats(sql, t);
temp = (tt == tt_array)?temp:SQL_PERSIST;
return rel_table(sql, DDL_CREATE_TABLE, sname, t, temp); //the
array does not differ from a table at least until this point
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -1065,13 +1065,13 @@ mvc_drop_column(mvc *m, sql_table *t, sq
}
sql_dimension *
-mvc_create_dimension(mvc *m, sql_table *t, const char *name, sql_subtype *tpe,
list* dimensionRange)
+mvc_create_dimension(mvc *m, sql_table *t, const char *name, sql_subtype *tpe)
{
if (mvc_debug)
fprintf(stderr, "#mvc_create_dimension %s %s %s\n",
t->base.name, name, tpe->type->sqlname);
if (isDeclaredArray(t) && (!t->s || strcmp(t->s->base.name,
dt_schema))) {
/* declared arrays should not end up in the catalog */
- return create_sql_dimension(m->sa, t, name, tpe,
dimensionRange);
+ return create_sql_dimension(m->sa, t, name, tpe);
}
else
fprintf(stderr, "sql/server/sql_mvc.c:1076 : I do not have an
implementation for this case\n");
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -185,7 +185,7 @@ extern sql_table *mvc_create_view(mvc *c
extern sql_table *mvc_create_remote(mvc *c, sql_schema *s, const char *name,
int persistence, const char *loc);
extern void mvc_drop_column(mvc *c, sql_table *t, sql_column *col, int
drop_action);
-extern sql_dimension *mvc_create_dimension(mvc *c, sql_table *t, const char
*name, sql_subtype *type, list* dimensionRange);
+extern sql_dimension *mvc_create_dimension(mvc *c, sql_table *t, const char
*name, sql_subtype *type);
extern sql_column *mvc_create_column(mvc *c, sql_table *t, const char *name,
sql_subtype *type);
extern sql_column *mvc_create_column_(mvc *c, sql_table *t, const char *name,
const char *type, int digits);
extern sql_column *mvc_null(mvc *c, sql_column *col, int flag);
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -122,6 +122,7 @@ typedef int (*prop_col_fptr) (sql_trans
-- create the necessary storage resources for columns, indices, arrays, and
tables
-- returns LOG_OK, LOG_ERR
*/
+//typedef int (*create_dim_fptr) (sql_trans *tr, sql_dimensin *dim);
typedef int (*create_col_fptr) (sql_trans *tr, sql_column *c);
typedef int (*create_idx_fptr) (sql_trans *tr, sql_idx *i);
typedef int (*create_del_fptr) (sql_trans *tr, sql_table *t);
@@ -196,6 +197,7 @@ typedef struct store_functions {
prop_col_fptr double_elim_col; /* varsize col with double elimination */
create_col_fptr create_col;
+// create_dim_fptr create_dim;
create_idx_fptr create_idx;
create_del_fptr create_del;
@@ -213,6 +215,7 @@ typedef struct store_functions {
/* functions for logging */
create_col_fptr log_create_col;
+// create_dim_fptr log_create_dim;
create_idx_fptr log_create_idx;
create_del_fptr log_create_del;
@@ -222,6 +225,7 @@ typedef struct store_functions {
/* functions for snapshots */
create_col_fptr snapshot_create_col;
+// create_dim_fptr snapshot_create_dim;
create_idx_fptr snapshot_create_idx;
create_del_fptr snapshot_create_del;
@@ -379,7 +383,7 @@ extern int sql_trans_disconnect_catalog_
extern sql_table *create_sql_table(sql_allocator *sa, const char *name, sht
type, bit system, int persistence, int commit_action);
extern sql_column *create_sql_column(sql_allocator *sa, sql_table *t, const
char *name, sql_subtype *tpe);
-extern sql_dimension *create_sql_dimension(sql_allocator *sa, sql_table *t,
const char *name, sql_subtype *tpe, list *range);
+extern sql_dimension *create_sql_dimension(sql_allocator *sa, sql_table *t,
const char *name, sql_subtype *tpe);
extern sql_ukey *create_sql_ukey(sql_allocator *sa, sql_table *t, const char
*nme, key_type kt);
extern sql_fkey *create_sql_fkey(sql_allocator *sa, sql_table *t, const char
*nme, key_type kt, sql_key *rkey, int on_delete, int on_update );
extern sql_key *create_sql_kc(sql_allocator *sa, sql_key *k, sql_column *c);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -524,6 +524,84 @@ load_column(sql_trans *tr, sql_table *t,
fprintf(stderr, "#\t\tload column %s\n", c->base.name);
return c;
}
+/*
+static sql_dimension *
+load_dimension(sql_trans *tr, sql_table *t, oid rid)
+{
+ void *v;
+ char *def, *tpe, *st, *min, *step, *max;
+ int sz, d;
+ sql_dimension *dim = SA_ZNEW(tr->sa, sql_dimension);
+ sql_schema *syss = find_sql_schema(tr, "sys");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list