diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistProcesserData.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistProcesserData.java index 7c30d9ef16807c9cebc1c5ae3198bb35b331d102..66390aae986609c6ab430a1c34373b9748371b2f 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistProcesserData.java +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistProcesserData.java @@ -133,6 +133,7 @@ public class ContentAssistProcesserData implements ISQLContentAssistProcessor { } else if (servObj instanceof TableMetaData) { TableMetaData tbl = (TableMetaData) servObj; found.putAll(tbl.findAllChildObjects()); + found = contentAssistUtil.getChildObjectSelect(found, parentObjMap.size() > 1); } else if (servObj instanceof ViewMetaData) { ViewMetaData view = ViewMetaData.class.cast(servObj); found.putAll(view.findAllChildObjects()); diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtil.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtil.java index d09e2e4dd75f08cfb71ccc7235afe3e5b1172dfe..ff7f3a27c2037a4473e97fd5c2283910b514a821 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtil.java +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtil.java @@ -23,8 +23,12 @@ import java.util.TreeMap; import org.apache.commons.collections4.trie.PatriciaTrie; +import org.opengauss.mppdbide.bl.serverdatacache.OBJECTTYPE; import org.opengauss.mppdbide.bl.serverdatacache.ServerObject; +import org.opengauss.mppdbide.bl.serverdatacache.TableMetaData; +import org.opengauss.mppdbide.bl.serverdatacache.groups.ColumnAll; import org.opengauss.mppdbide.bl.util.BLUtils; +import org.opengauss.mppdbide.bl.util.OpUtils; import org.opengauss.mppdbide.utils.MPPDBIDEConstants; /** @@ -42,6 +46,7 @@ public abstract class ContentAssistUtil implements ContentAssistUtilIf { private static final char CLOSING_BRACE = ')'; private static final char SEMI_COLON = ';'; private static final String COMMA = ","; + private static final String OPENING_PERIOD = "."; private int minPosition = 0; /** @@ -66,9 +71,19 @@ public abstract class ContentAssistUtil implements ContentAssistUtilIf { SortedMap resultMap = new TreeMap(); for (ServerObject obj : serverObjMap.values()) { if (obj.getSearchName().toLowerCase(Locale.ENGLISH).startsWith(prefix.toLowerCase(Locale.ENGLISH))) { - resultMap.put(obj.getSearchName(), obj); + if (obj instanceof TableMetaData && OpUtils.getFrom()) { + StringBuffer tableName = new StringBuffer(); + tableName.append(obj.getNamespace().getName()); + tableName.append(OPENING_PERIOD); + tableName.append(obj.getName()); + ColumnAll ocb = new ColumnAll(1,tableName.toString(),OBJECTTYPE.TABLEMETADATA, false); + resultMap.put(obj.getSearchName(), ocb); + } else { + resultMap.put(obj.getSearchName(), obj); + } } } + OpUtils.setFrom(false); return (SortedMap) resultMap; } diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilDefault.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilDefault.java index 914d0e6fd29f6514019133b247baa44936b23a12..0ab6f35cd78548892bb84915e415b109be79608f 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilDefault.java +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilDefault.java @@ -258,6 +258,12 @@ public class ContentAssistUtilDefault extends ContentAssistUtil { return defaultMap; } + @Override + public SortedMap getChildObjectSelect(SortedMap found, + boolean isParentDescNeeded) { + return defaultMap; + } + @Override public SortedMap findMatchingTriggerObject(String prefix) { return defaultMap; @@ -278,4 +284,17 @@ public class ContentAssistUtilDefault extends ContentAssistUtil { return defaultMap; } + + @Override + public void saveAllColumn(ServerObject object, int start, int len, StringBuffer columnName, + SortedMap resultMap, boolean isParentDescNeeded) { + // TODO Auto-generated method stub + } + + @Override + public void saveAliasColumn(ServerObject object, int start, int len, StringBuffer columnName, + SortedMap resultMap, boolean isParentDescNeeded) { + // TODO Auto-generated method stub + } + } diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilIf.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilIf.java index b5801101ee846a0d033a841294717996ac0e21d2..e895877b0e8dd0e232279d0418ce17955e56d770 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilIf.java +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilIf.java @@ -195,6 +195,15 @@ public interface ContentAssistUtilIf { */ SortedMap getChildObject(SortedMap found, boolean isParentDescNeeded); + /** + * Gets the child select object. + * + * @param found the found + * @param isParentDescNeeded the is parent desc needed + * @return the child object + */ + SortedMap getChildObjectSelect(SortedMap found, boolean isParentDescNeeded); + /** * Find matching trigger object. * @@ -230,4 +239,28 @@ public interface ContentAssistUtilIf { default SortedMap findExactMatchingSynonyms(String prefix) { return null; } + + /** + * all column if is insert. + * + * @param object the ServerObject + * @param start the start + * @param len the len + * @param columnName the column name + * @param resultMap the sorted map + * @param isParentDescNeeded the parent pesc needed + */ + void saveAllColumn(ServerObject object, int start, int len, StringBuffer columnName, SortedMap resultMap, boolean isParentDescNeeded); + + /** + * all column if is insert. + * + * @param object the ServerObject + * @param start the start + * @param len the len + * @param columnName the column name + * @param resultMap the sorted map + * @param isParentDescNeeded the parent pesc needed + */ + void saveAliasColumn(ServerObject object, int start, int len, StringBuffer columnName, SortedMap resultMap, boolean isParentDescNeeded); } diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilOLAP.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilOLAP.java index 01a9735ace52b4a525473c385dcecef6ae62bf95..1efc9207d67a9105981447e9fb0bc0a696888643 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilOLAP.java +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/contentassist/ContentAssistUtilOLAP.java @@ -23,9 +23,12 @@ import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; +import org.opengauss.mppdbide.bl.serverdatacache.groups.ColumnAll; +import org.opengauss.mppdbide.bl.util.OpUtils; import org.opengauss.mppdbide.bl.serverdatacache.ColumnMetaData; import org.opengauss.mppdbide.bl.serverdatacache.Database; import org.opengauss.mppdbide.bl.serverdatacache.DebugObjects; +import org.opengauss.mppdbide.bl.serverdatacache.OBJECTTYPE; import org.opengauss.mppdbide.bl.serverdatacache.SequenceMetadata; import org.opengauss.mppdbide.bl.serverdatacache.ServerObject; import org.opengauss.mppdbide.bl.serverdatacache.SynonymMetaData; @@ -52,6 +55,8 @@ public class ContentAssistUtilOLAP extends ContentAssistUtil { private static final char ESCAPE_CHAR = '\"'; + private static final String COMMA = ", "; + private static final char NEW_LINE_CHAR = MPPDBIDEConstants.LINE_SEPARATOR.length() > 1 ? MPPDBIDEConstants.LINE_SEPARATOR.charAt(1) : MPPDBIDEConstants.LINE_SEPARATOR.charAt(0); @@ -528,18 +533,93 @@ public class ContentAssistUtilOLAP extends ContentAssistUtil { public SortedMap getChildObject(SortedMap found, boolean isParentDescNeeded) { SortedMap resultMap = new TreeMap(); + int len = found.size(); + if (isInsert()) { + len = len - 1; + } + StringBuffer columnName = new StringBuffer(); + int temp = 0; for (ServerObject obj : found.values()) { if (obj instanceof ColumnMetaData) { - ColumnMetaData clm = (ColumnMetaData) obj; + saveAllColumn(obj, temp, len, columnName, resultMap, isParentDescNeeded); + temp++; + } else if (obj instanceof ViewColumnMetaData) { + ViewColumnMetaData clm = (ViewColumnMetaData) obj; resultMap.put(clm.getClmNameWithDatatype(isParentDescNeeded), obj); + } + } + return resultMap; + } + + @Override + public void saveAllColumn(ServerObject object, int start, int len, StringBuffer columnName, + SortedMap resultMap, boolean isParentDescNeeded) { + ColumnMetaData clm = (ColumnMetaData) object; + resultMap.put(clm.getClmNameWithDatatype(isParentDescNeeded), object); + if (start < len) { + columnName.append(((ColumnMetaData) object).getParentTable().getColumnMetaDataList().get(start).getName()); + if (start < len - 1) { + columnName.append(COMMA); + } else { + ColumnAll columnAll = new ColumnAll(start, columnName.toString(), OBJECTTYPE.COLUMN_METADATA, false); + resultMap.put(clm.getClms(), columnAll); + } + start++; + } + } + + @Override + public SortedMap getChildObjectSelect(SortedMap found, + boolean isParentDescNeeded) { + SortedMap resultMap = new TreeMap(); + int len = found.size(); + StringBuffer columnName = new StringBuffer(); + int temp = 0; + for (ServerObject obj : found.values()) { + if (obj instanceof ColumnMetaData) { + saveAliasColumn(obj, temp, len, columnName, resultMap, isParentDescNeeded); + temp++; } else if (obj instanceof ViewColumnMetaData) { ViewColumnMetaData clm = (ViewColumnMetaData) obj; resultMap.put(clm.getClmNameWithDatatype(isParentDescNeeded), obj); } } + OpUtils.getMap().clear(); return resultMap; } + @Override + public void saveAliasColumn(ServerObject object, int start, int len, StringBuffer columnName, + SortedMap resultMap, boolean isParentDescNeeded) { + ColumnMetaData clm = (ColumnMetaData) object; + resultMap.put(clm.getClmNameWithDatatype(isParentDescNeeded), object); + if (start < len) { + columnName.append(((ColumnMetaData) object).getParentTable().getColumnMetaDataList().get(start).getName()); + if (start < len - 1) { + columnName.append(COMMA); + String key = null; + if (!OpUtils.getMap().isEmpty()) { + for (Entry> entry : OpUtils.getMap().entrySet()) { + if ((entry.getValue().contains((((ColumnMetaData) object).getParentTable().getName())) + || entry.getValue().contains((((ColumnMetaData) object).getParentTable().getNameSpaceName() + + DOT + (((ColumnMetaData) object).getParentTable().getName())))) + && entry.getKey().equals(OpUtils.getPre().substring(0, OpUtils.getPre().length() - 1))) { + key = entry.getKey(); + } + } + columnName.append(key); + } else { + columnName.append(((ColumnMetaData) object).getParentTable().getName()); + } + columnName.append(DOT); + } else { + ColumnAll ocb = new ColumnAll(start, columnName.toString(), OBJECTTYPE.COLUMN_METADATA, false); + resultMap.put(clm.getClms(), ocb); + } + start++; + } + } + /** * Find matching trigger object. * @@ -562,4 +642,4 @@ public class ContentAssistUtilOLAP extends ContentAssistUtil { return new TreeMap(); } -} +} \ No newline at end of file diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/ColumnMetaData.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/ColumnMetaData.java index c9689710c677793ac8568b4a265c24273ed79817..e60474313feffaae24c7c2c21055cb465a0156c4 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/ColumnMetaData.java +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/ColumnMetaData.java @@ -66,6 +66,8 @@ public class ColumnMetaData extends BatchDropServerObject implements GaussOLAPDB private String colDescription; + private static final String OCP = "all"; + /** * Gets the col description. * @@ -894,6 +896,17 @@ public class ColumnMetaData extends BatchDropServerObject implements GaussOLAPDB return commentQry.toString(); } + + /** + * Gets the String. + * + * @param + * @return the string all + */ + public String getClms() { + return OCP; + } + /** * Gets the clm name with datatype. * diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/ServerObject.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/ServerObject.java index e84fcfe7ef039f75127d18196dbfb665314ef068..faf774e87c2ad9aa59a8cfb363f1bf59d4bb8234 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/ServerObject.java +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/ServerObject.java @@ -34,6 +34,7 @@ public abstract class ServerObject { private String name; private OBJECTTYPE type; private boolean isValid = true; + private static final String isObjectName = "^([a-z_][a-z|0-9|_|$]*)|([a-z_][a-z|0-9|_|,| |.|$]*)$"; /** * The is loaded. @@ -344,7 +345,7 @@ public abstract class ServerObject { * @return true, if is qualified simple object name */ public static boolean isQualifiedSimpleObjectName(String objectName) { - if (null != objectName && !objectName.isEmpty() && objectName.matches("^[a-z_][a-z|0-9|_|$]*$")) { + if (null != objectName && !objectName.isEmpty() && objectName.matches(isObjectName)) { return true; } diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/groups/ColumnAll.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/groups/ColumnAll.java new file mode 100644 index 0000000000000000000000000000000000000000..088d3ddf13108dc96831dcc5666b57d6bf86654a --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/serverdatacache/groups/ColumnAll.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2022 Huawei Technologies Co.,Ltd. + * + * openGauss is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * + * http://license.coscl.org.cn/MulanPSL2 + * + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.opengauss.mppdbide.bl.serverdatacache.groups; + +import org.opengauss.mppdbide.bl.serverdatacache.OBJECTTYPE; +import org.opengauss.mppdbide.bl.serverdatacache.ServerObject; + +/** + * + * Title: ColumnAll + * + * Description: Get all the current columns from the table and store them + * + */ +public class ColumnAll extends ServerObject { + private int id; + private String name; + + /** + * Instantiates a new ColumnsAll object. + * + * @param oid the oid + * @param name the name + * @param type the type + * @param isPrivilegeFlag is the privilege flag + */ + public ColumnAll(long oid, String name, OBJECTTYPE type, boolean isPrivilegeFlag) { + super(oid, name, type, false); + this.name = name; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setId(int id) { + this.id = id; + } + + public int getId() { + return id; + } +} \ No newline at end of file diff --git a/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/util/OpUtils.java b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/util/OpUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..027a27a965362d9b927e614fa225c62b250c78da --- /dev/null +++ b/code/datastudio/src/org.opengauss.mppdbide.bl/src/org/opengauss/mppdbide/bl/util/OpUtils.java @@ -0,0 +1,46 @@ +package org.opengauss.mppdbide.bl.util; + +import java.util.HashMap; +import java.util.List; + +/** + * + * Title: class + * + * Description: The Class OpUtils. + * + * @since 3.0.0 + */ +public class OpUtils { + private static boolean from = false; + private static HashMap> map = null; + private static String pre = null; + + public OpUtils() { + + } + + public static void setFrom(boolean from) { + OpUtils.from = from; + } + + public static boolean getFrom() { + return from; + } + + public static void setPre(String pre) { + OpUtils.pre = pre; + } + + public static String getPre() { + return pre; + } + + public static void setMap(HashMap> map) { + OpUtils.map = map; + } + + public static HashMap> getMap() { + return map; + } +} diff --git a/code/datastudio/src/org.opengauss.mppdbide.presentation/src/org/opengauss/mppdbide/presentation/contentassistprocesser/ContentAssistProcesserCore.java b/code/datastudio/src/org.opengauss.mppdbide.presentation/src/org/opengauss/mppdbide/presentation/contentassistprocesser/ContentAssistProcesserCore.java index 089a08a0c89f23e571df0a756f96518ff4849791..8ce150e99ad3d4266071596ad1dab5b40bb76b7c 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.presentation/src/org/opengauss/mppdbide/presentation/contentassistprocesser/ContentAssistProcesserCore.java +++ b/code/datastudio/src/org.opengauss.mppdbide.presentation/src/org/opengauss/mppdbide/presentation/contentassistprocesser/ContentAssistProcesserCore.java @@ -39,6 +39,7 @@ public class ContentAssistProcesserCore { private String[] currentPrefix = new String[0]; private int replaceLength = 0; private ContentAssistProcesserData contentData; + private static final String SEMICOLON = ";"; /** * Instantiates a new content assist processer core. @@ -68,6 +69,9 @@ public class ContentAssistProcesserCore { // Mark the object items for lazy loading of schema. setCurrentPrefix(unQuotedPrefix); + if (fullPretext.endsWith(SEMICOLON)) { + return autoMap; + } if ((prefixLen != 0 && isEndsWithDot) || (prefixLen != 0 && contentData.isInsert() && (fullPretext.endsWith("(") || fullPretext.endsWith(",")))) { autoMap = contentData.findExactMatchingObjects(unQuotedPrefix); diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLContentAssistAliasProcessor.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLContentAssistAliasProcessor.java index 8810eddc16c9096e721e5f56c368b5fdc12f2706..d0039a7d48779fb2dc4df7a85587a85077722387 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLContentAssistAliasProcessor.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLContentAssistAliasProcessor.java @@ -29,6 +29,7 @@ import org.opengauss.mppdbide.bl.queryparser.ParseContext; import org.opengauss.mppdbide.bl.serverdatacache.Alias; import org.opengauss.mppdbide.bl.serverdatacache.OBJECTTYPE; import org.opengauss.mppdbide.bl.serverdatacache.ServerObject; +import org.opengauss.mppdbide.bl.util.OpUtils; import org.opengauss.mppdbide.presentation.contentassistprocesser.ContentAssistProcesserCore; import org.opengauss.mppdbide.utils.CustomStringUtility; import org.opengauss.mppdbide.utils.JSQLParserUtils; @@ -94,6 +95,7 @@ public class SQLContentAssistAliasProcessor { aliasToTableNameMap = parseAndGetAliasMap(fullContent, isPrefixEndsWithDot); + OpUtils.setMap(aliasToTableNameMap); if (null != aliasToTableNameMap && aliasToTableNameMap.size() > 0) { /* * Assumption: There will only be 2 parts in the prefix Replace diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLContentAssistProcessor.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLContentAssistProcessor.java index 219077ccf18123a5c05d0fbc0b4089d7cf84661b..1b3d248c8b153f7b7d50babc01ddd9458f8fc598 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLContentAssistProcessor.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/core/sourceeditor/SQLContentAssistProcessor.java @@ -42,6 +42,7 @@ import org.opengauss.mppdbide.bl.serverdatacache.OBJECTTYPE; import org.opengauss.mppdbide.bl.serverdatacache.ServerObject; import org.opengauss.mppdbide.bl.util.ExecTimer; import org.opengauss.mppdbide.bl.util.IExecTimer; +import org.opengauss.mppdbide.bl.util.OpUtils; import org.opengauss.mppdbide.presentation.contentassistprocesser.ContentAssistProcesserCore; import org.opengauss.mppdbide.utils.IMessagesConstants; import org.opengauss.mppdbide.utils.MPPDBIDEConstants; @@ -79,6 +80,7 @@ public class SQLContentAssistProcessor implements IContentAssistProcessor { private LinkedHashMap autoMap = null; private static LinkedHashMap map = null; private static boolean lookupTemplates = false; + private static final String ISFROM = "from"; /** * Instantiates a new SQL content assist processor. @@ -139,6 +141,9 @@ public class SQLContentAssistProcessor implements IContentAssistProcessor { if (validateFullText(fullContent)) { fullPretext = fullContent.substring(0, offset); prefix = core.findString(fullPretext, DatabaseUtils.getCharacterList(database)); + if (fullPretext.contains(ISFROM)) { + OpUtils.setFrom(true); + } if (canCheckForAlias(viewer)) { assistant.enableAutoInsert(true); assistant.setShowEmptyList(true); @@ -147,6 +152,7 @@ public class SQLContentAssistProcessor implements IContentAssistProcessor { boolean isSuccess = aliasProcessor.computeAliasProposal(core); if (isSuccess) { + OpUtils.setPre(prefix); prefix = aliasProcessor.getProcessedPrefix(); aliasMap = aliasProcessor.getComputedAliasMap(); }