diff --git a/erts/emulator/beam/erl_db.c b/erts/emulator/beam/erl_db.c
index 9ce88c35d6a2..392a4b901c0c 100644
--- a/erts/emulator/beam/erl_db.c
+++ b/erts/emulator/beam/erl_db.c
@@ -1682,17 +1682,18 @@ static void* ets_insert_2_list_copy_term_list(DbTableMethod* meth,
{
void* db_term_list = NULL;
void *term;
+ void *last_term;
Eterm lst;
for (lst = list; is_list(lst); lst = CDR(list_val(lst))) {
term = meth->db_eterm_to_dbterm(compress,
keypos,
CAR(list_val(lst)));
if (db_term_list != NULL) {
- db_term_list =
- meth->db_dbterm_list_prepend(db_term_list,
- term);
+ last_term =
+ meth->db_dbterm_list_append(last_term, term);
} else {
db_term_list = term;
+ last_term = term;
}
}
diff --git a/erts/emulator/beam/erl_db_catree.c b/erts/emulator/beam/erl_db_catree.c
index 3dd8c0b60905..035aaaa3dae7 100644
--- a/erts/emulator/beam/erl_db_catree.c
+++ b/erts/emulator/beam/erl_db_catree.c
@@ -220,7 +220,7 @@ DbTableMethod db_catree =
db_lookup_dbterm_catree,
db_finalize_dbterm_catree,
db_eterm_to_dbterm_tree_common,
- db_dbterm_list_prepend_tree_common,
+ db_dbterm_list_append_tree_common,
db_dbterm_list_remove_first_tree_common,
db_put_dbterm_catree,
db_free_dbterm_tree_common,
diff --git a/erts/emulator/beam/erl_db_hash.c b/erts/emulator/beam/erl_db_hash.c
index 7178d7dc84a0..89d82cc436e7 100644
--- a/erts/emulator/beam/erl_db_hash.c
+++ b/erts/emulator/beam/erl_db_hash.c
@@ -726,7 +726,7 @@ db_lookup_dbterm_hash(Process *p, DbTable *tbl, Eterm key, Eterm obj,
static void
db_finalize_dbterm_hash(int cret, DbUpdateHandle* handle);
static void* db_eterm_to_dbterm_hash(int compress, int keypos, Eterm obj);
-static void* db_dbterm_list_prepend_hash(void* list, void* db_term);
+static void* db_dbterm_list_append_hash(void* last_term, void* db_term);
static void* db_dbterm_list_remove_first_hash(void** list);
static int db_put_dbterm_hash(DbTable* tb,
void* obj,
@@ -866,7 +866,7 @@ DbTableMethod db_hash =
db_lookup_dbterm_hash,
db_finalize_dbterm_hash,
db_eterm_to_dbterm_hash,
- db_dbterm_list_prepend_hash,
+ db_dbterm_list_append_hash,
db_dbterm_list_remove_first_hash,
db_put_dbterm_hash,
db_free_dbterm_hash,
@@ -4170,11 +4170,11 @@ static void* db_eterm_to_dbterm_hash(int compress, int keypos, Eterm obj)
return term;
}
-static void* db_dbterm_list_prepend_hash(void* list, void* db_term)
+static void* db_dbterm_list_append_hash(void* last_term, void* db_term)
{
- HashDbTerm* l = list;
+ HashDbTerm* l = last_term;
HashDbTerm* t = db_term;
- t->next = l;
+ l->next = t;
return t;
}
diff --git a/erts/emulator/beam/erl_db_tree.c b/erts/emulator/beam/erl_db_tree.c
index 23b28e47f8b8..e96c35e9ef10 100644
--- a/erts/emulator/beam/erl_db_tree.c
+++ b/erts/emulator/beam/erl_db_tree.c
@@ -519,7 +519,7 @@ DbTableMethod db_tree =
db_lookup_dbterm_tree,
db_finalize_dbterm_tree,
db_eterm_to_dbterm_tree_common,
- db_dbterm_list_prepend_tree_common,
+ db_dbterm_list_append_tree_common,
db_dbterm_list_remove_first_tree_common,
db_put_dbterm_tree,
db_free_dbterm_tree_common,
@@ -3533,11 +3533,11 @@ void* db_eterm_to_dbterm_tree_common(int compress, int keypos, Eterm obj)
return term;
}
-void* db_dbterm_list_prepend_tree_common(void *list, void *db_term)
+void* db_dbterm_list_append_tree_common(void *last_term, void *db_term)
{
- TreeDbTerm* l = list;
+ TreeDbTerm* l = last_term;
TreeDbTerm* t = db_term;
- t->left = l;
+ l->left = t;
return t;
}
diff --git a/erts/emulator/beam/erl_db_tree_util.h b/erts/emulator/beam/erl_db_tree_util.h
index 75c82003b2e4..7592efb2b86b 100644
--- a/erts/emulator/beam/erl_db_tree_util.h
+++ b/erts/emulator/beam/erl_db_tree_util.h
@@ -172,7 +172,7 @@ void db_finalize_dbterm_tree_common(int cret,
TreeDbTerm **root,
DbTableTree *stack_container);
void* db_eterm_to_dbterm_tree_common(int compress, int keypos, Eterm obj);
-void* db_dbterm_list_prepend_tree_common(void* list, void* db_term);
+void* db_dbterm_list_append_tree_common(void* last_term, void* db_term);
void* db_dbterm_list_remove_first_tree_common(void **list);
int db_put_dbterm_tree_common(DbTableCommon *tb, TreeDbTerm **root, TreeDbTerm *value_to_insert,
int key_clash_fail, DbTableTree *stack_container);
diff --git a/erts/emulator/beam/erl_db_util.h b/erts/emulator/beam/erl_db_util.h
index 11f1be017e7f..1d8261b4ca69 100644
--- a/erts/emulator/beam/erl_db_util.h
+++ b/erts/emulator/beam/erl_db_util.h
@@ -237,7 +237,7 @@ typedef struct db_table_method
** not DB_ERROR_NONE, the object is removed from the table. */
void (*db_finalize_dbterm)(int cret, DbUpdateHandle* handle);
void* (*db_eterm_to_dbterm)(int compress, int keypos, Eterm obj);
- void* (*db_dbterm_list_prepend)(void* list, void* db_term);
+ void* (*db_dbterm_list_append)(void* last_term, void* db_term);
void* (*db_dbterm_list_remove_first)(void** list);
int (*db_put_dbterm)(DbTable* tb, /* [in out] */
void* obj,
diff --git a/lib/stdlib/doc/src/ets.xml b/lib/stdlib/doc/src/ets.xml
index 507d27d8d6a9..65b4ac76e65d 100644
--- a/lib/stdlib/doc/src/ets.xml
+++ b/lib/stdlib/doc/src/ets.xml
@@ -48,7 +48,26 @@
A
+ Insert and lookup times in tables of type
+ For tables of type
+ The
@@ -814,6 +833,12 @@ Error: fun containing local Erlang function calls inserted object compares equal to the key of any object in the table, the old object is replaced.
+
+ If the table type is
If the list contains more than one object with
matching keys and the table type is
The entire operation is guaranteed to be
+ For
+ For
+ For
Notice that the time order of object insertions is preserved; +
Notice that the sequential order of object insertions is preserved; the first object inserted with the specified key is the first - in the resulting list, and so on.
-Insert and lookup times in tables of type