summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/view.result6
-rw-r--r--mysql-test/t/view.test10
-rw-r--r--sql/sql_base.cc39
-rw-r--r--sql/sql_view.h7
-rw-r--r--sql/table.h9
5 files changed, 51 insertions, 20 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index 7bade28f395..f2a4648bdc4 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -1047,3 +1047,9 @@ select * from v1;
EXISTS (SELECT 1 UNION SELECT 2)
1
drop view v1;
+create table t1 (col1 int,col2 char(22));
+create view v1 as select * from t1;
+create index i1 on v1 (col1);
+ERROR HY000: 'test.v1' is not BASIC TABLE
+drop view v1;
+drop table t1;
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index c00489c1d1a..d9d9d0ba765 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -987,3 +987,13 @@ SHOW TABLES;
CREATE VIEW v1 AS SELECT EXISTS (SELECT 1 UNION SELECT 2);
select * from v1;
drop view v1;
+
+#
+# using VIEW where table is required
+#
+create table t1 (col1 int,col2 char(22));
+create view v1 as select * from t1;
+-- error 1346
+create index i1 on v1 (col1);
+drop view v1;
+drop table t1;
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 6ff50b32f50..8a8c0ece0a7 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -38,6 +38,7 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
static void free_cache_entry(TABLE *entry);
static void mysql_rm_tmp_tables(void);
static my_bool open_new_frm(const char *path, const char *alias,
+ const char *db, const char *table_name,
uint db_stat, uint prgflag,
uint ha_open_flags, TABLE *outparam,
TABLE_LIST *table_desc, MEM_ROOT *mem_root);
@@ -1379,8 +1380,6 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
{
char path[FN_REFLEN];
int error;
- // we support new format only is have all parameters for it
- uint new_frm_flag= (table_desc && mem_root) ? NO_ERR_ON_NEW_FRM : 0;
uint discover_retry_count= 0;
DBUG_ENTER("open_unireg_entry");
@@ -1388,12 +1387,12 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
while ((error= openfrm(path, alias,
(uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
HA_GET_INDEX | HA_TRY_READ_ONLY |
- new_frm_flag),
+ NO_ERR_ON_NEW_FRM),
READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD,
thd->open_options, entry)) &&
(error != 5 ||
fn_format(path, path, 0, reg_ext, MY_UNPACK_FILENAME),
- open_new_frm(path, alias,
+ open_new_frm(path, alias, db, name,
(uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
HA_GET_INDEX | HA_TRY_READ_ONLY),
READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD,
@@ -1679,6 +1678,8 @@ TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type lock_type)
thd->proc_info="Opening table";
thd->current_tablenr= 0;
+ /* open_ltable can be used only for BASIC TABLEs */
+ table_list->required_type= FRMTYPE_TABLE;
while (!(table= open_table(thd, table_list, 0, &refresh)) && refresh) ;
if (table)
@@ -3209,6 +3210,8 @@ int init_ftfuncs(THD *thd, SELECT_LEX *select_lex, bool no_order)
open_new_frm()
path path to .frm
alias alias for table
+ db database
+ table_name name of table
db_stat open flags (for example HA_OPEN_KEYFILE|HA_OPEN_RNDFILE..)
can be 0 (example in ha_example_table)
prgflag READ_ALL etc..
@@ -3218,7 +3221,9 @@ int init_ftfuncs(THD *thd, SELECT_LEX *select_lex, bool no_order)
mem_root temporary MEM_ROOT for parsing
*/
static my_bool
-open_new_frm(const char *path, const char *alias, uint db_stat, uint prgflag,
+open_new_frm(const char *path, const char *alias,
+ const char *db, const char *table_name,
+ uint db_stat, uint prgflag,
uint ha_open_flags, TABLE *outparam, TABLE_LIST *table_desc,
MEM_ROOT *mem_root)
{
@@ -3226,28 +3231,36 @@ open_new_frm(const char *path, const char *alias, uint db_stat, uint prgflag,
LEX_STRING pathstr;
pathstr.str= (char *)path;
pathstr.length= strlen(path);
+
+ if (!mem_root)
+ mem_root= &current_thd->mem_root;
+
File_parser *parser= sql_parse_prepare(&pathstr, mem_root, 1);
if (parser)
{
if (!strncmp("VIEW", parser->type()->str, parser->type()->length))
{
- if (mysql_make_view(parser, table_desc))
+ if (table_desc == 0 || table_desc->required_type == FRMTYPE_TABLE)
{
- bzero(outparam, sizeof(*outparam)); // do not run repair
- DBUG_RETURN(1);
+ my_error(ER_WRONG_OBJECT, MYF(0), db, table_name, "BASIC TABLE");
+ goto err;
}
+ if (mysql_make_view(parser, table_desc))
+ goto err;
}
else
{
/* only VIEWs are supported now */
my_error(ER_FRM_UNKNOWN_TYPE, MYF(0), path, parser->type()->str);
- bzero(outparam, sizeof(outparam)); // do not run repair
- DBUG_RETURN(1);
+ goto err;
}
}
else
- {
- DBUG_RETURN(1);
- }
+ goto err;
+
DBUG_RETURN(0);
+
+err:
+ bzero(outparam, sizeof(TABLE)); // do not run repair
+ DBUG_RETURN(1);
}
diff --git a/sql/sql_view.h b/sql/sql_view.h
index 36eae6cdcfc..431f82a5bb8 100644
--- a/sql/sql_view.h
+++ b/sql/sql_view.h
@@ -27,13 +27,6 @@ bool check_key_in_view(THD *thd, TABLE_LIST * view);
void insert_view_fields(List<Item> *list, TABLE_LIST *view);
-enum frm_type_enum
-{
- FRMTYPE_ERROR,
- FRMTYPE_TABLE,
- FRMTYPE_VIEW
-};
-
frm_type_enum mysql_frm_type(char *path);
extern TYPELIB sql_updatable_view_key_typelib;
diff --git a/sql/table.h b/sql/table.h
index 75d54d9d069..dd41ab79b7b 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -47,6 +47,13 @@ typedef struct st_grant_info
enum tmp_table_type {NO_TMP_TABLE=0, TMP_TABLE=1, TRANSACTIONAL_TMP_TABLE=2};
+enum frm_type_enum
+{
+ FRMTYPE_ERROR= 0,
+ FRMTYPE_TABLE,
+ FRMTYPE_VIEW
+};
+
typedef struct st_filesort_info
{
IO_CACHE *io_cache; /* If sorted through filebyte */
@@ -241,6 +248,8 @@ typedef struct st_table_list
bool setup_is_done; /* setup_tables() is done */
/* do view contain auto_increment field */
bool contain_auto_increment;
+ /* FRMTYPE_ERROR if any type is acceptable */
+ enum frm_type_enum required_type;
char timestamp_buffer[20]; /* buffer for timestamp (19+1) */
void calc_md5(char *buffer);