提交 4764eeea authored 作者: Noel Grandin's avatar Noel Grandin

Issue #629: CREATE OR REPLACE VIEW creates incorrect columns names

上级 421b54e4
...@@ -21,6 +21,8 @@ Change Log ...@@ -21,6 +21,8 @@ Change Log
<h2>Next Version (unreleased)</h2> <h2>Next Version (unreleased)</h2>
<ul> <ul>
<li>Issue #632: CREATE OR REPLACE VIEW creates incorrect columns names
</li>
<li>Issue #630: Integer overflow in CacheLRU can cause unrestricted cache growth <li>Issue #630: Integer overflow in CacheLRU can cause unrestricted cache growth
</li> </li>
<li>Issue #497: Fix TO_DATE in cases of 'inline' text. E.g. the "T" and "Z" in to_date('2017-04-21T00:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') <li>Issue #497: Fix TO_DATE in cases of 'inline' text. E.g. the "T" and "Z" in to_date('2017-04-21T00:00:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
......
...@@ -104,10 +104,6 @@ public class CreateView extends SchemaCommand { ...@@ -104,10 +104,6 @@ public class CreateView extends SchemaCommand {
Session sysSession = db.getSystemSession(); Session sysSession = db.getSystemSession();
synchronized (sysSession) { synchronized (sysSession) {
try { try {
if (view == null) {
Schema schema = session.getDatabase().getSchema(
session.getCurrentSchemaName());
sysSession.setCurrentSchema(schema);
Column[] columnTemplates = null; Column[] columnTemplates = null;
if (columnNames != null) { if (columnNames != null) {
columnTemplates = new Column[columnNames.length]; columnTemplates = new Column[columnNames.length];
...@@ -115,10 +111,14 @@ public class CreateView extends SchemaCommand { ...@@ -115,10 +111,14 @@ public class CreateView extends SchemaCommand {
columnTemplates[i] = new Column(columnNames[i], Value.UNKNOWN); columnTemplates[i] = new Column(columnNames[i], Value.UNKNOWN);
} }
} }
if (view == null) {
Schema schema = session.getDatabase().getSchema(
session.getCurrentSchemaName());
sysSession.setCurrentSchema(schema);
view = new TableView(getSchema(), id, viewName, querySQL, null, view = new TableView(getSchema(), id, viewName, querySQL, null,
columnTemplates, sysSession, false, false); columnTemplates, sysSession, false, false);
} else { } else {
view.replace(querySQL, sysSession, false, force, false); view.replace(querySQL, columnTemplates, sysSession, false, force, false);
view.setModified(); view.setModified();
} }
} finally { } finally {
......
...@@ -75,12 +75,12 @@ public class TableView extends Table { ...@@ -75,12 +75,12 @@ public class TableView extends Table {
* @param recursive whether this is a recursive view * @param recursive whether this is a recursive view
* @param force if errors should be ignored * @param force if errors should be ignored
*/ */
public void replace(String querySQL, Session session, public void replace(String querySQL, Column[] newColumnTemplates, Session session,
boolean recursive, boolean force, boolean literalsChecked) { boolean recursive, boolean force, boolean literalsChecked) {
String oldQuerySQL = this.querySQL; String oldQuerySQL = this.querySQL;
Column[] oldColumnTemplates = this.columnTemplates; Column[] oldColumnTemplates = this.columnTemplates;
boolean oldRecursive = this.recursive; boolean oldRecursive = this.recursive;
init(querySQL, null, columnTemplates, session, recursive, literalsChecked); init(querySQL, null, newColumnTemplates == null ? this.columnTemplates : newColumnTemplates, session, recursive, literalsChecked);
DbException e = recompile(session, force, true); DbException e = recompile(session, force, true);
if (e != null) { if (e != null) {
init(oldQuerySQL, null, oldColumnTemplates, session, oldRecursive, literalsChecked); init(oldQuerySQL, null, oldColumnTemplates, session, oldRecursive, literalsChecked);
......
...@@ -79,6 +79,7 @@ public class TestScript extends TestBase { ...@@ -79,6 +79,7 @@ public class TestScript extends TestBase {
reconnectOften = !config.memory && config.big; reconnectOften = !config.memory && config.big;
testScript("testScript.sql"); testScript("testScript.sql");
testScript("commands-dml-script.sql"); testScript("commands-dml-script.sql");
testScript("commands-dml-create-view.sql");
for (String s : new String[] { "array", "bigint", "binary", "blob", for (String s : new String[] { "array", "bigint", "binary", "blob",
"boolean", "char", "clob", "date", "decimal", "double", "enum", "boolean", "char", "clob", "date", "decimal", "double", "enum",
"geometry", "identity", "int", "other", "real", "smallint", "geometry", "identity", "int", "other", "real", "smallint",
......
create memory table test(id int primary key, name varchar(255));
> ok
INSERT INTO TEST VALUES(2, STRINGDECODE('abcsond\344rzeich\344 ') || char(22222) || STRINGDECODE(' \366\344\374\326\304\334\351\350\340\361!'));
> update count: 1
script nopasswords nosettings;
> SCRIPT
> -------------------------------------------------------------------------------------------------------------------------------------------------------------
> -- 1 +/- SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, NAME VARCHAR(255) );
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> INSERT INTO PUBLIC.TEST(ID, NAME) VALUES (2, STRINGDECODE('abcsond\u00e4rzeich\u00e4 \u56ce \u00f6\u00e4\u00fc\u00d6\u00c4\u00dc\u00e9\u00e8\u00e0\u00f1!'));
> rows: 5
create memory table test(id int primary key, name varchar(255)); CREATE VIEW TEST_VIEW(A) AS SELECT 'a';
> ok > ok
INSERT INTO TEST VALUES(2, STRINGDECODE('abcsond\344rzeich\344 ') || char(22222) || STRINGDECODE(' \366\344\374\326\304\334\351\350\340\361!')); CREATE OR REPLACE VIEW TEST_VIEW(B, C) AS SELECT 'b', 'c';
> update count: 1 > ok
script nopasswords nosettings; SELECT * FROM TEST_VIEW;
> SCRIPT > B C
> ------------------------------------------------------------------------------------------------------------------------------------------------------------- > - -
> -- 1 +/- SELECT COUNT(*) FROM PUBLIC.TEST; > b c
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID); > rows: 1
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, NAME VARCHAR(255) );
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> INSERT INTO PUBLIC.TEST(ID, NAME) VALUES (2, STRINGDECODE('abcsond\u00e4rzeich\u00e4 \u56ce \u00f6\u00e4\u00fc\u00d6\u00c4\u00dc\u00e9\u00e8\u00e0\u00f1!'));
> rows: 5
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论