Commit d2b05129 authored by monty@donna.mysql.fi's avatar monty@donna.mysql.fi
Browse files

Merge work:/my/mysql into donna.mysql.fi:/home/my/bk/mysql

parents e829e96d 0ba8d3ef
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -170,6 +170,14 @@ row_table_got_default_clust_index(
/*==============================*/
	dict_table_t*	table);
/*************************************************************************
Calculates the key number used inside MySQL for an Innobase index. We have
to take into account if we generated a default clustered index for the table */

ulint
row_get_mysql_key_number_for_index(
/*===============================*/
	dict_index_t*	index);
/*************************************************************************
Does an update or delete of a row for MySQL. */

int
+3 −0
Original line number Diff line number Diff line
@@ -307,6 +307,9 @@ struct trx_struct{
	/*------------------------------*/
	ulint		error_state;	/* 0 if no error, otherwise error
					number */
	void*		error_info;	/* if the error number indicates a
					duplicate key error, a pointer to
					the problematic index is stored here */
	sess_t*		sess;		/* session of the trx, NULL if none */
 	ulint		que_state;	/* TRX_QUE_RUNNING, TRX_QUE_LOCK_WAIT,
					... */
+4 −1
Original line number Diff line number Diff line
@@ -407,6 +407,7 @@ row_ins_scan_sec_index_for_duplicate(
	ut_a(dupl_count >= 1);

	if (dupl_count > 1) {
		trx->error_info = index;

		return(DB_DUPLICATE_KEY);
	}
@@ -468,6 +469,7 @@ row_ins_duplicate_error(
			if (row_ins_dupl_error_with_rec(rec, entry,
							cursor->index, trx)) {
				*dupl_rec = rec;
				trx->error_info = cursor->index;
				
				return(DB_DUPLICATE_KEY);
			}
@@ -484,6 +486,7 @@ row_ins_duplicate_error(
			if (row_ins_dupl_error_with_rec(rec, entry,
							cursor->index, trx)) {
				*dupl_rec = rec;
				trx->error_info = cursor->index;

				return(DB_DUPLICATE_KEY);
			}
+30 −0
Original line number Diff line number Diff line
@@ -761,6 +761,36 @@ row_table_got_default_clust_index(
	return(FALSE);
}

/*************************************************************************
Calculates the key number used inside MySQL for an Innobase index. We have
to take into account if we generated a default clustered index for the table */

ulint
row_get_mysql_key_number_for_index(
/*===============================*/
	dict_index_t*	index)
{
	dict_index_t*	ind;
	ulint		i;

	ut_a(index);

	i = 0;
	ind = dict_table_get_first_index(index->table);

	while (index != ind) {
		ind = dict_table_get_next_index(ind);
		i++;
	}

	if (row_table_got_default_clust_index(index->table)) {
		ut_a(i > 0);
		i--;
	}

	return(i);
}

/*************************************************************************
Does a table creation operation for MySQL. */

+15 −17
Original line number Diff line number Diff line
@@ -18,12 +18,6 @@
Innobase */

/* TODO list for the Innobase handler:
  - How to check for deadlocks if Innobase tables are used alongside
    other MySQL table types? Solution: we will use a timeout.
  - Innobase currently includes the path to a table name: the path should
    actually be dropped off, because we may move a whole database to a new
    directory.
  - Add a deadlock error message to MySQL.
  - Ask Monty if strings of different languages can exist in the same
    database. Answer: in near future yes, but not yet.
*/
@@ -415,10 +409,10 @@ innobase_init(void)
/*===============*/
			/* out: TRUE if error */
{
	static char 	current_dir[3];
	int		err;
	bool		ret;
	ibool	test_bool;
	static  char current_dir[3];

  	DBUG_ENTER("innobase_init");

	/* Use current_dir if no paths are set */
@@ -1660,7 +1654,7 @@ ha_innobase::change_active_index(

  	statistic_increment(ha_read_key_count, &LOCK_status);

  	DBUG_ENTER("ha_innobase::change_active_index");
  	DBUG_ENTER("index_read_idx");

	active_index = keynr;

@@ -1686,7 +1680,7 @@ ha_innobase::change_active_index(

	build_template(prebuilt, user_thd, table, ROW_MYSQL_WHOLE_ROW);

	DBUG_RETURN(0);
	return(0);
}

/**************************************************************************
@@ -2220,7 +2214,6 @@ ha_innobase::create(
{
	int		error;
	dict_table_t*	innobase_table;
	uint		name_len;
	trx_t*		trx;
	int		primary_key_no	= -1;
	KEY*		key;
@@ -2238,7 +2231,7 @@ ha_innobase::create(

  	/* Create the table definition in Innobase */

  	if ((error = create_table_def(trx, form, norm_name))) {
  	if (error = create_table_def(trx, form, norm_name)) {

		trx_commit_for_mysql(trx);

@@ -2257,6 +2250,11 @@ ha_innobase::create(
    		}
	}

	/* Our function row_get_mysql_key_number_for_index assumes
	the primary key is always number 0, if it exists */

	assert(primary_key_no == -1 || primary_key_no == 0);

	/* Create the keys */

	if (form->keys == 0 || primary_key_no == -1) {
@@ -2570,9 +2568,9 @@ ha_innobase::info(
	}

  	if (flag & HA_STATUS_ERRKEY) {

		errkey = (unsigned int)-1; /* TODO: get the key number from
                                           Innobase */
		errkey = (unsigned int) row_get_mysql_key_number_for_index(
						(dict_index_t*)
						prebuilt->trx->error_info);
  	}

  	DBUG_VOID_RETURN;